在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

FPGA設計論壇 ? 來源:FPGA設計論壇 ? 作者:FPGA設計論壇 ? 2022-09-23 14:20 ? 次閱讀

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

1. VHDL數組定義、初始化、賦值

1)VHDL數組定義方法:通過TYPE定義個matri_index的數組,數組包含50個數據,數據位數為16;申明了receive_data和send_data兩個matri_index的數據。

--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數組初始方法:實際應用里,通常需要在上電復位過程中對變量進行初始化,如果數組個數少時,直接賦初始值即可,但是數組個數多時,可以用循環實現賦值,通常的循環語句有FOR LOOP和WHILE LOOP。

(注意變量i申明的位置,需要在process內部,注意變量的賦值方式)

process(clk,reset_n)

--循環變量定義并初始化

variable i: integer := 0;

begin

if (reset_n = ‘0’)then

i := 0;

--利用while loop循環賦值

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,位寬)

將無符號的無符號整數轉換為std_logic_vector

--CONV_INTEGER(A)

將std_logic_vector轉換為整數

--直接賦值方式

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數組賦值

賦值語句分信號賦值語句和變量賦值語句兩種。每一種都有下面三個基本組成部分:賦值目標:是所賦值的受體,它的基本元素只能是信號或變量。

賦值符號:是賦值符號只有兩種。一種是信號賦值符號”《=”;另一種是變量賦值符號”:=”。賦值源:賦值源是賦值的主體,它可以是一個數值,也可以是一個邏輯或運算表達式。

可以直接賦值,如果變量為矢量時,需要將矢量轉為整型。(不管三七二十一,建議程序中增加以下包,否則類型轉換用不了)

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,位寬)

將無符號的無符號整數轉換為std_logic_vector--CONV_INTEGER(A)

將std_logic_vector轉換為整數 --直接賦值方式

send_cnt《= X“02”;send_data(0) 《= X“0000”;send_data(1) 《= X“0000”; send_data(CONV_INTEGER(send_cnt)) 《= X“0000”;

4)VHDL數組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)

--循環變量定義并初始化

variable i: integer := 0;

begin

if (reset_n = ‘0’)then

i := 0;

--利用while loop循環賦值

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,位寬)

將無符號的無符號整數轉換為std_logic_vector

--CONV_INTEGER(A)

將std_logic_vector轉換為整數

--直接賦值方式

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 仿真結果

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

2. Verilog數組定義、初始化、賦值

1)Verilog數組定義方法:reg[n-1 : 0]

定義了存儲器中每個寄存器單元的大小,即存儲單元是一個n位的寄存器;存儲器后面的[m-1 : 0]則定義了該存儲器中有多少個這樣的寄存器。

reg[n-1 : 0] 存儲器名 [m-1 : 0];或者 reg[n : 1] 存儲器名 [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數組初始方法:實際應用里,通常需要在上電復位過程中對變量進行初始化,如果數組個數少時,直接賦初始值即可,但是數組個數多時,可以用循環實現賦值,通常的循環語句有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;

//不需要類型轉換endend

3)Verilog數組賦值不像VHDL那樣,可以直接賦值。

//直接賦值方式send_cnt 《= 8’h02;send_data[0] 《= 16‘h0000;send_data[1] 《= 16’h0000;send_data[send_cnt] 《=16‘h0000;

//不需要類型轉換

4)Verilog數組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;

//不需要類型轉換endendendmodule

5)modelsim仿真結果

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

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110187
  • vhdl
    +關注

    關注

    30

    文章

    817

    瀏覽量

    128205
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    25988

原文標題:FPGA學習-VHDL和Verilog中數組定義、初始化、賦值方法

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

    VerilogVHDL的比較 Verilog HDL編程技巧

    VerilogVHDL 比較 1. 語法和風格 VerilogVerilog 的語法更接近于 C 語言,對于有 C 語言背景的工程師來說,學習曲線較平緩。它支持結構
    的頭像 發表于 12-17 09:44 ?243次閱讀

    segger編譯器初始化問題

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

    數組名之間可以直接賦值

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

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

    精確和魯棒的初始化對于視覺慣性里程計(VIO)至關重要,因為不良的初始化會嚴重降低姿態精度。
    的頭像 發表于 11-01 10:16 ?391次閱讀
    基于旋轉平移解耦框架的視覺慣性<b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    TMS320C6000 McBSP初始化

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

    如何避免自動初始化組件被截斷的情況?

    大小const數組用來占用這個區域,避免鏈接時將執行代碼鏈接到此區域。 但編譯的時候,鏈接腳本會把合適大小的執行代碼填補0x08000000 ~ 0x08003FFF 區域,導致鏈接時把自動初始化組件給截斷了。 請教各位大神,有沒有解決
    發表于 09-13 08:06

    Keil變量不被初始化方法

    有些時候在我們的應用過程要求變量有連續性,或者現場保留,例如Bootloader跳轉,某種原因的復位過程我們有些關鍵變量不能被初始化,在不同的編譯環境下有不同的設置,本文就這個操作做總結,分別
    的頭像 發表于 08-30 11:47 ?756次閱讀
    Keil<b class='flag-5'>中</b>變量不被<b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    在一個.c文件定義一個數組遇到的疑問求解

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

    在一個while的循環里面,怎么樣可以通過控件去讓其中的數組值全部初始化

    這種方式是讓所有的數據都初始化了,我只需要部分數據初始化,就是所有的數組,大佬們求幫助!
    發表于 04-18 21:19

    深入探索KUKA KRL數組應用

    如果 CHAR 類型數組的所有數組元素都擁有相同的字符串,則不必單獨初始化每個數組元素。忽略右側的數組下標。(對于一維
    的頭像 發表于 04-18 10:37 ?1298次閱讀
    深入探索KUKA KRL<b class='flag-5'>中</b>的<b class='flag-5'>數組</b>應用

    STM32F103RC變量初始化問題求解

    Test0變量的值一直是0x03,并且無法被初始化其他值。 例如:ArryTest[7]的地址為0x20000200,Test0 的地址為0x2000020e,則Test0 的值無法被修改,一直為0x03. 有哪位朋友遇到過這樣的問題沒有?
    發表于 04-10 07:35

    字符型、指針型等變量等該如何初始化

     對于數值類型的變量往往初始化為0,但對于其他類型的變量,如字符型、指針型等變量等該如何初始化呢?
    的頭像 發表于 03-18 11:02 ?1565次閱讀

    verilog同步和異步的區別 verilog阻塞賦值和非阻塞賦值的區別

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

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

    GPIO初始化時有時鐘配置、模式配置、輸出配置、復用配置,那么在編寫初始化代碼時,到底該按什么順序執行呢?如果順序不當那初始化過程可能會出現短暫的電平跳變。
    的頭像 發表于 02-22 11:07 ?1607次閱讀
    MCU單片機GPIO<b class='flag-5'>初始化</b>該按什么順序配置?為什么<b class='flag-5'>初始化</b>時有電平跳變?
    主站蜘蛛池模板: 亚洲天堂资源网| 国产色婷婷亚洲| 一级片成人| 在线观看亚洲成人| 日本黄色xxxx| 免费高清特黄a 大片| 成人狠狠色综合| 97影院理论| 第三级视频在线观看| a级毛毛片看久久| 天堂最新版中文网| 国产精品福利一区| 91在线视频观看| 很黄很黄叫声床戏免费视频| 一级毛片免费在线观看网站| 天天做人人爱夜夜爽2020| 日本一区三区二区三区四区| 天天躁日日躁成人字幕aⅴ| 四虎影院最新地址| 天堂看动漫| 欧美一级欧美三级| 色色色色色色色色色色色色| 日本人的色道免费网站| 好看的一级毛片| 午夜在线网站| 国产精品9999| 人人射人人爽| 特黄色片| 韩国在线a免费观看网站| 老司机午夜网站| 操女网站| 亚洲福利视频网址| 国产免费的野战视频| 亚洲天堂二区| 午夜激情网站| 精品视频免费看| 国产国语videosex另类| 天堂网www在线资源链接| 欧美操穴| 亚洲国产成人va在线观看| 天堂中文在线网|