【问题标题】:2-bit counter with reset - non-changing output issue带复位的 2 位计数器 - 输出不变问题
【发布时间】:2019-04-01 16:07:40
【问题描述】:

这是我要回答的问题。

设计并模拟一个 2 位计数器,复位后计数为“00”, “01”、“10”、“11”、“00”、“01 ...”与时钟上升同步 边缘。

当我在Vivado 2017.2 中模拟它时,我的代码将z 输出增加一次,然后在01 处停止!我的代码有什么问题?我需要一个测试台吗?如果是这样,我怎么知道我需要一个测试台来模拟代码?

这是我的代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity twoc is
Port (reset : in std_logic;
ck : in std_logic;
 z : out std_logic_vector(1 downto 0));
end twoc;

architecture Behavioral of twoc is
signal a : std_logic_vector(1 downto 0):= "00";
signal temp : std_logic_vector(1 downto 0);
begin 
process(ck)

begin
if ck='1' and ck'event then
    if reset ='1' then
    temp<="00";
    else
    temp <=std_logic_vector(unsigned(a)+1);
    end if;
end if;
end process;
z <= temp;
end Behavioral;

【问题讨论】:

  • 测试平台确保了可移植性。 IEEE Std 1076-2008 14.2 设计层次结构的详细说明“实现可以允许但不要求允许设计层次结构根部的设计实体具有泛型和端口。如果实现允许这些顶级接口对象,它可能会限制它们允许的形式(即是否允许它们是接口类型、子程序、包或对象),并且在接口对象的情况下,以实现定义的方式允许它们的类型和模式。”需求可以基于复杂性或展示的问题/修复。
  • 请注意,buraquete 的答案(现在)没有提到在将无符号温度分配给 z 时需要进行类型转换。测试台将允许复制问题并验证解决方案。
  • 在 stackoverflow 上,答案的快速或准确程度取决于重现问题和验证解决方案的难易程度,鼓励使用测试平台。这也有助于未来读者遇到相同或相似的问题。您会发现更高质量的问题和答案很有用,因为参考资料往往会赢得选票并赢得声誉。

标签: vhdl simulation fpga


【解决方案1】:

问题是由于您在所有情况下都分配了temp &lt;= unsigned(a) + 1,并且由于a 与信号00 保持一致,因此您只输出01,只需删除a 并将temp &lt;= unsigned(temp) + 1 与temp 一起使用初始化为00

作为改进点,正如mkrieger1 建议的那样,最好将temp 定义为unsigned,因为您希望在其上应用+。此外,您需要在将 z 的值分配回 z 时再次将 temp 转换回标准逻辑向量,或者也将 z unsigned 设为。

signal temp : unsigned(1 downto 0) := "00";

【讨论】:

  • 另外,temp 可能需要是 unsigned 而不是 std_logic_vector,因此定义了 + 运算符,但我不确定。
  • 是的,我的意思是把它声明为unsigned,而不是每次都转换它。
  • 这需要在对 z 的信号分配中将 temp 类型转换为 std_logic_vector:z &lt;= std_logic_vector(temp);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2013-10-07
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多