在 VHDL 中,如何检测二进制输入是否可被 3 或 4 整除?

In VHDL, how do I detect if a binary input is divisible by 3 or 4?

我的代码会将输入作为数字的二进制表示形式,介于 0 和 15 之间(包括两者)。

我的目标是检查输入是否可被 3 或 4 整除,如果是:输出 1 并使用 ONLY NOR GATES[ 实现此功能=29=].

我用了K-Map方法推导出了函数公式。以下是: ABCD是我的输入,4位,

F = (A'+C'+D)(A'+B+C')(A+C+D')(A+B+C'+D)(A+B'+C '+D')(A'+B'+C+D')

我已经实现了我的公式如下:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity kod is
   Port ( X : in  STD_LOGIC_VECTOR (3 downto 0);
          O : out  STD_LOGIC);
end kod;

architecture Behavioral of kod is

    -- Following are intermediate signals
    signal CCC : STD_LOGIC;
    signal MMM : STD_LOGIC;
    signal EEE : STD_LOGIC;
    signal RRR : STD_LOGIC;
    signal TTT : STD_LOGIC;
    signal DDD : STD_LOGIC;

begin

    CCC <= NOT ((NOT X(3)) OR (NOT X(1)) OR X(0)) ;
    MMM <= NOT ((NOT X(3)) OR X(2) OR (NOT X(1))) ;
    EEE <= NOT (X(3) OR X(1) OR (NOT X(0))) ;
    RRR <= NOT (X(3) OR X(2) OR (NOT X(1)) OR X(0));
    TTT <= NOT (X(3) OR (NOT X(2)) OR (NOT X(1)) OR (NOT X(0)));
    DDD <= NOT ((NOT X(3)) OR (NOT X(2)) OR X(1) OR (NOT X(0)));

    O <= NOT (CCC OR MMM OR EEE OR RRR OR TTT OR DDD) ;


end Behavioral;

当我模拟我的代码时,我发现我的所有信号都未初始化。当我尝试将输入初始化为:

entity kod is
   Port ( X : in  STD_LOGIC_VECTOR (3 downto 0) := "0000";
          O : out  STD_LOGIC);
end kod;

我只得到 1 作为输出。 我的错在哪里,我该如何解决?

您的方程接受“0000”:

我添加了一个术语来排除“0000”以及一个小测试台:

library ieee;
use ieee.std_logic_1164.all;

entity kod is  -- is x divisble by 3 or 4?
    port (
        x:  in  std_logic_vector (3 downto 0);
        o:  out  std_logic
    );
end entity kod;

architecture behavioral of kod is

    -- following are intermediate signals
    signal ccc:    std_logic;
    signal mmm:    std_logic;
    signal eee:    std_logic;
    signal rrr:    std_logic;
    signal ttt:    std_logic;
    signal ddd:    std_logic;

    signal zero:   std_logic;  -- added

begin

    ccc  <= not (not x(3) or             not x(1) or     x(0));
    mmm  <= not (not x(3) or     x(2) or not x(1)            );
    eee  <= not (    x(3) or                 x(1) or not x(0));
    rrr  <= not (    x(3) or     x(2) or not x(1) or     x(0));
    ttt  <= not (    x(3) or not x(2) or not x(1) or not x(0));
    ddd  <= not (not x(3) or not x(2) or     x(1) or not x(0));

    zero <= not (    x(3) or     x(2) or     x(1) or     x(0)); -- added term

    o <= not (ccc or mmm or eee or rrr or ttt or ddd or zero); -- ddd);

end architecture behavioral;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity kod_tb is
end entity;

architecture foo of kod_tb is
    signal x:   std_logic_vector (3 downto 0);
    signal o:   std_logic;
begin
DUT: 
    entity work.kod
        port map (
            x => x,
            o => o
        );
STIMULIS:
    process
    begin
        wait for 10 ns;
        for i in 0 to 15 loop
            x <= std_logic_vector(to_unsigned(i,4));
            wait for 10 ns;
        end loop;
        wait;
    end process;
end architecture;

(请原谅我为了便于阅读删除了多余的括号和格式)。

这给出:

如果您直接模拟您的实体 kod 而没有为您的输入指定默认值(就像您第一次尝试时那样),那么输入 X 的值将是 "UUUU"。值 'U' 是类型 std_logic 信号的默认值。类型 std_logic 是 9 个可能值的枚举,例如,“0”表示(强)逻辑低,“1”表示(强)逻辑高。值 'U' 表示信号尚未初始化。它要么尚未分配,要么由于表达式而分配了 'U'。您可以在 VHDL 标准之一或 VHDL 工具附带的包 std_logic_1164 的文件中查找 std_logic 上的布尔运算符的 thruth-table。 (例如,它在 Quartus 工具链中被命名为 std_1164.vhd。)

您可以使用更简单的示例重现观察到的行为:

library ieee;
use ieee.std_logic_1164.all;

entity test1 is
  port (
    x : in std_logic;
    y : out std_logic);
end test1;

architecture rtl of test1 is
begin
  y <= x;
end rtl;

这是模拟输出:

要删除未初始化的值,您必须为 X 指定另一个默认值。在您的示例中,您为 4 位输入向量指定了“0000”。输出 O 不再是未定义的。这是错误的('1'),因为您的方程式中存在错误。您可以解决这个问题,方法是扩展最后一个等式以在输入全为零时将输出设置为“0”,如 "user1155120".

所示