0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(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)語句有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ù)組賦值

賦值語句分信號(hào)賦值語句和變量賦值語句兩種。每一種都有下面三個(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)語句有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)注

    28

    文章

    1333

    瀏覽量

    109713
  • vhdl
    +關(guān)注

    關(guān)注

    30

    文章

    816

    瀏覽量

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

    關(guān)注

    1

    文章

    411

    瀏覽量

    25821

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何避免自動(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 ?195次閱讀
    Keil<b class='flag-5'>中</b>變量不被<b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    在一個(gè).c文件定義一個(gè)數(shù)組遇到的疑問求解

    的時(shí)候沒有指定數(shù)組的大小,只是做了初始化,而且這個(gè)初始化可以看到,而且自己可以定義初始化的值,并且初始化
    發(fā)表于 05-14 07:03

    深入探索KUKA KRL數(shù)組應(yīng)用

    如果 CHAR 類型數(shù)組的所有數(shù)組元素都擁有相同的字符串,則不必單獨(dú)初始化每個(gè)數(shù)組元素。忽略右側(cè)的數(shù)組下標(biāo)。(對(duì)于一維
    的頭像 發(fā)表于 04-18 10:37 ?873次閱讀
    深入探索KUKA KRL<b class='flag-5'>中</b>的<b class='flag-5'>數(shù)組</b>應(yīng)用

    verilog同步和異步的區(qū)別 verilog阻塞賦值和非阻塞賦值的區(qū)別

    Verilog是一種硬件描述語言,用于設(shè)計(jì)和模擬數(shù)字電路。在Verilog,同步和異步是用來描述數(shù)據(jù)傳輸和信號(hào)處理的兩種不同方式,而阻塞賦值和非阻塞
    的頭像 發(fā)表于 02-22 15:33 ?1178次閱讀

    MCU單片機(jī)GPIO初始化該按什么順序配置?為什么初始化時(shí)有電平跳變?

    GPIO初始化時(shí)有時(shí)鐘配置、模式配置、輸出配置、復(fù)用配置,那么在編寫初始化代碼時(shí),到底該按什么順序執(zhí)行呢?如果順序不當(dāng)那初始化過程可能會(huì)出現(xiàn)短暫的電平跳變。
    的頭像 發(fā)表于 02-22 11:07 ?1168次閱讀
    MCU單片機(jī)GPIO<b class='flag-5'>初始化</b>該按什么順序配置?為什么<b class='flag-5'>初始化</b>時(shí)有電平跳變?

    labview運(yùn)行后如何初始化

    LabVIEW是一款強(qiáng)大的圖形編程軟件,在運(yùn)行之前通常需要進(jìn)行一些初始化操作。本文將詳細(xì)介紹LabVIEW運(yùn)行前的初始化過程,并提供了一些常用的初始化
    的頭像 發(fā)表于 12-28 17:24 ?2065次閱讀

    自動(dòng)初始化機(jī)制原理詳解

    自動(dòng)初始化機(jī)制是指初始化函數(shù)不需要被顯式調(diào)用,只需要在函數(shù)定義處通過宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)啟動(dòng)過程中被執(zhí)行。這篇文章就來探索一下其中的奧秘, 簡(jiǎn)單理解其原理!
    的頭像 發(fā)表于 12-16 09:33 ?825次閱讀
    自動(dòng)<b class='flag-5'>初始化</b>機(jī)制原理詳解

    C語言編程時(shí),各種類型的變量該如何初始化?

    不同的方式。 1. 聲明和賦值分開初始化: 這種方式將變量的聲明與賦值分開,在聲明時(shí)分配內(nèi)存空間,再在后續(xù)代碼中進(jìn)行賦值。 ```c int number; // 聲明時(shí)分配了內(nèi)存空間
    的頭像 發(fā)表于 12-07 13:53 ?936次閱讀

    oracle sql 定義變量并賦值

    賦值可以通過使用PL/SQL語句塊或使用SQL*Plus工具來實(shí)現(xiàn)。下面將詳細(xì)介紹這兩種方法以及它們的具體用法。 使用PL/SQL語句塊定義賦值變量: 在Oracle SQL
    的頭像 發(fā)表于 12-06 10:46 ?2056次閱讀

    C語言中的數(shù)組格式與初始化

    多少存儲(chǔ)空間。 數(shù)組格式與初始化 ????格式: ? 元素類型 數(shù)組名[元素個(gè)數(shù)]; ? ?????比如: ? int[3]; ? ????數(shù)組元素有順序之分,每個(gè)元素都有一個(gè)唯一的下
    的頭像 發(fā)表于 11-26 16:12 ?663次閱讀
    C語言中的<b class='flag-5'>數(shù)組</b>格式與<b class='flag-5'>初始化</b>

    實(shí)戰(zhàn)經(jīng)驗(yàn) | Keil、IAR、CubeIDE 變量不被初始化方法

    關(guān)鍵詞:不被初始化,編譯環(huán)境 目錄預(yù)覽 1、前言 2、IAR 實(shí)現(xiàn)變量不初始化方法 3、Keil 實(shí)現(xiàn)變量不被初始化方法 4、CubeIDE
    的頭像 發(fā)表于 11-24 18:05 ?3020次閱讀

    Shell腳本程序開發(fā)-數(shù)組(四)

    數(shù)組可以存放多個(gè)值。Bash Shell 只支持一維數(shù)組(不支持多維數(shù)組),初始化時(shí)不需要定義
    的頭像 發(fā)表于 10-22 17:50 ?430次閱讀
    Shell腳本程序開發(fā)-<b class='flag-5'>數(shù)組</b>(四)

    SD卡初始化及讀取程序

    電子發(fā)燒友網(wǎng)站提供《SD卡初始化及讀取程序.pdf》資料免費(fèi)下載
    發(fā)表于 10-13 09:50 ?2次下載
    SD卡<b class='flag-5'>初始化</b>及讀取程序

    數(shù)組定義 什么是數(shù)組

    數(shù)組 數(shù)組是內(nèi)置類型,是一組同類型數(shù)據(jù)的集合,它是值類型,通過從0開始的下標(biāo)索引訪問元素值。 在初始化后長度是固定的,無法修改其長度。當(dāng)作為方法的參數(shù)傳入時(shí)將復(fù)制一份
    的頭像 發(fā)表于 10-09 09:39 ?1714次閱讀