首页 文章

VHDL STD_LOGIC_VECTOR通配符值

提问于
浏览
5

我've been trying to write a Finite State Machine in VHDL code for a simple 16-bit processor I'在Altera DE1板上实现 . 在有限状态机中,我有一个 CASE 语句来处理不同的16位指令,这些指令由16位STD_LOGIC_VECTOR引入FSM . 但是,我在有限状态机解码指令的解码状态下遇到了一些麻烦 . 其中一条指令是ADD,它将两个寄存器作为操作数,第三个作为目标寄存器 . 但是,我还有一个ADD指令,它将寄存器和5位立即数作为操作数,并将第二个寄存器作为目标 . 我的问题是在 CASE 语句中,我需要能够区分两个不同的ADD指令 . 所以,我认为如果我在 CASE 语句中使用"-"或"X"之类的通配符值,我只能用两种情况区分两者,而不是列出所有可能的寄存器/立即值组合 . 例如:

CASE IR IS --(IR stands for "Instruction Register")
      WHEN "0001------0-----" => (Go to 3-register add);
      WHEN "0001------1-----" => (Go to 2-register/immediate value add);
      WHEN OTHERS => (Do whatever);
    END CASE;

这些并不是我唯一的两条指令,我只是将这两条指令缩短了一点 . 当我编译并运行此代码时,处理器在进入“解码”状态时停止执行 . 此外,Quartus给出了许多警告,说“LC3FSM.vhd(37)中的VHDL选择警告:忽略包含元值的选择”“0001 ------ 0 -----”“”我在关于如何实现这一目标的损失 . 我真的不需要也可能不需要定义每个16位组合,我希望有一种方法可以在STD_LOGIC_VECTOR中使用通配符来最小化我必须定义的组合数 .

有人知道怎么做到这一点吗?

谢谢

2 回答

  • 5

    假设您不需要指令中的其他位,您可以通过使用预检查过程屏蔽其他位来解决此问题 . (或者只是确保在写指令时其他位被复位?)

    这真的是一个黑客 .

    假设IR存储为变量

    if IR(15 downto 12) == "0001" then
        IR := IR_in(15 downto 12) & "0000000" & IR_in(5) & "00000";
    else
        IR := IR_in
    end if;
    
    CASE IR IS --(IR stands for "Instruction Register")
      WHEN "0001000000000000" => (Go to 3-register add);
      WHEN "0001000000100000" => (Go to 2-register/immediate value add);
      WHEN OTHERS => (Do whatever);
    END CASE;
    

    或者假设您的指令经过深思熟虑(命令字的前四位或沿着这些行的东西?),您可以执行嵌套的case语句,并根据需要在这些子块中进行区分 .

  • 1

    不幸的是,这不可能完成 . 对于大多数用户而言,比较运算符 =case 比较意外地执行文字比较 . 这是因为 std_logic 类型只是一组字符,由于其他函数(例如 andor )的定义方式,它们碰巧执行逻辑值 .

    VHDL-2008引入了一个新的case语句 case? ,它可以按预期执行 - 您需要告诉编译器在VHDL 2008模式下运行 . 此外,VHDL 2008中有一个 ?= 运算符,它将两个值进行比较,并考虑了 - s .

    如果您仍然使用仍不支持VHDL 2008的编译器,请向供应商投诉 . 还有一个 std_match 函数允许您在较旧的VHDL版本中执行比较,但我没有意识到使 case 语句以这种方式工作 .

相关问题