1

我正在尝试在 VHDL 中实现 JK 触发器,这是我的代码:

library ieee;
use ieee.std_logic_1164.all;

entity jk_flip_flop is
port(
    J, K     : in std_logic;
    clk      : in std_logic;
    Q, Q_bar : out std_logic
);
end jk_flip_flop;

architecture behavioral of jk_flip_flop is
begin
   process(J, K, clk)
        variable temp: std_logic;
   begin
        if (clk'event and clk='1') then
             temp:='1' when(J='1' AND K='0') else
                    '0' when(J='0' AND K='1') else
                    NOT temp when(J='1' AND K='1') else
                    temp when(J='0' AND K='0');
              Q <= temp;
              Q_bar <= NOT temp;
         end if;
    end process;
end behavioral;

我从中得到的错误是:

Error (10500): VHDL syntax error at jk_flip_flop.vhd(18) near text "when";  expecting ";"
Error (10500): VHDL syntax error at jk_flip_flop.vhd(18) near text "else";  expecting ":=", or "<="
Error (10500): VHDL syntax error at jk_flip_flop.vhd(19) near text "else";  expecting ":=", or "<="
Error (10500): VHDL syntax error at jk_flip_flop.vhd(20) near text "else";  expecting ":=", or "<="
Error (10500): VHDL syntax error at jk_flip_flop.vhd(21) near text ";";  expecting ":=", or "<="

这里到底有什么问题?我是否不允许在进程中使用 when-else 或者 when-else 语句的语法在这里错误?

我也很困惑是否需要通过JK进入process上面,或者如果我只通过就足够了clk,因为如果在时钟脉冲的上升沿产生新的输出就足够了。

4

1 回答 1

2

因此,您的temp := value when ... else ...声明仅适用于流程声明之外。所以你有三个选择。

选项1

升级到 VHDL 2008,您也可以在进程中使用这种语句。

选项 2

使用全局变量来存储下一个值...类似于:

architecture behavioral of jk_flip_flop is
   signal Q_val: std_logic;
   signal Q_next: std_logic;
begin
   Q_next <= '1' when(J='1' AND K='0') else
             '0' when(J='0' AND K='1') else
             NOT Q_val when(J='1' AND K='1') else
             Q_val;
   Q <= Q_next;
   Q_bar <= not Q_val;

   process(clk)
   begin
        if (clk'event and clk='1') then
             Q_val := Q_next;
         end if;
    end process;
end behavioral;

选项 3

使用 ifs 而不是 when。

architecture behavioral of jk_flip_flop is
begin
   process(J, K, clk)
        variable temp: std_logic;
   begin
        if (clk'event and clk='1') then
             if (J='1' and K='0') then
               temp := '1';
             elsif (J='0' AND K='1') then
               temp := '0';
             elsif (J='1' AND K='1') then
               temp := NOT temp;
             end if;
             Q <= temp;
             Q_bar <= NOT temp;
         end if;
    end process;
end behavioral;

我不确定这是否可行……我认为 temp 需要在架构级别定义才能有记忆……但我可能错了。

在敏感列表上...

我也很困惑是否需要将 J 和 K 传递到上面的过程中,或者如果我只传递 clk 就足够了,因为如果在时钟脉冲的上升沿产生新的输出就足够了。

你只需要通过clk

于 2022-03-02T05:22:36.970 回答