首页 文章

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

提问于
浏览
-2

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

  • 1

    您尝试做的事情无法通过案例陈述来完成,但您可以简单地将其写为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

    您不能使用case语句来执行此操作 . 您的错误消息说明原因:

    键入错误解析中缀表达式“<”作为类型ieee.std_logic_1164.STD_LOGIC_VECTOR .

    您要求编译器根据 A 的值选择一个案例 . 您编写的代码是要求编译器将 A (一个slv)与 A<B (一个布尔值)进行比较 . 显然,这将永远不会奏效 .

  • 2

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

    但是,如果由于某种原因你真的想用 case 语句来表达这一点 - 就像在:“嘿,如果你能用VHBDL语句用 case 语句写这个并且没有 if-elsif-else 语句,我会给你一大笔钱 . “可以办到 . Joe Engineer会将 AB (假设 AB 为4位宽)连接成一个8位 std_logic_vector ,称为 C . 然后Joe会用 C 写一个 case 并且有256个 when 语句 - 每个 when 会将 ALTBOUTAGTBOUTAEQBOUT 设置为每个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;
    

相关问题