这个 VHDL 代码有什么问题 - BCD 计数器?
What's wrong with this VHDL code - BCD Counter?
我现在正在学习 VHDL,我有一个非常简单的家庭作业 - 我需要构建一个同步 BCD 计数器,它将从 0 计数到 9,当它达到 9 时,将回到 0。我想做一些实验,所以我决定不以(至少我看到的方式)传统方式(使用 if、elseif)来编写代码,而是使用 when-else 语句(主要是因为计数器来自 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' 也是一样。
模拟图像:
为什么一开始从0跳到2?
谢谢。
它可能无法解释为什么它会从 0 变为 2。请 post 你的测试台代码在这方面。但是,您的代码很糟糕。这段代码翻译成这个,带有注释:
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)
。
我现在正在学习 VHDL,我有一个非常简单的家庭作业 - 我需要构建一个同步 BCD 计数器,它将从 0 计数到 9,当它达到 9 时,将回到 0。我想做一些实验,所以我决定不以(至少我看到的方式)传统方式(使用 if、elseif)来编写代码,而是使用 when-else 语句(主要是因为计数器来自 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' 也是一样。
模拟图像:
为什么一开始从0跳到2?
谢谢。
它可能无法解释为什么它会从 0 变为 2。请 post 你的测试台代码在这方面。但是,您的代码很糟糕。这段代码翻译成这个,带有注释:
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)
。