我想比较两个二进制逻辑向量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):输入错误解析中缀表达式“&lt;”作为类型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):输入错误解析中缀表达式“&gt;”作为类型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&lt; = or:=
答案 0 :(得分:2)
您尝试做的事情无法通过案例陈述来完成,但您可以简单地将其写为if-then-else。此外,您无法在std_logic_vectors上使用<
和>
等比较操作 - 这需要进行数字解释,因此您需要使用signed
或unsigned
类型取决于您拥有的数字类型:
首先,加入ieee.numeric_std.all
:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
然后正确地转换数据类型以进行比较:
process(A,B)
begin
if signed(A) < signed(B) then ALTBOUT <= '1';
elsif signed(A) > signed(B) then AGTBOUT <= '1';
else signed(A) = signed(B) then AEQBOUT <= '1';
else ALTBOUT <=0; AGTBOUT <=0; AEQBOUT <= '0';
end if;
end process;
答案 1 :(得分:1)
您无法使用案例陈述来执行此操作。您的错误消息说明原因:
键入错误解析中缀表达式“&lt;”作为类型ieee.std_logic_1164.STD_LOGIC_VECTOR。
您要求编译器根据A
的值选择案例。您编写的代码是要求编译器将A
(一个slv)与A<B
进行比较,这是一个布尔值。显然,这不会奏效。
答案 2 :(得分:0)
如前所述,这是if-elsif-else
语句和signed
数据类型的作业。
然而,如果由于某种原因你真的想用case
语句来做这件事 - 如:“嘿,如果你能用VHDL用VHDL编写这个,我会给你一大笔钱。 case
语句,没有if-elsif-else
语句。“可以办到。 Joe Engineer将A
和B
连接在一起(假设A
和B
为4位宽)到8位std_logic_vector
,称为C
。然后Joe会用case
写一个C
并有256个when
语句 - 每个when
都设置ALTBOUT
,AGTBOUT
和{{ 1}}为每个8位模式的正确值。
当然,这是一种愚蠢的方式(除非有人会给你一大笔钱:-)!
BTW:wjl给了什么:AEQBOUT
(抱歉,我不能将评论留给答案,或者我会评论mjl的答案)可以改进(超出推断的锁存问题):没有理由测试process(A,B)
begin
if signed(A) < signed(B) then ALTBOUT <= '1';
elsif signed(A) > signed(B) then AGTBOUT <= '1';
elsif signed(A) = signed(B) then AEQBOUT <= '1';
else ALTBOUT <=0; AGTBOUT <=0; AEQBOUT <= '0';
end if;
end process;
。如果A==B
和NOT (A<B)
则NOT (A>B)
必须等于A
。
B