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
數組????
信號運算
-
信號賦值:<= 例: 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; -
時鐘:一定頻率的方波
-
組合邏輯:輸出只由輸入決定,與時鐘無關
- 無時鐘邊沿敏感
-
時序邏輯:輸出不僅由輸入決定,還與時鐘相關
- 異步復位邏輯
- 時鐘單邊沿敏感
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硬件描述语言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VHDL/Verilog编译错误总结
- 下一篇: VHDL读写txt文件