Quartus II:简单的反击但奇怪的行为

时间:2016-09-29 19:52:45

标签: vhdl fpga modelsim intel-fpga quartus

首先,我很抱歉打扰你们这个非常棒的问题,但我对我的(ModelSim模拟)电路发生的事情没有任何意义。

这是我的代码,简单可以:

LIBRARY ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

ENTITY Counter IS
    PORT(
    enable  : in std_logic;
    clk     : in std_logic;
    count       : out integer range 0 to 255);
END Counter;

ARCHITECTURE LogicFunction OF Counter IS

    signal count_i : integer range 0 to 255;

begin

    cnt : process(clk, enable, count_i)
    begin
        count <= count_i;
        if (enable = '0') then
            count_i <= 0;
        else
            count_i <= count_i + 1;
        end if;
    end process;

end LogicFunction;

我的问题是:当我使用ModelSim执行时序仿真时,使用时钟信号,&#34;启用&#34;是第一个&#39; 0&#39;然后&#39; 1&#39;,输出(&#34; count&#34;)始终保持为零。我尝试了很多不同的东西,比如设置&#34; count&#34;作为一个向量,做各种各样的演员,但它仍然保持不变。

增量&#34; count_i&lt; = count_i + 1;&#34;似乎是问题所在:我试图用&#34; count_i&lt; = 55&#34;之类的东西替换它,然后输出改变(到前一个例子中的&#34; 55&#34;)。 p>

我已经在该网页上的代码中看到了完全相同的增量,例如: http://surf-vhdl.com/how-to-connect-serial-adc-fpga/ 我创建了一个项目,模拟了它......它的工作原理!我真的没有得到那个我没做过的事情,除了一堆&#34; if&#34;在我的代码中我不需要。

非常感谢任何帮助,我花了3个小时的试用和错误......

提前Thanx!

1 个答案:

答案 0 :(得分:1)

除了不使用时钟边沿递增i_count之外,你还使用了enable作为clear,因为它既在敏感列表中,又在if语句条件中遇到。

library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;

entity counter is
    port(
    enable  : in std_logic;
    clk     : in std_logic;
    count       : out integer range 0 to 255);
end counter;


architecture logicfunction of counter is

    signal count_i : integer range 0 to 255;

begin

    cnt : process (clk) -- (clk, enable, count_i)
    begin
        -- count <= count_i;   -- MOVED 
        -- if (enable = '0') then  -- REWRITTEN
        --     count_i <= 0;
        -- else
        --     count_i <= count_i + 1;
        -- end if;
        if rising_edge(clk) then
            if enable = '1' then
                count_i <= count_i + 1;
            end if;
        end if;
    end process;

    count <= count_i;  -- MOVED TO HERE

end architecture logicfunction;

您的代码被修改为使用clk的上升沿,并且在i_count增量之前需要enable ='1'。引用包numeric_std的多余use子句已被注释掉。您正在执行的唯一数字操作是整数,这些运算符是在包标准中预定义的。

请注意,替换if语句不会用括号括起它的条件。这不是一种编程语言,也不需要它们。

计数分配被移动到并发信号分配。这样就无需在灵敏度列表中使用i_count来更新计数。

投入测试平台以完成Miminal Complete and Verifiable Example

library ieee;
use ieee.std_logic_1164.all;

entity counter_tb is
end entity;

architecture foo of counter_tb is
    signal enable:  std_logic := '0';
    signal clk:     std_logic := '0';
    signal count:   integer range 0 to 255;
begin
DUT:
    entity work.counter
        port map (
            enable => enable,
            clk => clk,
            count => count
        );
CLOCK:
    process
    begin
        wait for 5 ns;  -- 1/2 clock period
        clk <= not clk;
        if now > 540 ns then
            wait;
        end if;
    end process;
STIMULUS:
    process
    begin
        wait for 30 ns;
        enable <= '1';
        wait for 60 ns;
        enable <= '0';
        wait for 30 ns;
        enable <= '1';
        wait;

    end process;
end architecture;

这就是:

counter_tb.png

这表明当enable为'0'时,计数器不会计数,也不会使enable ='0'重置i_count的值。

Quartus II手册第1卷设计与综合没有给出使用时钟边沿和没有异步清零或加载信号的使能的示例。

这里的秘密是使用时钟边沿指定的if语句条件内的任何内容都将与时钟同步。外面的任何条件都是异步的。

符合条件的合成顺序逻辑的形式源自现已撤销的IEEE Std 1076.6-2004 IEEE VHDL寄存器标准 转移水平(RTL)合成。使用这些行为描述可以保证您可以通过与模拟匹配的合成来生成硬件。