VHDL错误错误(10822):无法为assignm实现寄存器

时间:2013-12-16 04:57:37

标签: vhdl intel-fpga

我尝试用异步Preset和Clear实现一个JK触发器,时钟上有正边沿逻辑。

我从Altera Quartus II收到以下错误:

  

错误(10822):JK_FF_PE_D1.vhd(52)处的HDL错误:无法在此时钟边沿上为分配实现寄存器

     

错误:无法详细说明顶级用户层次结构

我没有看到错误......我会非常感谢提示或建议。

提前谢谢!

library ieee;
use ieee.std_logic_1164.all;

entity JK_FF_PE_D1 is
  port(
    J, K        : in    std_logic;  -- J, K inputs of flip flop
    PS          : in    std_logic;  -- Preset of flip flop
    CLR         : in    std_logic;  -- CLR of flip flop
    CLK         : in    std_logic;  -- Clock 
    Q, Qcompl   : out   std_logic  -- Q and its complementary output
    );
end entity JK_FF_PE_D1;

architecture simple of JK_FF_PE_D1 is
  signal temp_Q, temp_Qcompl : std_logic;

begin

  p0:process(PS, CLR, CLK) is
  begin
     case std_logic_vector'(PS, CLR) is
          when "00" =>
            temp_Q <= '1';
            temp_Qcompl <= '1';
          when "01" =>
            temp_Q <= '1';
            temp_Qcompl <= '0';
          when "10" =>
             temp_Q <= '0';
             temp_Qcompl <= '1';
          when others =>   -- Preset = 1 , Clear = 1
             if rising_edge (CLK) then  -- Clock turns from 0 -> 1
               case std_logic_vector'(J, K) is
                    when "11" =>
                      temp_Q <= not temp_Q;
                      temp_Qcompl <= not temp_Qcompl;
                    when "10" =>
                      temp_Q <= '1';
                      temp_Qcompl <= '0';
                    when "01" =>
                      temp_Q <= '0';
                      temp_Qcompl <= '1';
                    when others =>
                      null;
               end case;
             end if;
     end case;
  end process p0;
  Q <= temp_Q;
  Qcompl <= not temp_Qcompl;

end architecture simple;

1 个答案:

答案 0 :(得分:0)

它看起来像Altera Quartus II中的限制,因为外部case可能会更改为if,如下所示,然后它可以通过综合运行:

p0 : process(ps, CLR, CLK) is
begin
  if std_logic_vector'(ps, CLR) = "00" then
    temp_Q      <= '1';
    temp_Qcompl <= '1';
  elsif std_logic_vector'(ps, CLR) = "01" then
    temp_Q      <= '1';
    temp_Qcompl <= '0';
  elsif std_logic_vector'(ps, CLR) = "10" then
    temp_Q      <= '0';
    temp_Qcompl <= '1';
  else                              -- Preset = 1 , Clear = 1
    if rising_edge (CLK) then       -- Clock turns from 0 -> 1
      case std_logic_vector'(J, K) is
        when "11" =>
          temp_Q      <= not temp_Q;
          temp_Qcompl <= not temp_Qcompl;
        when "10" =>
          temp_Q      <= '1';
          temp_Qcompl <= '0';
        when "01" =>
          temp_Q      <= '0';
          temp_Qcompl <= '1';
        when others =>
          null;
      end case;
    end if;
  end if;
end process p0;

如果特定目标设备不允许同步设置和重置的触发器,则会发出警告。