0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

VHDL和Verilog中數(shù)組定義、初始化、賦值方法

FPGA設(shè)計(jì)論壇 ? 來源:FPGA設(shè)計(jì)論壇 ? 作者:FPGA設(shè)計(jì)論壇 ? 2022-09-23 14:20 ? 次閱讀

VHDL和Verilog數(shù)組的定義、初始化、賦值的方法不只一種,以下是本人常用的方法,可能不是最方便的,但是比較好理解,文中包含了源代碼和modelsim仿真,供大家參考學(xué)習(xí)。

1. VHDL數(shù)組定義、初始化、賦值

1)VHDL數(shù)組定義方法:通過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ù)位過程中對(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,位寬)

將無符號(hào)的無符號(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,位寬)

將無符號(hào)的無符號(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,位寬)

將無符號(hào)的無符號(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é)果

19cb6500-3b04-11ed-9e49-dac502259ad0.png

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ù)位過程中對(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é)果

1a079606-3b04-11ed-9e49-dac502259ad0.png

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    29

    文章

    1366

    瀏覽量

    111898
  • vhdl
    +關(guān)注

    關(guān)注

    30

    文章

    819

    瀏覽量

    129591
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    419

    瀏覽量

    26388

原文標(biāo)題:FPGA學(xué)習(xí)-VHDL和Verilog中數(shù)組定義、初始化、賦值方法

文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32CubeMX用于STM32配置和初始化C代碼生成

    電子發(fā)燒友網(wǎng)站提供《STM32CubeMX用于STM32配置和初始化C代碼生成.pdf》資料免費(fèi)下載
    發(fā)表于 02-26 17:32 ?658次下載

    淺談VerilogVHDL的區(qū)別

    VerilogVHDL是兩種廣泛使用的硬件描述語(yǔ)言(HDL),它們用于描述和模擬數(shù)字電路系統(tǒng)的行為和結(jié)構(gòu)。這兩種語(yǔ)言的主要作用是幫助工程師設(shè)計(jì)、仿真和驗(yàn)證集成電路(IC)和系統(tǒng)級(jí)芯片(SoC)的硬件模塊。
    的頭像 發(fā)表于 02-17 14:20 ?1252次閱讀
    淺談<b class='flag-5'>Verilog</b>和<b class='flag-5'>VHDL</b>的區(qū)別

    EE-359:ADSP-CM40x啟動(dòng)時(shí)間優(yōu)化和器件初始化

    電子發(fā)燒友網(wǎng)站提供《EE-359:ADSP-CM40x啟動(dòng)時(shí)間優(yōu)化和器件初始化.pdf》資料免費(fèi)下載
    發(fā)表于 01-13 16:33 ?0次下載
    EE-359:ADSP-CM40x啟動(dòng)時(shí)間優(yōu)化和器件<b class='flag-5'>初始化</b>

    EE-88:使用21xx編譯器在C初始化變量

    電子發(fā)燒友網(wǎng)站提供《EE-88:使用21xx編譯器在C初始化變量.pdf》資料免費(fèi)下載
    發(fā)表于 01-13 15:54 ?0次下載
    EE-88:使用21xx編譯器在C<b class='flag-5'>中</b><b class='flag-5'>初始化</b>變量

    OMAP5912多媒體處理器初始化參考指南

    電子發(fā)燒友網(wǎng)站提供《OMAP5912多媒體處理器初始化參考指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-17 16:20 ?0次下載
    OMAP5912多媒體處理器<b class='flag-5'>初始化</b>參考指南

    VerilogVHDL的比較 Verilog HDL編程技巧

    VerilogVHDL 比較 1. 語(yǔ)法和風(fēng)格 VerilogVerilog 的語(yǔ)法更接近于 C 語(yǔ)言,對(duì)于有 C 語(yǔ)言背景的工程師來說,學(xué)習(xí)曲線較平緩。它支持結(jié)構(gòu)
    的頭像 發(fā)表于 12-17 09:44 ?1496次閱讀

    STM32F407 MCU使用SD NAND?不斷電初始化失效解決方案

    STM32F407微控制器單元(MCU)與SD NAND的結(jié)合提供了強(qiáng)大的存儲(chǔ)解決方案。然而,不斷電初始化失效問題可能會(huì)導(dǎo)致系統(tǒng)穩(wěn)定性和數(shù)據(jù)完整性受損。我們將STM32F407與SD NAND集成時(shí)可能遇到的初始化問題,并提供專業(yè)的解決方案。
    的頭像 發(fā)表于 12-11 10:51 ?842次閱讀
    STM32F407 MCU使用SD NAND?不斷電<b class='flag-5'>初始化</b>失效解決方案

    segger編譯器初始化問題

    的圖; 2.第二張圖是該變量在文件的所有操作,第一行是初始化,該行代碼在初始化部分最后一個(gè),執(zhí)行完就是主循環(huán)了; 3.第2,3行也是對(duì)變量的賦值,在主循環(huán)中; 4.第4行已注釋; 5
    發(fā)表于 12-09 18:06

    數(shù)組名之間可以直接賦值

    數(shù)組之間的賦值能不能直接使用等于號(hào)?比如這樣的代碼。 int main(){ int a[5] = {1, 2, 3, 4, 5}; int b[5] = {0}; b = a
    的頭像 發(fā)表于 11-26 11:23 ?525次閱讀

    基于旋轉(zhuǎn)平移解耦框架的視覺慣性初始化方法

    精確和魯棒的初始化對(duì)于視覺慣性里程計(jì)(VIO)至關(guān)重要,因?yàn)椴涣嫉?b class='flag-5'>初始化會(huì)嚴(yán)重降低姿態(tài)精度。
    的頭像 發(fā)表于 11-01 10:16 ?872次閱讀
    基于旋轉(zhuǎn)平移解耦框架的視覺慣性<b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    TMS320C6000 McBSP初始化

    電子發(fā)燒友網(wǎng)站提供《TMS320C6000 McBSP初始化.pdf》資料免費(fèi)下載
    發(fā)表于 10-26 10:10 ?0次下載
    TMS320C6000 McBSP<b class='flag-5'>初始化</b>

    視頻引擎初始化失敗怎么回事

    視頻引擎初始化失敗是一個(gè)常見的技術(shù)問題,它可能由多種原因引起,包括軟件沖突、硬件問題、驅(qū)動(dòng)程序問題、系統(tǒng)設(shè)置錯(cuò)誤等。要解決這個(gè)問題,需要對(duì)可能的原因進(jìn)行詳細(xì)的分析和診斷。 1. 軟件沖突 1.1
    的頭像 發(fā)表于 09-18 18:18 ?2617次閱讀

    如何避免自動(dòng)初始化組件被截?cái)嗟那闆r?

    大小const數(shù)組用來占用這個(gè)區(qū)域,避免鏈接時(shí)將執(zhí)行代碼鏈接到此區(qū)域。 但編譯的時(shí)候,鏈接腳本會(huì)把合適大小的執(zhí)行代碼填補(bǔ)0x08000000 ~ 0x08003FFF 區(qū)域,導(dǎo)致鏈接時(shí)把自動(dòng)初始化組件給截?cái)嗔恕?請(qǐng)教各位大神,有沒有解決
    發(fā)表于 09-13 08:06

    Keil變量不被初始化方法

    有些時(shí)候在我們的應(yīng)用過程要求變量有連續(xù)性,或者現(xiàn)場(chǎng)保留,例如Bootloader跳轉(zhuǎn),某種原因的復(fù)位過程我們有些關(guān)鍵變量不能被初始化,在不同的編譯環(huán)境下有不同的設(shè)置,本文就這個(gè)操作做總結(jié),分別
    的頭像 發(fā)表于 08-30 11:47 ?1335次閱讀
    Keil<b class='flag-5'>中</b>變量不被<b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    瀚海微SD NAND應(yīng)用之SD協(xié)議存儲(chǔ)功能描述2 初始化命令

    初始化和識(shí)別過程: 總線激活后,主機(jī)啟動(dòng)卡初始化和識(shí)別過程。 初始化過程從SD SEND OP COND (ACMD41)開始,通過設(shè)置其操作條件和OCR的HCS位。HCS (Ho
    的頭像 發(fā)表于 07-22 10:54 ?676次閱讀
    瀚海微SD NAND應(yīng)用之SD協(xié)議存儲(chǔ)功能描述2 <b class='flag-5'>初始化</b>命令

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品