vhdl信号默认值

时间:2016-01-11 10:39:09

标签: signals vhdl

请参阅下面的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)中提供resetForcing Low告诉Simulation Report输出节点值PC (x“FF87”),以及1111111110000111输出节点值IR(x“aa01”),这让我感到困惑!

似乎1010101000000001reset!我想知道为什么。

3 个答案:

答案 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代码中,您描述了PCIR的锁存器。例如,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描述硬件时要记住的最重要的事情是您不是在编写软件。相反,您需要根据您的描述想象合成器将要选择的硬件元素。考虑电线,门和人字拖!