日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VHDL硬件描述语言

發布時間:2025/3/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VHDL硬件描述语言 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

VHDL硬件描述語言

  • author:hongjh
  • time:20211109
  • version: 0.1

文章目錄

  • VHDL硬件描述語言
    • 基本知識
    • 庫Library
    • 實體Entity
    • 結構體Architecture
    • 數據對象
      • 常量Constant
      • 變量Variable
      • 信號Signal
    • 數據類型
    • 信號運算
    • 并行語句
      • 進程語句-process
      • 參數傳遞語句-generic
      • 元件例化語句-component
        • 元件聲明格式
        • 元件例化格式
      • 生成語句-generate
        • for...generate
        • if...generate
      • 塊語句-block
      • 信號賦值語句
        • 簡單信號賦值 <=
        • 條件信號賦值 when...else...
        • 選擇信號賦值 with...select...when
    • 順序語句
      • 順序語句 - 進程語句
      • 常見順序語句
        • 賦值語句
        • if-else語句
        • case語句
        • for...loop語句
    • 時序邏輯相關
    • VHDL模板
    • Testbench模板

基本知識

  • 代碼不區分大小寫
  • 兩個減號為單行注釋
  • 電路功能分為順序語句和并行語句兩種

庫Library

  • 存放已編譯程序包和數據集合的地方,可以被調用

  • 代碼格式

    library 庫名; use 庫名中的邏輯體名;
  • 代碼實例

    library ieee; --打開ieee庫 use ieee.std_logic_1164.all; --加載ieee中std_logic_1164包內的所有內容
  • 庫的種類

    • STD庫 - VHDL標準庫
    • IEEE庫 - VHDL標準庫的擴展
    • WORK庫 - 用戶自己的庫
  • 3個常用的庫

    library ieee; use ieee.std_logic_1164.all; --包含std_logic、std_vector等類型定義及其相關邏輯類子程序定義 use ieee.std_logic_arith.all; --包括std_logic類型數據的算術運算子程序定義。(如+、-、*、移位、比較等) use ieee.std_logic_unsigned.all; --std_logic_vector類型的無符號數算術運算子程序定義 use work.PCK_CRC32_D8.all;--用戶自己的庫

實體Entity

  • 實體用于描述所設計系統的外部接口信號

  • 格式

    entity entity_name is generic(parameter_name : 數據類型 := default_value;parameter_name : 數據類型 := default_value ); port(port_name : 方向 數據類型;port_name : 方向 數據類型 ); end entity entity_name;
  • 端口方向

    in - 輸入端口,此類型的信號不能被賦值 out - 輸出端口 inout - 雙向端口 buffer - 緩沖端口
  • 舉例

    entity entity_name is port(sysclk : in std_logic;nRST : in std_logic;led : out std_logic ); end entity;

結構體Architecture

  • 構造體用于描述實體所代表的系統內部結構和行為

  • 代碼格式

    architecture 結構體名 of 實體名 is[說明語句] begin[功能描述語句] end 結構體名;
  • 說明語句包括了內部信號、常數、元件、數據類型、函數定義

數據對象

常量Constant

  • 常量聲明格式

    constant 常量名 : 數據類型 [:= 初始值];
  • 可以在library/entity/architecture/process中定義

變量Variable

  • 變量聲明格式

    variable 變量名 : 數據類型 [取值范圍] [:= 初始值];
  • 變量是局部量,只能在進程process和子程序中使用

  • 變量的賦值是理想的,沒有延時(即使用組合邏輯實現而不是時序邏輯)

  • 變量賦值符號為:=

  • 有些變量類型需要聲明范圍,比如integer類型就需要。而std_logic類型就不需要(std_logic取值范圍比較小,而integer取值范圍很大,手動聲明范圍可以減少元件的使用)

  • 帶取值范圍的變量聲明舉例

    variable x, y : integer range 15 downto 0 := 1;

信號Signal

  • 在architecture中定義

  • 信號賦值符號為<=,但是初始化符號是:=

  • 信號聲明格式

    signal 信號名 : 數據類型 [:= 初始值];

數據類型

  • 常用數據類型

    • 標準邏輯 std_logic
    • 標準邏輯序列 std_logic_vector
    • 整數 integer
    constant CLK_NUM : integer := 3; constant CLK_NUM : std_logic_vector(3 downto 0) := X"3"; signal clk_en : std_logic; signal clk_cnt : std_logic_vector(7 downto 0);

數組????

信號運算

  • 信號賦值:<= 例: x <= ‘1’

  • 邏輯運算符: and、or、not、xor異或、xnor 同或、nand與非、nor或非

    • 例: x <= not y; x <= y and z; …
  • 算術運算符:+ 加、- 減、* 乘、/ 除、 ** 乘方、 mod 取模、 rem 取余、 sll 邏輯左移、 srl 邏輯右移、 sla 算數左移、 sra 算數右移、 rol 邏輯循環左移、 ror 邏輯循環右移、abs 取絕對值

  • 關系運算符:=、/=、>、 <、>= 、 <=

  • 位拼接運算:&

并行語句

  • 在結構體語句中,并行語句的位置為

    architecture 結構體名 of 實體名 is[說明語句] begin[并行語句] end 結構體名;

進程語句-process

  • 進程描述格式

    process (sensitivity list) begin--功能代碼 end process
  • 進程由敏感信號變化啟動

  • 進程內語句為順序語句,但結構體內的不同進程是并行的,各個進程根據敏感信號獨立運行

參數傳遞語句-generic

  • 參數傳遞語句(GENERIC)主要用來傳遞信息給設計實體的某個具體元件,如用來定義端口寬度、器件延遲時間等參數后,并將這些參數傳遞給設計實體

  • 使用參數傳遞語句易于使設計具有通用性

  • 格式

    generic(常數名 數據類型 := 設定值);
  • 應用場景

    • 定義實體的端口大小
    • 設計實體的物理特征;傳輸延遲,上升和下降延遲等
    • 結構體的總線寬度
    • 設計實體中底層中同種原件的例化數量

元件例化語句-component

元件聲明格式

component 元件名 generic(NUM1 : integer:= 1; --參數說明1;NUM2 : integer:= 2 --參數說明2 ); port(port1 :in std_logic;--端口說明1;port2 :out std_logic_vector(NUM2-1 downto 0)--端口說明2 );end component;

注意分號的位置;端口說明中的參數為該元件參數

元件例化格式

module1_inst:元件名 generic map(NUM1 => NUM3, --參數映射NUM2 => NUM4 ) port map(port3 =>port1,--端口映射port4 =>port2 );

生成語句-generate

  • GENERATE 語句用來產生多個相同的結構和描述規則結構,如陣列、元件例化和進程

  • for…generate語句設計規則體不規則體可用if…generate語句

for…generate

  • 該生成語句用于描述多重模式,結構中所列舉的是并發處理語句。這些語句并發執行而不是順序執行,因此結構中不能用EXIT和NEXT語句

  • 格式:

    標號:for 變量 in 不連續區間 generate <并發處理的生成語句> end generate [標號名];

if…generate

  • 該語句用于描述結構的例外情況,如邊界處發生的特殊情況

  • 格式:

    標號:if 條件 generate <并發處理的生成語句> end generate [標號名];

塊語句-block

  • 塊(BLOCK)語句可以看作是結構體中的子模塊,塊語句把許多并行語句組合在一起形成一個子模塊,而它本身也是一個并行語句

  • 格式

    塊結構名: BLOCK 端口說明 類屬說明 BEGIN 并行語句 END BLOCK 塊結構名;

信號賦值語句

簡單信號賦值 <=

aim <= expression;

條件信號賦值 when…else…

aim <= expression1 when 條件1 elseexpression2 when 條件2 elseexpression3; --example rden <= '1' when rdempty = '0' else '0';

選擇信號賦值 with…select…when

with sel_expression select aim <=expression1 when 條件1,expression2 when 條件2,expression3 when others;

選擇信號賦值語句不允許條件重疊或條件涵蓋不全,注意區分逗號和分號

順序語句

順序語句 - 進程語句

進程描述格式:

[進程標簽 :] process (敏感信號參數表)[進程說明] begin[順序描述語句] end process
  • 進程由敏感信號變化啟動
  • 進程內語句為順序語句,但構造體內的不同進程是并行的,各個進程根據敏感信號獨立運行
  • 時序電路中CLK信號常為敏感信號

常見順序語句

賦值語句

變量賦值與信號賦值

if-else語句

  • 分支少、具有優先級時候使用

    if (條件1) then--功能語句 elsif (條件2) then--功能語句 else--功能語句 end if

case語句

  • 在多條分支的時候使用

    case 源信號 iswhen 信號值1 => 功能語句;when 信號值2 => 功能語句;when others => NULL; end case;
  • 這里的=>不是操作符,相當于then

for…loop語句

  • 在重復操作時使用

    process(signal1,signal2) beignfor i in 開始值 to 結束值 loop--功能代碼end loop; end process;

時序邏輯相關

  • 上升沿的描述:rising_edge(clk)

  • 狀態機定義

    type state is(INIT,REC_DATA,SEND_DATA,TAIL ); signal pstate : state := INIT;
  • 時鐘:一定頻率的方波

  • 組合邏輯:輸出只由輸入決定,與時鐘無關

    • 無時鐘邊沿敏感
    process (A,B) beginif(A = '1' and B = '0') thenC <= X"1";elsif (A = '1' and B = '1') thenC <= X"2";elseC <= X"3";end if; end process;
  • 時序邏輯:輸出不僅由輸入決定,還與時鐘相關

    • 異步復位邏輯
    • 時鐘單邊沿敏感
    process (sysclk, nRST) beginif (nRST = '0') thenC <= X"0";elsif (rising_edge(sysclk)) thenif(A = '1' and B = '0') thenC <= X"1";elsif (A = '1' and B = '1') thenC <= X"2";elseC <= X"3";end if;end if; end process;

VHDL模板

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;entity module_name is generic(SIM : std_logic:= '0';NUM1 : integer:= 1;NUM2 : integer:= 2 ); port(port1 :in std_logic;port2 :out std_logic_vector(NUM1-1 downto 0) ); end entity;architecture beha of module_name is--------------STATE-------------- type state is(ST_A,ST_B,ST_C ); signal pstate : state := ST_A; --------------COMPONENT-------------- component module1 is generic(NUM3 : integer:= 3;NUM4 : integer:= 4 ); port(port3 :in std_logic;port4 :out std_logic_vector(NUM3-1 downto 0) ); end component; --------------SIGNAL-------------- constant NUM5 : integer:= 5; signal signal1 : std_logic; signal signal2 : std_logic_vector(NUM5-1 downto 0);---------------------------- begin ----------------------------module1_inst:module1 generic map(NUM3 => NUM1,NUM4 => NUM2 ) port map(port3 => port1,port4 => port2(NUM2-1 downto 0) );vid: for i in 0 to NUM1-1 generate module1_inst1: module1 port map( ); end generate vid;process(clk,nRST)beginif nRST = '0' thenelsif rising_edge(clk) thenend if; end process;process(list1,list2)beginfor i in 0 to NUM5 loopif thenelseend if;end loop; end process;end architecture beha;

Testbench模板

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;entity netport_info_tb isgeneric(NETPORT_NUM : integer:= 16;LAYER_NUM : integer:= 4); end entity;architecture beha of netport_info_tb is--------------COMPONENT-----------------------------SIGNAL--------------- signal cnt : std_logic_vector(11 downto 0):= (others => '0');------------------------------------ begin ------------------------------------ clk <= not clk after 2 ns; nRST <= '1' after 100 ps;process(clk,nRST)beginif nRST = '0' thenelsif rising_edge(clk) thenif cnt(11) = '1' thencnt <= (others => '0');elsecnt <= cnt + '1';end if;end if; end process;process(clk,nRST)beginif nRST = '0' thenpwren <= '0';ptype <= (others => '0');elsif rising_edge(clk) thenif cnt = 50 thenelsif cnt >= 57 and cnt < 217 thencase conv_integer(cnt) iswhen 57 => pdata <= X"00";when others => null;end case;elseend if;end if; end process;end beha;

總結

以上是生活随笔為你收集整理的VHDL硬件描述语言的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。