2013-05-29 91 views
2

我在VHDL初学者,我有问题时,我决定是否应该初始化我的信号或不...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 < =“0000”; ?

   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; 

非常感谢,

回答

2

你需要的地方初始化它,否则你会得到一个锁存器。你的建议没有问题(尽管Q <= (others => '0')更具前瞻性),你可以在case语句中有一个default/others分支,在这里你给Q一个默认值。基本上,当你有像这样的组合过程时,无论输入的值是多少,都要确保驱动器总是有一个定义的值。如果不是,那么你正在推断某种记忆。

+0

感谢您的回复! 我也想知道,如果我只有一个alu(我的第二个过程),用F而不是Q,我是否应该初始化我的输出F(在我精确的位置)? 如果我理解的很好,我应该确保我不会生成无用的闩锁。 非常感谢! – ZouZou

+0

是的。记住:当灵敏度列表中的任何内容发生变化时,进程“运行”。如果进程被触发,并且进程执行,但它不*给任何你正在驾驶的信号分配任何东西(换句话说,一些执行分支改变信号,有些则不改变),那么进程必须建立在内存中保持信号状态不变。换句话说,一个锁存器。在某处放置默认分配,以便所有执行路径都分配给信号。 – EML

+0

我明白了!非常感谢! – ZouZou