0

我现在正在学习 VHDL,我有一个非常简单的家庭作业 - 我需要构建一个同步 BCD 计数器,它会从 0 计数到 9,当它达到 9 时,会回到 0。我想尝试一下所以我决定不以(至少我看到的方式)传统方式(使用 if、elseif)来编写代码,而是使用 when-else 语句(主要是因为 counter 是从 0 到 9 并且必须一旦达到 9 就回到 0)。

library IEEE;
    use IEEE.std_logic_1164.all;

Entity sync_counter is
    port (rst, clk: in std_logic);
end Entity;

Architecture implement of sync_counter is
    signal counter: integer range 0 to 10;
Begin
        counter <=    0 when (rst = '1') else
                      counter + 1 when (clk='1' and clk'event) else
                      0 when (counter = 10);
end Architecture;

所以一切都编译了,但在模拟中,最初计数器从 0 跳到 2,但在一个周期 (0-9 - 0) 之后它表现正常,这意味着计数器从 0 到 1 应该是这样。如果您强制 rst = '1',则相同。

模拟图像: BCD 计数器模拟

为什么一开始就从0跳到2?

谢谢你。

4

1 回答 1

2

它可能无法解释为什么它从 0 变为 2。请在前面发布您的测试台代码。但是,您的代码很糟糕。这段代码翻译成这个,带有注释:

process(rst, clk, counter)
begin
    if rst = '1' then -- Asynchronous reset, so far so good
        counter <= 0;
    elsif clk'event and clk = '1' then -- Rising edge, we got an asynchronous flip-flop?
        counter <= counter + 1;
    elsif counter = 10 then -- What is this!?! not an asynchronous reset, not a synchronous reset, not a clock. How does this translate to hardware?
        counter <= 0;
    end if;
end process;

我不确定这是否适用于硬件,但我无法快速弄清楚它是如何实现的,你想要的是:

process(rst, clk)
begin
    if rst = '1' then -- Asynchronous reset
        counter <= 0;
    elsif clk'event and clk = '1' then
        if counter = 9 then -- Synchronous reset
            counter <= 0;
        else
            counter <= counter + 1;
        end if;
    end if;
end process;

我将“when-else”语句用于纯粹的组合代码,或者至多将其留给单行reg <= value when rising_edge(clk)

于 2015-03-28T19:22:02.217 回答