在我們團隊負責的項目光柵感測器系統高頻并行解調演算法的FPGA實現中,需要直接頻率合成模塊,因此我們想在FPGA上實現一個DDS晶元的功能,最近在BASYS板上調通了DDS模塊,在功能模擬過程中我們發現在ISE環境下編寫VHDL時對信號賦初值對模擬是十分必要的。
由於參數的要求模塊中用到了一個三分頻電路。程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity fredevider3 is
port
(clock:in std_logic;
clk:out std_logic
);
end fredevider3;
architecture Behavioral of fredevider3 is
signal counter:integer range 0 to 2;
signal temp1,temp2:std_logic;
begin
process(clock)
begin
if rising_edge(clock) then
if counter=2 then
counter<=0;
temp1<=not temp1;
else
counter<=counter+1;
end if;
end if;
if falling_edge(clock) then
if counter=1 then
temp2<=not temp2;
end if;
end if;
end process;
clk<=temp1 xor temp2;
end Behavioral;
可是行為模擬后卻沒有預期的信號輸出,看了一下message也沒有任何報錯的信息。
把中間信號加進去又看了一下結果,發現counter變了,但是temp1和temp2沒有反應,說明程序運行了,但為什麼沒反應呢?如圖。這個程序我以前在QUARTUS II中跑過完全沒有問題為什麼這裡沒反應呢?
我又在QUARTUS II中把程序跑了一遍,完全沒有問題,模擬有結果。
剛開始以為所用軟體是ISE9.1i的評估版問題,後來換用ISE8.2i完全版,問題仍然如故,鬱悶,開始胡思亂想。。。是不是ISE自帶的模擬器有bug?我用換了Modelsim問題還是解決不了。
後來我突然想起在VHDL中有給變數賦初值的語句,而我的程序中變數未賦初值, U的出現是不是因為變數未賦初值,查了一下VHDL的語法書”STD_LOGIC”型數據可以有九種不同的值,其中’U’代表初始值。我改了一下程序,把原來的
signal temp1,temp2:std_logic;
改為
signal temp1:std_logic:='0';
signal temp2:std_logic:='0';
模擬,問題解決了。
仔細分析一下原因應該是這樣的:QUARTUS II的模擬器能夠自動為信號賦一個初值,而這裡在ISE中我們通過Test Bench Waveform生成測試激勵文件.vhw,信號賦初值工作需要我們編程人員在編寫程序時加入。我們忽略了在程序中為temp1和temp2賦初值,使得Simulator不知道temp1和temp2是什麼值,才造成這種結果。
可以說思維定勢是產生這個問題的直接原因,所以我們學習新東西時要注意思維定勢對我們的影響,不知道各位同仁是否也遇到類似的問題,希望我的這點提醒能讓大家少走彎路。
[admin via 研發互助社區 ] ISE模擬中需要注意的問題已經有4060次圍觀
http://cocdig.com/docs/show-post-43036.html