2

我正在尝试用 VHDL 构建一个计数器。最终目标是将“do_count”挂钩到按钮。总数将转换为 BCD 并显示在 7 段显示器上。按下按钮,观察数字的增加。

我正在使用 ModelSim,我可以看到内部“counter_value”正确地增加了 1。但是在我的两个测试“do_count”期间,输出信号“total”变为“000X”,然后变为“00X0”。为什么我会收到 X 信号?

我已经在进程内、进程外、'if's 等内部移动了“输出 <= current_value”。仍然是“000X”。

我尝试在进程中使用变量“tmp”。

count_up : process(clk) is
   variable tmp : unsigned (15 downto 0 );
begin
   tmp := current_value;
   -- snip
   if do_count='1' then
      current_value <= tmp + to_unsigned(1,16);
   end if;

我仍然得到“000X”。

完整代码:

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

entity d_counter is
    port ( rst : in std_logic;
           clk : in std_logic;
           do_count : in std_logic;
           total : out unsigned (15 downto 0)
        );
  end entity d_counter;

architecture counter_arch of d_counter is
  signal current_value : unsigned (15 downto 0) := (others=>'0');
begin
  count_up : process(clk) is
  begin
    if rst='1' then
      current_value <= (others=>'0');
      total <= (others=>'0');
    elsif rising_edge(clk) then
      if do_count='1' then
        current_value <= current_value + to_unsigned(1,16);
      end if;
    end if;
  end process count_up;
  total <= current_value;
end architecture counter_arch;

试验台:

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

entity test_counter is 
  begin
  end entity test_counter;

architecture run_test_counter of test_counter is

  signal t_rst : std_logic := '1';
  signal t_clk : std_logic := '0';
  signal t_do_count : std_logic;
  signal t_total : unsigned( 15 downto 0 );

  component d_counter is
    port ( rst : in std_logic;
           clk : in std_logic;
           do_count : in std_logic;
           total : out unsigned( 15 downto 0 )
        );
  end component d_counter;

begin
  uut : d_counter
    port map( rst => t_rst,
      clk => t_clk,
      do_count => t_do_count,
      total => t_total );

    clock : process is 
    begin

        t_clk <= '0'; wait for 10 ns;
        t_clk <= '1'; wait for 10 ns;
    end process clock;

    stimulus : process is
    begin
      t_rst <= '1';
      t_do_count <= '0';
      t_total <= (others =>'0');
      wait for 15 ns;

      t_rst <= '0';
      wait for 10 ns;

      t_do_count <= '1';
      wait for 10 ns;

      t_do_count <= '0';
      wait for 10 ns;

      t_do_count <= '1';
      wait for 10 ns;

      t_do_count <= '0';
      wait for 10 ns;

      wait;

    end process stimulus;
end architecture run_test_counter;

2012 年 10 月 3 日更新。两个答案都有帮助。在流程中移动“total <= current_value”(来自@simon)并删除额外的“t_total <= (others =>'0');” (来自@peter-bennett)在我的测试平台中是必需的。我必须同时做这两件事才能摆脱 X。

4

2 回答 2

3

您的代码使用“total”编写多驱动。您应该删除进程 count_up 中的分配。

count_up : process(clk) is
  begin
    if rst='1' then
      current_value <= (others=>'0');
      total <= (others=>'0');  --> Remove it
    elsif rising_edge(clk) then
      if do_count='1' then
        current_value <= current_value + to_unsigned(1,16);
      end if;
     end if;
  end process count_up;

  total <= current_value; -- Keep it
于 2012-10-03T06:47:18.180 回答
3

看起来你的错误在你的测试台上。该信号t_total被映射到您的计数器组件的输出,但您正在使用分配total写入它。t_total <= (others => '0')如果您删除它,我认为您的问题将消失。

  uut : d_counter
    port map( rst => t_rst,
      clk => t_clk,
      do_count => t_do_count,
      total => t_total );

    clock : process is 
    begin

        t_clk <= '0'; wait for 10 ns;
        t_clk <= '1'; wait for 10 ns;
    end process clock;

    stimulus : process is
    begin
      t_rst <= '1';
      t_do_count <= '0';
      t_total <= (others =>'0'); <-- Do not assign to t_total (its an output)
于 2012-10-03T08:53:13.833 回答