如何在VHDL的case语句中使用中缀表达式?

时间:2014-02-13 00:44:39

标签: vhdl

我想比较两个二进制逻辑向量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:=

3 个答案:

答案 0 :(得分:2)

您尝试做的事情无法通过案例陈述来完成,但您可以简单地将其写为if-then-else。此外,您无法在std_logic_vectors上使用<>等比较操作 - 这需要进行数字解释,因此您需要使用signedunsigned类型取决于您拥有的数字类型:

首先,加入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将AB连接在一起(假设AB为4位宽)到8位std_logic_vector,称为C。然后Joe会用case写一个C并有256个when语句 - 每个when都设置ALTBOUTAGTBOUT和{{ 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==BNOT (A<B)NOT (A>B)必须等于A

B