歡迎您光臨本站 登入註冊首頁

ISE模擬中需要注意的問題

admin @ 2014-03-26 , reply:0

概述

   在我們團隊負責的項目光柵感測器系統高頻并行解調演算法的FPGA實現中,需要直接頻率合成模塊,因此我們想在FPGA上實現一個DDS晶元的功能,最近在BASYS板上調通……

    在我們團隊負責的項目光柵感測器系統高頻并行解調演算法的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