【问题标题】:VHDL : signal initialisationVHDL:信号初始化
【发布时间】:2013-05-29 13:02:29
【问题描述】:

我是 VHDL 的初学者,在决定是否应该初始化信号时遇到问题...

这是一个例子:

            entity tatoo is 
            port (
            clk, reset : in std_logic;  
            opcode : in std_logic_vector(2 downto 0); 
            A, B : in std_logic_vector(3 downto 0);
            F : out std_logic_vector(3 downto 0)
            ); 

            architecture toota of tatoo is 
            signal Q : std_logic_vector(3 downto 0);

            begin

            process (clk, reset) -- register for F
            begin
                if(reset = '1')
                    then F <= "0000";
                elsif(Clk'event and Clk = '1')
                    then F <= Q;
                end if;
            end process;

            process(opcode, A, B) -- ALU
            begin 

我应该在这里初始化 Q 吗? => Q

                case opcode is 
                    when "00" =>
                        Q <= "0000";
                    when "01" =>
                        Q <= A-B;
                    when "10" => 
                        Q <= B-A;
                    when "11" =>
                        Q <= A xor B;
                end case;
            end process;

非常感谢,

【问题讨论】:

    标签: initialization signals vhdl alu


    【解决方案1】:

    你需要在某个地方初始化它,否则你会得到一个闩锁。您的建议很好(尽管 Q &lt;= (others =&gt; '0') 更具前瞻性),您可以在 case 语句中有一个 default/others 分支,您可以在其中给 Q 一个默认值。基本上,当您有这样的组合过程时,请确保您的驱动器始终具有定义的值,无论输入的值是多少。如果不是,你是在推断某种记忆。

    【讨论】:

    • 感谢您的回复!我还想知道,如果我只有一个 alu(我的第二个进程),用 F 而不是 Q,我应该初始化我的输出 F(在我精确的同一个地方)吗?如果我理解得很好,我应该确保我不会产生无用的闩锁。非常感谢!
    • 是的。请记住:当敏感度列表中的任何内容发生变化时,进程就会“运行”。如果进程被触发,并且进程执行,但它确实没有为您正在驱动的信号分配任何东西(换句话说,一些执行分支会更改信号,而有些则不会),然后该过程必须在内存中构建以保持该信号的状态不变。换句话说,一个闩锁。在某处放置默认分配,以便所有执行路径都分配给信号。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多