由于参数的要求模块中用到了一个三分频电路。程序如下:
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是什么值,才造成这种结果。
可以说思维定势是产生这个问题的直接原因,所以我们学习新东西时要注意思维定势对我们的影响,不知道各位同仁是否也遇到类似的问题,希望我的这点提醒能让大家少走弯路。