VHDL和Verilog數(shù)組的定義、初始化、賦值的方法不只一種,以下是本人常用的方法,可能不是最方便的,但是比較好理解,文中包含了源代碼和modelsim仿真,供大家參考學(xué)習(xí)。
1. VHDL數(shù)組定義、初始化、賦值
1)VHDL數(shù)組定義方法:通過(guò)TYPE定義個(gè)matri_index的數(shù)組,數(shù)組包含50個(gè)數(shù)據(jù),數(shù)據(jù)位數(shù)為16;申明了receive_data和send_data兩個(gè)matri_index的數(shù)據(jù)。
--define a 16 bit array
constant
matrix_num:
integer := 49; TYPE
matrix_index is array (matrix_num downto 0) of std_logic_vector(15 downto 0);signal
receive_data, send_data:
matrix_index;signal
send_cnt:
STD_LOGIC_VECTOR(7 downto 0);
2)VHDL數(shù)組初始方法:實(shí)際應(yīng)用里,通常需要在上電復(fù)位過(guò)程中對(duì)變量進(jìn)行初始化,如果數(shù)組個(gè)數(shù)少時(shí),直接賦初始值即可,但是數(shù)組個(gè)數(shù)多時(shí),可以用循環(huán)實(shí)現(xiàn)賦值,通常的循環(huán)語(yǔ)句有FOR LOOP和WHILE LOOP。
(注意變量i申明的位置,需要在process內(nèi)部,注意變量的賦值方式)
process(clk,reset_n)
--循環(huán)變量定義并初始化
variable i: integer := 0;
begin
if (reset_n = ‘0’)then
i := 0;
--利用while loop循環(huán)賦值
while(i《=matrix_num) loop
receive_data(i) 《=X“0000”;
i := i+1;
end loop;
elsif (rising_edge(clk)) then
--CONV_std_logic_vector(A,位寬)
將無(wú)符號(hào)的無(wú)符號(hào)整數(shù)轉(zhuǎn)換為std_logic_vector
--CONV_INTEGER(A)
將std_logic_vector轉(zhuǎn)換為整數(shù)
--直接賦值方式
send_cnt《= X“02”;
send_data(0) 《= X“0000”;
send_data(1) 《= X“0000”;
send_data(CONV_INTEGER(send_cnt)) 《= X“0000”;
end if;end process;
3)VHDL數(shù)組賦值
賦值語(yǔ)句分信號(hào)賦值語(yǔ)句和變量賦值語(yǔ)句兩種。每一種都有下面三個(gè)基本組成部分:賦值目標(biāo):是所賦值的受體,它的基本元素只能是信號(hào)或變量。
賦值符號(hào):是賦值符號(hào)只有兩種。一種是信號(hào)賦值符號(hào)”《=”;另一種是變量賦值符號(hào)”:=”。賦值源:賦值源是賦值的主體,它可以是一個(gè)數(shù)值,也可以是一個(gè)邏輯或運(yùn)算表達(dá)式。
可以直接賦值,如果變量為矢量時(shí),需要將矢量轉(zhuǎn)為整型。(不管三七二十一,建議程序中增加以下包,否則類型轉(zhuǎn)換用不了)
LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;--CONV_std_logic_vector(A,位寬)
將無(wú)符號(hào)的無(wú)符號(hào)整數(shù)轉(zhuǎn)換為std_logic_vector--CONV_INTEGER(A)
將std_logic_vector轉(zhuǎn)換為整數(shù) --直接賦值方式
send_cnt《= X“02”;send_data(0) 《= X“0000”;send_data(1) 《= X“0000”; send_data(CONV_INTEGER(send_cnt)) 《= X“0000”;
4)VHDL數(shù)組test代碼
LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all; --this is commentENTITY array_test IS PORT( reset_n
: IN STD_LOGIC;
clk
: IN STD_LOGIC );
END array_test; ARCHITECTURE behavioural OF array_test IS--define a 16 bit array
constant
matrix_num:
integer := 49; TYPE
matrix_index is array (matrix_num downto 0) of std_logic_vector(15 downto 0);signal
receive_data, send_data:
matrix_index;signal
send_cnt:
STD_LOGIC_VECTOR(7 downto 0);BEGIN process(clk,reset_n)
--循環(huán)變量定義并初始化
variable i: integer := 0;
begin
if (reset_n = ‘0’)then
i := 0;
--利用while loop循環(huán)賦值
while(i《=matrix_num) loop
receive_data(i) 《=X“0000”;
i := i+1;
end loop;
elsif (rising_edge(clk)) then
--CONV_std_logic_vector(A,位寬)
將無(wú)符號(hào)的無(wú)符號(hào)整數(shù)轉(zhuǎn)換為std_logic_vector
--CONV_INTEGER(A)
將std_logic_vector轉(zhuǎn)換為整數(shù)
--直接賦值方式
send_cnt《= X“02”;
send_data(0) 《= X“0000”;
send_data(1) 《= X“0000”;
send_data(CONV_INTEGER(send_cnt)) 《= X“0000”;
end if;end process; END behavioural;
5)modesim 仿真結(jié)果
2. Verilog數(shù)組定義、初始化、賦值
1)Verilog數(shù)組定義方法:reg[n-1 : 0]
定義了存儲(chǔ)器中每個(gè)寄存器單元的大小,即存儲(chǔ)單元是一個(gè)n位的寄存器;存儲(chǔ)器后面的[m-1 : 0]則定義了該存儲(chǔ)器中有多少個(gè)這樣的寄存器。
reg[n-1 : 0] 存儲(chǔ)器名 [m-1 : 0];或者 reg[n : 1] 存儲(chǔ)器名 [m : 1];
//define a 16 bit array parameter wordsize = 16, memsize = 49;reg [wordsize-1 : 0] send_data[memsize-1 : 0], receive_data[memsize-1 : 0];integer i = 0;reg [7:0] send_cnt
;2)Verilog數(shù)組初始方法:實(shí)際應(yīng)用里,通常需要在上電復(fù)位過(guò)程中對(duì)變量進(jìn)行初始化,如果數(shù)組個(gè)數(shù)少時(shí),直接賦初始值即可,但是數(shù)組個(gè)數(shù)多時(shí),可以用循環(huán)實(shí)現(xiàn)賦值,通常的循環(huán)語(yǔ)句有FOR和WHILE。
(注意變量的賦值方式)
always@(posedge clk, reset_n)beginif(!reset_n) beginwhile(i 《=memsize)beginreceive_data[i] 《= 16‘h0000;i = i+1;
//阻塞賦值endendelse begin
//直接賦值方式send_cnt 《= 8’h02;send_data[0] 《= 16‘h0000;send_data[1] 《= 16’h0000;send_data[send_cnt] 《=16‘h0000;
//不需要類型轉(zhuǎn)換endend
3)Verilog數(shù)組賦值不像VHDL那樣,可以直接賦值。
//直接賦值方式send_cnt 《= 8’h02;send_data[0] 《= 16‘h0000;send_data[1] 《= 16’h0000;send_data[send_cnt] 《=16‘h0000;
//不需要類型轉(zhuǎn)換
4)Verilog數(shù)組test代碼
module verilog_test(clk,reset_n);inputclk;inputreset_n; // /////define a 16 bit array parameter wordsize = 16,
memsize = 49;reg [wordsize-1 : 0] send_data[memsize-1 : 0],
receive_data[memsize-1 : 0];integer i = 0;reg [7:0] send_cnt; always@(posedge clk, reset_n)beginif(!reset_n) beginwhile(i 《=memsize)beginreceive_data[i] 《= 16’h0000;i = i+1;
//非阻塞賦值endendelse begin
//直接賦值方式send_cnt 《= 8‘h02;send_data[0] 《= 16’h0000;send_data[1] 《= 16‘h0000;send_data[send_cnt] 《=16’h0000;
//不需要類型轉(zhuǎn)換endendendmodule
5)modelsim仿真結(jié)果
審核編輯 :李倩
-
Verilog
+關(guān)注
關(guān)注
28文章
1339瀏覽量
109886 -
vhdl
+關(guān)注
關(guān)注
30文章
816瀏覽量
128025 -
數(shù)組
+關(guān)注
關(guān)注
1文章
412瀏覽量
25869
原文標(biāo)題:FPGA學(xué)習(xí)-VHDL和Verilog中數(shù)組定義、初始化、賦值方法
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論