在 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".
所示
我的代码会将输入作为数字的二进制表示形式,介于 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".