【问题标题】:VHDL reassigning integer signal does not work according to `report` statement根据“报告”语句,VHDL重新分配整数信号不起作用
【发布时间】:2016-11-06 13:35:47
【问题描述】:

我有这个简单的 VHDL 代码aufg4.vhd:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity aufg4 is
    Port ( 
        clock : in  std_logic
            );
end aufg4;

architecture Behavioral of aufg4 is

    signal tut_counter : integer range 0 to 90 := 0; -- counts tutorial time

begin

    do_process :process(clock)
        begin
            if(rising_edge(clock)) then
                report "tut_counter " & integer'image(tut_counter);
                if(tut_counter >= 90) then
                    tut_counter <= 0;   
                    report "tut_counter reset";
                end if;
                tut_counter <= tut_counter + 1;
            end if;
        end process;

end Behavioral;

还有测试平台aufg4_tb.vhd

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY aufg4_tb IS
END aufg4_tb;

ARCHITECTURE behavior OF aufg4_tb IS 

     COMPONENT aufg4
     PORT(
        clock : IN  std_logic
          );
     END COMPONENT;

    --Inputs
    signal clock : std_logic := '0';

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

BEGIN

    -- Instantiate the Unit Under Test (UUT)
    uut: aufg4 PORT MAP (
    clock => clock
          );

    -- Clock process definitions
    clock_process :process
    begin
        clock <= '0';
        wait for clock_period/2;
        clock <= '1';
        wait for clock_period/2;
    end process;

END;

当我模拟行为模型report 输出时:

 ...
at 885 ns(1): Note: tut_counter 88 (/aufg4_tb/uut/).
at 895 ns(1): Note: tut_counter 89 (/aufg4_tb/uut/).
at 905 ns(1): Note: tut_counter 90 (/aufg4_tb/uut/).
at 905 ns(1): Note: tut_counter reset (/aufg4_tb/uut/).
at 915 ns(1): Note: tut_counter 91 (/aufg4_tb/uut/).
at 915 ns(1): Note: tut_counter reset (/aufg4_tb/uut/).
at 925 ns(1): Note: tut_counter 92 (/aufg4_tb/uut/).
at 925 ns(1): Note: tut_counter reset (/aufg4_tb/uut/).
at 935 ns(1): Note: tut_counter 93 (/aufg4_tb/uut/).
...

所以if-statement 可以正常工作,但是信号tut_counter 的重新分配不起作用。

那是为什么呢?

为什么模拟没有通过错误,因为tut_counter 的范围只是0 to 90

【问题讨论】:

  • +1 顺便问了一个很好的问题。至于为什么它不报告错误 - 大胆猜测,您使用的是 Xilinx ISIM。默认情况下它已损坏,并且多年来一直如此,但是有一个“属性”选项(我认为在“高级”选项卡下)可以打开范围检查并修复它..
  • @BrianDrummond 我怎样才能让这种重新分配event 正常工作?
  • 记住“最后一个任务获胜”,还有一个 else 关键字。
  • 只是为了澄清布赖恩关于“最后一个任务获胜”的回答。 顺序进程就是这种情况。并发分配发生在“同一时间”(粗略地说,每个都发生在不同的增量周期 - 但相同的时间值(ps、ns等)。

标签: vhdl xilinx-ise


【解决方案1】:

使用else 可以很好地解决问题!

do_process :process(clock)
    begin
        if(rising_edge(clock)) then
            report "tut_counter " & integer'image(tut_counter);
            if(tut_counter >= 90) then
                tut_counter := 0;   
                report "tut_counter reset";
            else
                tut_counter := tut_counter + 1;
            end if;
        end if;
    end process;

否则你可以使用一个变量:variable tut_counter : integer range 0 to 90 := 0; -- counts tutorial time

【讨论】:

  • 排序。这会将计数器重置为 1,而不是 0。因此,您将获得 0、1、2、...、90、1、2、3、...、90、1、2、...。请注意 Brian 关于 else 声明的观点。
  • 除了这实际上不能解决问题的那一点之外,使用信号可以完美工作的变量是产生低效合成硬件和难以识别错误的好方法。如果您刚刚将“tut_counter &lt;= tut_counter + 1;”行移动到“if(tut_counter &gt;= 90) then”的else 子句中,它会工作得很好(也避免覆盖分配)。
  • 是的,我知道... @QuantumRipple 为什么如果不允许使用 VHDL 有变量?
  • @goulashsoup 与 C 具有指针/动态分配的原因相同,您很容易导致内存泄漏;它们有有效的用途。在某些地方,变量可以大大简化表示,并且某些硬件无法在没有变量的情况下以模块化(参数化)方式进行描述。它们也非常适合用于仅模拟代码,您可以将 VHDL 更像是软件而不是描述硬件。然而,就像指针一样,它们很危险,可能不应该在不需要的地方使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多