一、概述
FPGA仿真方法:
(1)交互式仿真方法:利用EDA工具的仿真器進(jìn)行仿真,,使用方便,,但輸入輸出不便于記錄規(guī)檔,當(dāng)輸入量較多時(shí)不便于觀察和比較,。
(2)測(cè)試平臺(tái)法:為設(shè)計(jì)模塊專門設(shè)計(jì)的仿真程序,,可以實(shí)現(xiàn)對(duì)被測(cè)模塊自動(dòng)輸入測(cè)試矢量,并通過波形輸出文件記錄輸出,,便于將仿真結(jié)果記錄歸檔和比較,。
二,、仿真程序的設(shè)計(jì)方法
1 仿真的三個(gè)階段
(1)行為仿真:目的是驗(yàn)證系統(tǒng)的數(shù)學(xué)模型和行為是否正確,,對(duì)系統(tǒng)的描述的抽象程度較高。在行為仿真時(shí),,VHDL的語法語句都可以執(zhí)行,。
(2)RTL仿真:目的是使被仿真模塊符合邏輯綜合工具的要求,使其能生成門級(jí)邏輯電路,。在RTL仿真時(shí),,不能使用VHDL中一些不可綜合和難以綜合的語句和數(shù)據(jù)類型。該級(jí)仿真不考慮慣性延時(shí),,但要仿真?zhèn)鬏斞訒r(shí),。
(3)門級(jí)仿真:門級(jí)電路的仿真主要是驗(yàn)證系統(tǒng)的工作速度,慣性延時(shí)僅僅是仿真的時(shí)候有用在綜合的時(shí)候?qū)⒈缓雎浴?br />
2 仿真程序的內(nèi)容
(1)被測(cè)實(shí)體的引入,。
(2)被測(cè)實(shí)體仿真信號(hào)的輸入,。
(3)被測(cè)實(shí)體工作狀態(tài)的激活。
(4)被測(cè)實(shí)體信號(hào)的輸出
(5)被測(cè)實(shí)體功能仿真的結(jié)果比較,,并給出辨別信息
(6)被測(cè)實(shí)體的仿真波形比較處理
3 仿真要注意的地方
(1)仿真信號(hào)可以由程序直接產(chǎn)生,,也可以用TEXTIO文件產(chǎn)生后讀入,。
(2)仿真程序中可以簡(jiǎn)化實(shí)體描述,省略有關(guān)端口的描述,。仿真程序?qū)嶓w描述的簡(jiǎn)化形式為:
ENTITY 測(cè)試平臺(tái)名 IS
END 測(cè)試平臺(tái)名,;
(3)對(duì)于功能仿真結(jié)果的判斷,可以用斷言語句(ASSORT)描述,。
(4)為了比較和分析電子系統(tǒng)的功能,,尋求實(shí)現(xiàn)指標(biāo)的最佳結(jié)構(gòu),往往利用一個(gè)測(cè)試平臺(tái)對(duì)實(shí)體的不同結(jié)構(gòu)進(jìn)行仿真,,一般是應(yīng)用配置語句為同一被測(cè)實(shí)體選用多個(gè)結(jié)構(gòu)體,。
CONFIGURATION 測(cè)試平臺(tái)名 OF 被測(cè)實(shí)體名 IS
FOR 被測(cè)實(shí)體的A的結(jié)構(gòu)體名
END FOR;
END 測(cè)試平臺(tái)名;
同樣,,若選用結(jié)構(gòu)體B,,則配置語句可寫為:
CONFIGURATION 測(cè)試平臺(tái)名 OF 被測(cè)實(shí)體名 IS
FOR 被測(cè)實(shí)體的B的結(jié)構(gòu)體名
END FOR;
END 測(cè)試平臺(tái)名;
4 VHDL仿真程序結(jié)構(gòu)
測(cè)試平臺(tái)僅僅是用于仿真,,因此可以利用所有的行為描述語言進(jìn)行描述,,下表表示了一個(gè)測(cè)試平臺(tái)所包含的部分,典型的測(cè)試平臺(tái)將包括測(cè)試結(jié)果和錯(cuò)誤報(bào)告結(jié)果,。
(1)產(chǎn)生時(shí)鐘信號(hào)
-- Declare a clock period constant.
Constant ClockPeriod : TIME := 10 ns;
-- Clock Generation method 1:
Clock <= not Clock after ClockPeriod / 2;
-- Clock Generation method 2:
GENERATE CLOCK: process
begin
wait for (ClockPeriod / 2)
Clock <= ’1’;
wait for (ClockPeriod / 2)
Clock <= ’0’;
end process;
(2)提供仿真信號(hào)
提供仿真信號(hào)可以有兩種方法:絕對(duì)時(shí)間仿真和相對(duì)時(shí)間仿真,。在絕對(duì)時(shí)間仿真方法中,仿真時(shí)間只是相對(duì)于零時(shí)刻的仿真時(shí)間,。在相對(duì)時(shí)間仿真方法中,,仿真的時(shí)間首先提供一個(gè)初值,在后繼的時(shí)間設(shè)置中相對(duì)于該初始時(shí)間進(jìn)行事件動(dòng)作,。
絕對(duì)時(shí)間仿真:
MainStimulus: process begin
Reset <= ’1’;
Load <= ’0’;
Count_UpDn <= ’0’;
wait for 100 ns;
Reset <= ’0’;
wait for 20 ns;
Load <= ’1’;
wait for 20 ns;
Count_UpDn <= ’1’;
end process;
相對(duì)時(shí)間仿真:
Process (Clock)
Begin
If rising_edge(Clock) then
TB_Count <= TB_Count + 1;
end if;
end process;
SecondStimulus: process begin
if (TB_Count <= 5) then
Reset <= ’1’;
Load <= ’0’;
Count_UpDn <= ’0’;
Else
Reset <= ’0’;
Load <= ‘1’;
Count_UpDn <= ‘1’;
end process;
FinalStimulus: process begin
if (Count = "1100") then
Count_UpDn <= '0';
report "Terminal Count
Reached, now counting down."
end if;
end process;
(3)顯示結(jié)果
VHDL提供標(biāo)準(zhǔn)的std_textio函數(shù)包把輸入輸出結(jié)果顯示在終端上,。
5 簡(jiǎn)單的仿真程序
library IEEE;
use IEEE.std_logic_1164.all;
entity testbench is
end entity testbench;
architecture test_reg of testbench
component shift_reg is
port (clock : in std_logic;
reset : in std_logic;
load : in std_logic;
sel : in std_logic_vector(1 downto 0);
data : in std_logic_vector(4 downto 0);
shiftreg : out std_logic_vector(4 downto 0));
end component;
signal clock, reset, load: std_logic;
signal shiftreg, data: std_logic_vector(4 downto 0);
signal sel: std_logic_vector(1 downto 0);
constant ClockPeriod : TIME := 50 ns;
begin
UUT : shift_reg port map (clock => clock, reset => reset,
load => load, data => data,
shiftreg => shiftreg);
process begin
clock <= not clock after (ClockPeriod / 2);
end process;
process begin
reset <= ’1’;
data <= "00000";
load <= ’0’;
set <= "00";
wait for 200 ns;
reset <= ’0’;
load <= ’1’;
wait for 200 ns;
data <= "00001";
wait for 100 ns;
sel <= "01";
load <= ’0’;
wait for 200 ns;
sel <= "10";
wait for 1000 ns;
end process;
end architecture test_reg;
6 TEXTIO建立測(cè)試程序
在由仿真程序直接產(chǎn)生輸入信號(hào)的方法中,測(cè)試矢量是仿真程序的一個(gè)部分,,如果系統(tǒng)比較復(fù)雜,,測(cè)試矢量的數(shù)目非常大,修改測(cè)試矢量時(shí)就必須修改程序,,重新編譯和仿真,。工作量大。因此,,在測(cè)試矢量非常大的時(shí)候可以用TEXTIO的方法來進(jìn)行仿真,。
TEXTIO仿真方法:測(cè)試矢量從仿真程序中分離出來,單獨(dú)存于一個(gè)文件中(即TEXTIO文件),,在仿真時(shí),,根據(jù)定時(shí)要求按行讀出,并賦予相應(yīng)的輸入信號(hào),。這種方法允許采用同一個(gè)測(cè)試平臺(tái),,通過不同的測(cè)試矢量文件進(jìn)行不同的仿真,。值得注意的是,測(cè)試矢量文件的讀取,,需要利用TEXTIO程序包的功能,。在TEXTIO程序包中,包含有對(duì)文本文件進(jìn)行讀寫的過程和函數(shù),。
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
LIBRARY ieee;
USE IEEE.STD_LOGIC_TEXTIO.ALL;
USE STD.TEXTIO.ALL;
ENTITY testbench IS
END testbench;
ARCHITECTURE testbench_arch OF testbench IS
COMPONENT stopwatch