我想比较两个二进制逻辑向量A和B.但是我的代码不会编译,我不知道为什么我不允许在这里使用比较语句 . 谁能帮我?我的问题是我是VHDL的新手,我需要一些提示
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--entity declaration of IC74x85 with port definitions
entity IC74x85 is
port( A : in std_logic_vector(3 downto 0); --input A is a 4 bit binary number
B : in std_logic_vector(3 downto 0); --input B is a 4 bit binary number
ALTBOUT : out std_logic; -- A < B
AEQBOUT : out std_logic; -- A = B
AGTBOUT : out std_logic -- A > B
);
end IC74x85;
--architecture of entity
architecture IC74x85_arch of IC74x85 is
begin
process(A,B)
begin
case A is
when (A < B) => ALTBOUT <= '1';
when (A > B) => AGTBOUT <= '1';
when (A = B) => AEQBOUT <= '1';
when others => ALTBOUT, AGTBOUT, AEQBOUT <= '0';
end case;
end process;
end IC74x85_arch;
**错误:C:/ Users / Steve / Desktop / Ass1 / case signal assignment.vhd(21):键入错误解析中缀表达式“<”作为类型ieee.std_logic_1164.STD_LOGIC_VECTOR .
**错误:C:/ Users / Steve / Desktop / Ass1 / case signal assignment.vhd(21):CASE语句中的选择替代必须是本地静态的 .
**错误:C:/ Users / Steve / Desktop / Ass1 / case signal assignment.vhd(22):键入错误解析中缀表达式“>”作为类型ieee.std_logic_1164.STD_LOGIC_VECTOR .
**错误:C:/ Users / Steve / Desktop / Ass1 / case signal assignment.vhd(22):CASE语句中的选择替代必须是本地静态的 .
**错误:C:/ Users / Steve / Desktop / Ass1 / case signal assignment.vhd(23):键入错误解析中缀表达式“=”作为类型ieee.std_logic_1164.STD_LOGIC_VECTOR .
**错误:C:/ Users / Steve / Desktop / Ass1 / case signal assignment.vhd(23):CASE语句中的选择替代必须是本地静态的 .
**错误:C:/ Users / Steve / Desktop / Ass1 / case signal assignment.vhd(24):near“,”:expecting <=或:=
3 回答
您尝试做的事情无法通过案例陈述来完成,但您可以简单地将其写为if-then-else . 此外,您无法在std_logic_vectors上使用
<
和>
之类的比较操作 - 这是需要数字解释的内容,因此您需要使用signed
或unsigned
类型,具体取决于您拥有的数字类型:首先,包括
ieee.numeric_std.all
:然后正确地转换数据类型以进行比较:
您不能使用case语句来执行此操作 . 您的错误消息说明原因:
您要求编译器根据
A
的值选择一个案例 . 您编写的代码是要求编译器将A
(一个slv)与A<B
(一个布尔值)进行比较 . 显然,这将永远不会奏效 .如前所述,这是
if-elsif-else
语句和signed
数据类型的作业 .但是,如果由于某种原因你真的想用
case
语句来表达这一点 - 就像在:“嘿,如果你能用VHBDL语句用case
语句写这个并且没有if-elsif-else
语句,我会给你一大笔钱 . “可以办到 . Joe Engineer会将A
和B
(假设A
和B
为4位宽)连接成一个8位std_logic_vector
,称为C
. 然后Joe会用C
写一个case
并且有256个when
语句 - 每个when
会将ALTBOUT
,AGTBOUT
和AEQBOUT
设置为每个8位模式的正确值 .当然,这是一个愚蠢的方式来做到这一点(除非有人会给你一大笔钱:-)!
BTW:wjl给了什么:
(对不起,我不能将评论留给答案,或者我会评论mjl的答案)可以改进(超出推断的锁存问题):没有理由测试
A==B
. 如果NOT (A<B)
和NOT (A>B)
则A
必须等于B
.