请参阅下面的vhdl代码。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity newtestcpu is
port( reset :in std_logic;
PC :out std_logic_vector(15 downto 0);
IR :out std_logic_vector(15 downto 0)
);
end newtestcpu;
architecture CPUArch of newtestcpu is
BEGIN
process(reset) begin
case reset is
when '1' => PC<=x"FF87";
when others => IR<=x"aa01";
end case;
end process;
end architecture ;
Quartus II中的Start Compilation & Simulation
。
我在vwf文件中的节点值{{1}}(0)中提供reset
,Forcing Low
告诉Simulation Report
输出节点值PC
(x“FF87”),以及1111111110000111
输出节点值IR
(x“aa01”),这让我感到困惑!
似乎1010101000000001
已reset
!我想知道为什么。
答案 0 :(得分:1)
感谢评论,我意识到我错过了阅读这个问题,而这实际上并没有解决你的问题。但是,尽管如此,我认为值得做出建议的更改,所以我没有删除答案。
您假设如果reset
不是'1'
,那么它必须是'0'
。在模拟下,在初始化期间,当所有进程运行一次时,reset
的值将为'U'
,即未定义。这将满足您的when others
案例,并导致设置IR
。即使您在时间= 0 ns时将reset
设置为'1'
,也会在初始流程运行期间看到others
个案。
我会按如下方式更改您的案例陈述:
case reset is
when '1' => PC<=x"FF87";
when '0' => IR<=x"aa01";
when others => NULL;
end case;
您的代码的另一个问题是,这样的事情通常是同步(时钟)进程。您正在描述此代码中的锁存器,这可能不是您想要做的。还有很多其他问题涉及这个主题。
答案 1 :(得分:1)
当您使用矢量波形文件(VWF)进行模拟时,Quartus-II实际上模拟了综合网表的行为(在此处使用Quartus-II 13.1进行检查)。如果您还没有运行“Analysis&amp; Synthesis”步骤,Quartus会要求这样做。在再次模拟VWF之前更改VHDL文件时,必须手动始终手动运行此步骤。合成的网表被写成Verilog代码,它将是ModelSim模拟器的输入。您可以在文件simulation/qsim/newtestcpu.vo
中找到它。
在您的VHDL代码中,您描述了PC
和IR
的锁存器。例如,PC
在重置为"FF87"
时会被赋值1
,但是应该保存其值。 PC
的唯一其他可能值是此信号的初始值,即"UUUUUUUU"
,因为您没有指定一个值。在FPGA上,我们只有高电平或低电平,因此,Quartus将其合成为输出"FF87"
的静态值Q
。您也可以在“分析和综合”期间报告的警告中看到它:
Warning (13024): Output pins are stuck at VCC or GND
Warning (13410): Pin "PC[0]" is stuck at VCC
Warning (13410): Pin "PC[1]" is stuck at VCC
Warning (13410): Pin "PC[2]" is stuck at VCC
Warning (13410): Pin "PC[3]" is stuck at GND
Warning (13410): Pin "PC[4]" is stuck at GND
Warning (13410): Pin "PC[5]" is stuck at GND
Warning (13410): Pin "PC[6]" is stuck at GND
Warning (13410): Pin "PC[7]" is stuck at VCC
Warning (13410): Pin "PC[8]" is stuck at VCC
Warning (13410): Pin "PC[9]" is stuck at VCC
Warning (13410): Pin "PC[10]" is stuck at VCC
Warning (13410): Pin "PC[11]" is stuck at VCC
Warning (13410): Pin "PC[12]" is stuck at VCC
Warning (13410): Pin "PC[13]" is stuck at VCC
Warning (13410): Pin "PC[14]" is stuck at VCC
Warning (13410): Pin "PC[15]" is stuck at VCC
...
如果您确实想要模拟VHDL代码的行为(在合成之前),您必须编写VHDL测试平台并在“Assignments - &gt; Settings - &gt; Simulation”选项卡中设置此测试平台。然后运行“RTL Simulation”步骤。
答案 2 :(得分:0)
您的代码未定义PC
时应获得的状态reset = 0
,并且未定义IR
时应显示的状态reset = 1
。因此,合成器将引入reset
成为时钟的锁存器。这很可能不是你的意图。
查看VHDL: How to use CLK and RESET in process
或研究Ashden: VHDL设计师指南,这是一个非常好的资源。
使用VHDL描述硬件时要记住的最重要的事情是您不是在编写软件。相反,您需要根据您的描述想象合成器将要选择的硬件元素。考虑电线,门和人字拖!