FPGA模擬 test bench實例(VHDL)

知識的共享才能促使個人和一個行業良好的發展。

寫文章的初衷是為了和更多的人相互交流和學習,當然也希望能幫助到一些初學者。

test bench是FPGA開發中很關鍵的一個部分,可以給大型FPGA項目開發節約大量的時間,進行邏輯模擬是非常有必要的一步,希望初學者重視起來。使用編譯軟體quartus或者vivado等等和modelsim進行關聯模擬,這種調用方法顯的比較繁瑣,本文使用的是直接在modelsim中建立工程進行編譯和模擬。

本人使用的是編譯環境是quartus13.0(64位),使用的是VHDL語言,模擬工具是modelsim SE 10.1a。選擇的晶元器件是Arria V:5AGXMB3G4F35I5.

以一個很簡單的例子來說明一下testbench的架構和使用方式,這裡模擬不涉及具體功能,而是對一個RAM的IP核進行最簡單的讀寫模擬。

1、首先使用quartus13.0建立一個空的工程test,在空工程中直接生成一個RAM的IP核(這裡IP核全部使用默認設置):

2、使用modelsim建立一個新工程:

3、將剛在quartus生成的ramT.vhd文件複製到生成的modelsim工程目錄下(當然進行文件區分是好的習慣):

4、在modelsim中將這個上面文件添加到工程中(右鍵project空白處):

5、生成一個新文件命名ramTb作為我們的testbench文件,在文件中可以書寫測試程序(modelsim的代碼編輯器很不好用,推薦使用Notepad++來完成代碼書寫):

6、 兩個文件都在工程中,然後使用modelsim進行全編譯:

7、 編譯通過後就可以進行模擬了:

8、 然後就可以進行一些模擬操作,比如將信號添加到波形文件中,直觀觀察輸入輸出,判定邏輯是否正確:

9、如果測試程序或者功能程序有修改,則退出當前模擬,修改完成後跳轉第6步再開始模擬。

library ieee; --調用的庫use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity ramTb is --測試腳本的實體沒有輸入輸出end ramTb;architecture beha of ramTb iscomponent ramT is --聲明元件,需要進行模擬的頂層文件,這裡就是我們需要模擬的ram。 port( clock : IN STD_LOGIC := 1; data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); rdaddress : IN STD_LOGIC_VECTOR (4 DOWNTO 0); wraddress : IN STD_LOGIC_VECTOR (4 DOWNTO 0); wren : IN STD_LOGIC := 0; q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );end component;--==========================信號定義==========================signal clock : std_logic := 0;signal data : std_logic_vector(7 downto 0) := (others => 0);signal rdaddress : std_logic_vector(4 downto 0) := (others => 0);signal wraddress : std_logic_vector(4 downto 0) := (others => 0);signal wren : std_logic := 0;signal q : std_logic_vector(7 downto 0) := (others => 0);--==========================end===============================signal rst : std_logic := 0;constant clkPeriod : time := 20 ns; --主時鐘定義 50Mhzsignal cnt : integer range 0 to 255 := 0;beginuut : ramT --例化元件,相當於調用上面聲明的器件 port map( clock => clock, data => data, rdaddress => rdaddress, wraddress => wraddress, wren => wren, q => q ); clkPro : process --此進程生成測試時鐘 begin clock <= 0; wait for clkPeriod/2; clock <= 1; wait for clkPeriod/2; end process;rstPro : process --初始化複位(本工程可以不用此進程) begin rst <= 1; wait for 500 ns; rst <= 0; wait; end process; simuliPro : process(clock,rst) --此進程是模擬激勵,也就是輸入,敏感量一定要填寫 begin if rst=1 then cnt <= 0; data <= (others => 0); wren <= 0; rdaddress <= (others => 0); wraddress <= (others => 0); elsif rising_edge(clock) then if cnt<10 then --循環向ram寫入數據,跳過0地址 cnt <= cnt + 1; wren <= 1; wraddress <= wraddress + 1; data <= data + 1; elsif cnt<20 then --將寫入的數據讀出 cnt <= cnt + 1; wren <= 0; wraddress <= (others => 0); rdaddress <= rdaddress + 1; else rdaddress <= (others => 0); end if; end if; end process;end beha;

推薦閱讀:

懶人福音!自從有了TA,每天不用火就能吃到熱乎乎的早餐午餐
未來還會有新的電子遊戲類型被發明嗎?
有哪些記者出身的牛人?
Google 發布會最全匯總:Pixel 2 拍照秒殺 iPhone 8,但最貴的卻不是它

TAG:現場可編輯邏輯門陣列FPGA | 科技 | 源代碼 |