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