2014-02-13 29 views
-2

我想比较两个二进制逻辑向量A和B.但是我的代码不会编译,我不知道为什么我不允许在这里使用比较语句。谁能帮我?我的问题是,我是新来的VHDL和我需要一些技巧如何在VHDL的case语句中使用中缀表达式?

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:/用户/史蒂夫/桌面/ ASS1 /事例信号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:/用户/史蒂夫/桌面/ ASS1 /事例信号assignment.vhd(24):近 “”:期待< =或:=

+0

使用的[如果声明】(http://www.nandland.com/vhdl/examples/example-if-statement.html) – Russell

+0

我怎么使用一个case语句里面的if语句? – Steven

+0

您的case语句可以被一系列'if','elseif'和'else'语句完全替换。 – Rob

回答

2

你正在尝试做不能用case语句来完成,但你可以简单地把它写成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; 
+0

你绝对可以在一维数组上使用VHDL比较运算符。我只需要让它在case语句中工作 – Steven

+0

@Steven:除非包含定义如何解释位的其他包,否则不能在std_logic_vectors上进行比较。 'ieee.std_logic_arith'是一个常见的,但[技术上不应该使用,](http://parallelpoints.com/numbers-in-vhdl/)包。 –

1

不能使用一个case语句来做到这一点。您的错误消息说明原因:

Type error resolving infix expression "<" as type ieee.std_logic_1164.STD_LOGIC_VECTOR.

您正在要求编译器根据A的值选择一个案例。你写的代码是要求编译器比较A(一个slv)和A<B这是一个布尔值。很显然,这是行不通的。

0

如前所述,这是if-elsif-else语句和signed数据类型的作业。

但是,如果由于某种原因,你真的想这样一个case声明 - 如:“嘿,乔,我给你钱的大包,如果你能在VHDL使用case语句写这一点,没有if-elsif-else陈述。“可以办到。Joe工程师将AB连接在一起(假定AB是4位宽)到一个称为C的8位std_logic_vector中。然后Joe将写caseC并且有256 when语句 - 每个when将设置ALTBOUT,AGTBOUTAEQBOUT为每个8位模式的正确值。

当然,这是一个愚蠢的方式来做到这一点(除非有人会给你一大笔钱:-)!

BTW:什么WJL了:

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; 

(对不起,我不能发表评论来解答,但是,否则我将在MJL的答案评论)可改善(超出推断锁问题):有没有理由测试A==B。如果NOT (A<B)NOT (A>B)A必须等于B

process(A,B) 
begin 
    ALTBOUT <=0; AGTBOUT <=0; AEQBOUT <= '0'; 
    if signed(A) < signed(B) then ALTBOUT <= '1'; 
    elsif signed(A) > signed(B) then AGTBOUT <= '1'; 
    else        AEQBOUT <= '1'; 
    end if; 
end process;