【问题标题】:vhdl signal default valuevhdl 信号默认值
【发布时间】:2016-01-11 10:39:09
【问题描述】:

请参阅下面的 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 &amp; Simulation

我在 vwf 文件中给出reset in node Value Forcing Low(0),Simulation Report 告诉PC out node Value 1111111110000111 (x"FF87"),并且IR out node Value 1010101000000001(x"aa01"),搞糊涂了!

看来reset 已经是1 了!我想知道为什么。

【问题讨论】:

    标签: signals vhdl


    【解决方案1】:

    感谢评论,我意识到我错过了阅读问题,并且这实际上并不能解决您的问题。但是,尽管如此,我认为值得进行建议的更改,因此我没有删除答案。

    您已经假设如果reset 不是'1',那么它一定是'0'。模拟下,在初始化过程中,当所有进程运行一次时,reset的值将是'U',即未定义。这将满足您的when others 案例,并导致设置IR。即使您在 time = 0 ns 时将 reset 设置为 '1',在初始进程运行期间也会看到 others 情况。

    我会将您的案例陈述更改如下:

    case reset is
        when '1'    => PC<=x"FF87";
        when '0'    => IR<=x"aa01";
        when others => NULL;
    end case;
    

    您的代码的另一个问题是,这样的事情通常是一个同步(时钟)过程。您在此代码中描述了闩锁,这可能不是您想要做的。还有很多其他问题涵盖了这个主题。

    【讨论】:

    • 我不认为这就是全部:如果 Reset 简单地从“U”转换为“0”,那么分配给 PC 的操作应该永远不会发生,所以 PC 应该是 UUUU。对提问者:我建议编写一个 VHDL 测试平台,以便对输入信号进行适当的可见性、初始化和控制。
    • 你说得对@BrianDrummond,我没有正确阅读问题
    • 在初始化过程中,当所有进程运行一次时,reset 的值将是测试台中关联信号的初始值。当然,这通常是U,但也可能是01
    【解决方案2】:

    当您使用矢量波形文件 (VWF) 进行仿真时,Quartus-II 实际上会仿真合成网表的行为(在此处使用 Quartus-II 13.1 进行检查)。如果您还没有运行“Analysis & Synthesis”步骤,Quartus 会要求这样做。在再次模拟 VWF 之前更改 VHDL 文件时,您必须始终手动运行此步骤。合成的网表作为 Verilog 代码写出,将作为 ModelSim 模拟器的输入。您可以在文件simulation/qsim/newtestcpu.vo 中找到它。

    在您的 VHDL 代码中,您描述了 PCIR 的锁存器。例如,PC 在重置为1 时被赋值为"FF87",否则应保存其值。 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 -> Settings -> Simulation”选项卡中设置这个测试台。然后运行“RTL 模拟”步骤。

    【讨论】:

      【解决方案3】:

      您的代码没有定义PCreset = 0 时应该获得什么状态,也没有定义IRreset = 1 时应该成为什么状态。因此,合成器将引入锁存器,reset 成为时钟。这很可能不是您的本意。

      看看VHDL: How to use CLK and RESET in process

      或者学习 Ashden:The Designer's Guide to VHDL,这真是一个极好的资源。

      使用 VHDL 描述硬件时要记住的最重要的一点是,您不是在编写软件。相反,您需要想象合成器将根据您的描述选择的硬件元素。从电线、门和触发器的角度来思考!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-25
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多