4位幅度比较器VHDL
我必须用VHDL语言制作一个4位的幅度比较器,它只有并发语句(没有if/else或case/when)4位幅度比较器VHDL,vhdl,comparator,magnitude,Vhdl,Comparator,Magnitude,我必须用VHDL语言制作一个4位的幅度比较器,它只有并发语句(没有if/else或case/when) IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 实体练习是 端口(A:标准逻辑向量(3到0); B:标准逻辑向量(3到0); Ag:输出标准逻辑; Bg:输出标准逻辑; AeqB:输出标准逻辑 ); 结束练习; 练习的架构比较器是 开始 Ag B)否则为“0”; Bg A)其他“0”--问题:这里如果我算出B=“ZZZZ”,Bg是1,如果B>A AeqB一般情况下,您
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体练习是
端口(A:标准逻辑向量(3到0);
B:标准逻辑向量(3到0);
Ag:输出标准逻辑;
Bg:输出标准逻辑;
AeqB:输出标准逻辑
);
结束练习;
练习的架构比较器是
开始
Ag B)否则为“0”;
Bg A)其他“0”--问题:这里如果我算出B=“ZZZZ”,Bg是1,如果B>A
AeqB一般情况下,您可以使用to_01
功能将std_逻辑可采用的各种值“转换”为0
或1
。我认为它在IEEE的软件包数字标准库中;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity comp_4 is
port ( A:IN STD_LOGIC_VECTOR(0 to 3);
B:IN STD_LOGIC_VECTOR(0 to 3);
ET:OUT STD_LOGIC;
GT:OUT STD_LOGIC;
LT:OUT STD_LOGIC);
end comp_4;
architecture dataflow of comp_4 is
begin
with A-B(0 to 3) select
ET <= '1' when "0000",
'0' when others;
with A > B select
GT <= '1' when true,
'0' when others;
with A < B select
LT <= '1' when true,
'0' when others;
end dataflow;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体comp_4为
端口(A:标准逻辑向量(0到3);
B:标准逻辑向量(0到3);
ET:输出标准逻辑;
GT:输出标准逻辑;
LT:输出标准(U逻辑);
结束comp_4;
comp_4的体系结构数据流是
开始
使用A-B(0到3)选择
ET B选择
GT如果你对量值的定义是通常的算术定义,那么你最好使用数值_std,它会将你的向量视为数值数据。然后,您必须确定它们是有符号的还是无符号的数字,并分别声明它们为有符号的
或无符号的
(或执行适当形式的类型转换)。通常,通过使用包数字\u std\u unsigned(-2008),可以将std\u逻辑\u向量视为无符号的,它对各种运算符(包括关系运算符)使用带有类型转换为无符号的数值_std调用。这是元值和二进制值之间的冲突,如果任一操作数包含元值,则numeric_std将其解析为FALSE。默认运算符(本例中为IEEE Std 1076-2008 9.2.3关系运算符)在枚举的Std_ulogic类型定义中是纯位置顺序,并且“Z”的位置高于“1”或“0”。许多工具仍然缺乏VHDL2008支持,包括Xilinx,因此,您可能还不想使用numeric_std_unsigned。我编写的代码试图使用with-select-when语句对4位比较器进行建模。实体定义非常简单。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity comp_4 is
port ( A:IN STD_LOGIC_VECTOR(0 to 3);
B:IN STD_LOGIC_VECTOR(0 to 3);
ET:OUT STD_LOGIC;
GT:OUT STD_LOGIC;
LT:OUT STD_LOGIC);
end comp_4;
architecture dataflow of comp_4 is
begin
with A-B(0 to 3) select
ET <= '1' when "0000",
'0' when others;
with A > B select
GT <= '1' when true,
'0' when others;
with A < B select
LT <= '1' when true,
'0' when others;
end dataflow;