我尝试用异步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;
答案 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;
如果特定目标设备不允许同步设置和重置的触发器,则会发出警告。