VHDL 代码:非法类型转换 std_logic_vector

VHDL Code: Illegal type conversion converting std_logic_vector

我正在尝试将行中的值相乘:

Q<= unsigned(reg_output) or (unsigned(multiplicand) and unsigned(shifted_lsb)*"0010");

注意:我知道被乘数是 std_logic_vector,我这样做是为了通过 if 进行比较。

每次编译都会出现错误: 从 ieee.std_logic_1164.STD_LOGIC 到 ieee.NUMERIC_STD.UNSIGNED(非数字到数组)的非法类型转换。

下面是我的代码:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all; 
entity shiftaddr is
 port(
 clk, clear : in std_logic;
 multiplicand: in std_logic_vector(3 downto 0);
 reg_output: in unsigned(7 downto 0);
 shifted_lsb: in std_logic;
 Q: out unsigned(7 downto 0) );
end shiftaddr;

architecture arch of shiftaddr is
 signal temp: std_logic_vector(3 downto 0);
begin

 shift: process(clk,clear,multiplicand, shifted_lsb,reg_output) --Define a process and state the inputs


begin

if (clk = '0') then
 Q <= reg_output;
end if;

if (clk = '1') then


    if (multiplicand(0) = '1') then Q <= (reg_output);
    end if;

    if (multiplicand(1) = '1') then 
    Q<= unsigned(reg_output) or (unsigned(multiplicand) and unsigned(shifted_lsb)*"0010");
    end if;
end if;

 end process;
end arch;

我该如何解决这个问题?谢谢

问题来自:

unsigned(shifted_lsb)*"0010"

shifted_lsb 不是向量,不能将其转换为向量类型的 unsigned。正如 Khanh N. Dang 所建议的,您可以只测试它的值。

但是您的代码可能是伪造的:您的敏感度列表不是同步过程的敏感度列表,而您的一个信号被命名为 clk。此外,如果您希望您的过程是同步的,您将遇到问题,因为您正在使用时钟的两种状态。您可能应该:

  • 缩进你的代码,这样我们就可以毫不费力地阅读它,
  • 首先考虑硬件:如果您对所需的硬件(寄存器、加法器、多路复用器...)有清晰的认识,编码通常会变得非常容易,
  • 再读一遍教科书中关于同步进程的部分。