【问题标题】:Why do I get no output at my VHDL multiplier?为什么我的 VHDL 乘法器没有输出?
【发布时间】:2015-08-03 09:50:06
【问题描述】:

我正在尝试制作一个 4 位乘法器。这是我的顶层设计:

这里有两个模块:

但是,当我尝试对此进行模拟时,我没有得到任何输出。我的测试平台:

    ARCHITECTURE behavior OF sim3 IS 

    -- Component Declaration for the Unit Under Test (UUT)

    COMPONENT multiplicator
    PORT(
         a : IN  std_logic_vector(3 downto 0);
         b : IN  std_logic_vector(3 downto 0);
         reset : IN  std_logic;
         clk : IN  std_logic;
         start : IN  std_logic;
         prod : OUT  std_logic_vector(7 downto 0);
         ready : OUT  std_logic
        );
    END COMPONENT;


   --Inputs
   signal a : std_logic_vector(3 downto 0) := (others => '0');
   signal b : std_logic_vector(3 downto 0) := (others => '0');
   signal reset : std_logic := '0';
   signal clk : std_logic := '0';
   signal start : std_logic := '0';

    --Outputs
   signal prod : std_logic_vector(7 downto 0);
   signal ready : std_logic;

   -- Clock period definitions
   constant clk_period : time := 10 ns;

BEGIN

    -- Instantiate the Unit Under Test (UUT)
   uut: multiplicator PORT MAP (
          a => a,
          b => b,
          reset => reset,
          clk => clk,
          start => start,
          prod => prod,
          ready => ready
        );

   -- Clock process definitions
   clk_process :process
   begin
        clk <= '0';
        wait for clk_period/2;
        clk <= '1';
        wait for clk_period/2;
   end process;


   -- Stimulus process
   stim_proc: process
   begin        
        wait for clk_period;
        reset<='1';
        wait for clk_period;
        reset<='0';
        a<="0011";
        b<="0010";
        start <='1';
        wait for clk_period*10;
   end process;

END;

当我将开始设置为“1”时,模拟就会停止。我不知道为什么。我收到以下错误:

ERROR: at 20 ns(10000): Iteration limit 10000 is reached. Possible zero delay oscillation detected where simulation can not advance in time because signals can not resolve to a stable value in File "D:/faculta/PL II/multiplicator/reg8.vhd" Line 45. Please correct this code in order to advance past the current simulation time.

我看不出那一行有什么问题:

q_s <= "00000000" WHEN reset='1' ELSE d WHEN reset='0' and load='1' ELSE q_s;

请帮忙?

【问题讨论】:

  • 您的reg8 实体内部发生错误。能够看到这段代码会很有用;您发布的一行不足以让我们看到循环在哪里。

标签: vhdl xilinx


【解决方案1】:

不要使用带负载使能的寄存器,使用时钟边沿寄存器。迭代限制是 ISIM 中的增量循环限制。在b 中引入“1”,您将得到一个引人注目的振荡器、一个具有增量周期延迟和反转(求和)的循环。使 num4、reg4 和 reg8 时钟沿驱动,其负载为启用,这似乎与 Lab10 兼容,后者显示了时钟的使用(以及 @scary_jeff 的 VHDL 源,尽管以 BIT 类型而不是 std_logic 表示)。 William Kafig 的书VHDL 101 Everything you need to know to get started中提到了这种反馈现象,第 4 章。

谷歌翻译有帮助。似乎从来没有人为他们的作业提供讲义。

如果您查看在reg4 中分配给q_s 的原始实现:

block1: 
    block (ck = '1' and not ck'stable)
    begin
        q_s <= guarded "0000" when reset = '1' else
                           d  when reset = '0' and load = '1' else
                         q_s;
    end block block1;

我会把它翻译成一个可综合的过程语句而不是一个块语句,明确reg4(和reg8)是一个时钟寄存器:

block1: 
    process (ck)
    begin
        if rising_edge(ck) then 
            if reset = '1' then
                q_s <= (others => '0');
            elsif load = '1' then
                q_s <= d;
            end if;
        end if;
    end process;

原来的工作原理是因为块语句可以有一个保护语句。

更改清楚地表明q_s 是具有同步复位的时钟寄存器。

您可能还注意到我们不再引用 q_s 并且可以直接分配 q。

在控制状态机中,将next_state 分配给current_state 的过程同样可以更新:

    process (ck)
    begin
        if ck'event and ck = '1' then  -- or rising_edge(ck)
            current_state <= next_state;
        end if;
    end process;

只是为了便于阅读。使用not ck'stable 表示时钟事件的形式并不常见,请注意您似乎也错过了实现reg8 的含义,可能在reg4automat 中也是如此。

受保护表达式作为边缘敏感时钟的综合资格在 IEEE Std 1076.6-2004 中得到证明, 6.1.3.6 使用保护块的边缘敏感存储。

【讨论】:

  • 这是更一般规则的一种情况:应避免异步顺序逻辑。任何足以有机会使其发挥作用的专家也明白为什么它很少适合。
  • @BenVoigt - 深入研究了这个问题后,我想这个问题来自“填空”创建一个reg8 未在实验室作业中显示,这是不了解使用保护语句来暗示边缘敏感寄存器。我使用 std_logic 成功复制了作业;
  • 谢谢大卫!我终于让它工作了,我现在有一个很好的模拟。问题是我实际上并不了解时钟信号的作用。这是一个非常好的解释,现在时钟很好。它运作良好。
  • 我也让它工作,虽然我使用了块语句而不是单独的 caledate 实体/架构。在 num4 中也看到了您的症状。有一个转录错误。只需要一个 reg8,prod 可以从累加器中输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2021-10-28
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多