verilog存储器赋值
Ⅰ 关于Verilog中的赋值问题
assign 语句后的赋值会生成组合逻辑,也就是从b到a会生成一条导线,将他们连接,b的值如果改变,a的值同时也会改变;
a<=b 这种赋值方式为“非阻塞赋值”,这种方式是等所在的begin....end块执行完毕后,才会把b的值赋给a,在这之前,a的值仍然保持原值。例如:
假设a中的值为十进制数 10,b为15,c为20;
begin
b=a; //b的值立即改变,现在b的值为10
c=b; //c的值立即改变,现在c的值为10
end
但是,以下例子又不同:
假设a中的值为十进制数 10,b为15,c为20
begin
b<=a; //b的值不立即改变,现在b的值仍为15
c<=b; //c的值不立即改变,现在c的值仍为20
end
begin块结束后,b被赋给a的值,b为10,c被赋给b的值,c为15。
发现了吗?实际上阻塞赋值生成了一个移位寄存器。
Ⅱ 在verilog中用系统任务给存储器赋值 是怎么实现的
系统任务可以把外部文件数据载入的存储器里
文件一行对应存储器一行
比如:
reg [ 7:0] TEST_MEM [15:0] ;//声明一个宽度8深度16的存储器
initial begin
$readmemh("H.txt",TEST_MEM);//以16进制方式读入H.txt文件
$readmemb("B.txt",TEST_MEM);//以2进制方式读入B.txt文件.
end
这个一般用来写测试代码,读入用户数据
网络文库搜这个,“北航泰斗夏宇闻老师经典力作 Verilog HDL 数字系统设计教程”,这个非常详细
Ⅲ Verilog赋值问题
1、【31:0】D,这样设置是为了简洁易懂,比如总线有32位,即D0~D31,这样就把它们一次性赋值,但是可以一位一位地取出来用,比如a=D[0].。
2、所说的always必须用reg意思是你里面有赋值语句的被赋值的变量必须为reg型的,而不是说在always语句里面出现的变量都要为reg型。比如我这里写reg b,wire a,然后在always语句里面有b=a,即当always里面的敏感变量变化时把a的值赋值给b,这里面只有b是reg型,a不是被赋值的变量,所以a可以不为reg型的。
reg型为寄存器型,always语句里面被赋值的变量它的值要是寄存型的,因为要保持,只有当always里面的敏感变量有变化时,被赋值的变量的值才会改变。
希望你懂,不懂再追问哈。
Ⅳ verilog中怎样对存储器类型赋值存储器类型可不可以综合
不可以综合
按一个一个单元(字)对存储器进行赋值;或者利用$readmemb系统函数
Ⅳ verilog中有哪几种类型的赋值语句,说明它们的区别,并举例
integer类型也是一种寄存器数据类型,integer类型的变量为有符号数,而reg类型的变量则为无符号数,除非特别声明为有符号数,还有就是integer的位宽为宿主机的字的位数,但最小为32位,用integer的变量都可以用reg定义,只是对于用于计数更方便而已。reg,integer,real,time都是寄存器数据类型,定义在Verilog中用来保存数值的变量,和实际的硬件电路中的寄存器有区别
今天看代码时遇到了integer,只知道这是个整数类型,可详细的内容却一窍不通,查看了资料---《verilog数字VLSI设计教程》。其中是这么写到的:
大多数的矢量类型(reg或者net)都被默认当做无符号数。integer和real是个例外,它们被默认为当做有符号数。通常,real类型是不可综合的。
假设在没有溢出的情况下,不管是无符号数还是有符号数,它们都是二进制的一串数值而已;而当这个值被当做某种类型比较时:又符号数的MSB被用来表示这个数字的符号,而无符号数的MSB则是位权最高的那一位。无论采用什么样的二进制格式,一个无符号数永远也不能成为负值。
Ⅵ verilog中如何将二维存储器转为一维的数组并赋值,求大神帮忙!
mole pixel_interpolation(
input wire clk,
input wire rst_n,
input wire ram_cs, // Active high
input wire ram_wr_en,
input wire [2:0] ram_addr,
input wire [5:0] ram_din,
output reg [5:0] ram_dout,
output reg [35:0] ram_bits
);
parameter val_0 = 6'h11;
parameter val_1 = 6'h12;
parameter val_2 = 6'h13;
parameter val_3 = 6'h24;
parameter val_4 = 6'h25;
parameter val_5 = 6'h26;
// generate the ram memory
reg [5:0] mem [0:5];
wire ram_wr_act = ram_cs & ram_wr_en & (ram_addr<3'd6);
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin // set initial values here according to your need
mem[0] <= val_0;
mem[1] <= val_1;
mem[2] <= val_2;
mem[3] <= val_3;
mem[4] <= val_4;
mem[5] <= val_5;
end
else if(ram_wr_act ) mem[ram_addr] <= ram_din;
end
wire ram_rd_act = ram_cs & ~ram_wr_en & (ram_addr<3'd6);
always @(posedge clk or negedge rst_n) begin
if(~rst_n) ram_dout <= 6'h0;
else if( ram_rd_act) ram_dout <= mem[ram_addr];
end
// generate the ram_bits
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin // set initial values here according to your need
ram_bits[5:0] <= val_0;
ram_bits[11:6] <= val_1;
ram_bits[17:12] <= val_2;
ram_bits[23:18] <= val_3;
ram_bits[29:24] <= val_4;
ram_bits[35:30] <= val_5;
end
else if(ram_wr_act ) begin
case(ram_addr)
3'd0 : ram_bits[5:0] <= ram_din;
3'd1 : ram_bits[11:6] <= ram_din;
3'd2 : ram_bits[17:12] <= ram_din;
3'd3 : ram_bits[23:18] <= ram_din;
3'd4 : ram_bits[29:24] <= ram_din;
3'd5 : ram_bits[35:30] <= ram_din;
endcase
end
end
Ⅶ 如何给Verilog中的数组初始化赋值
一般的综合如果不在意上电时的值,编译器会向着面积最小的方向综合,那样综合后信号的初始值是不确定的。
mole test(
input wire rst_n // Reset, Active Low
,input wire clk
//
// Add other inputs and outputs here
//
);
integer k;
parameter n = 10; // set the value of n here
reg signed [20:0] e[0:n-1];
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
for(k=0;k<n;k=k+1) e[k] <= 21'h0; // set initial value of matrix to all zero here
end
else begin
// change the value of e here normally
end
end
endmole