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
。此外,如果您希望您的过程是同步的,您将遇到问题,因为您正在使用时钟的两种状态。您可能应该:
- 缩进你的代码,这样我们就可以毫不费力地阅读它,
- 首先考虑硬件:如果您对所需的硬件(寄存器、加法器、多路复用器...)有清晰的认识,编码通常会变得非常容易,
- 再读一遍教科书中关于同步进程的部分。
我正在尝试将行中的值相乘:
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
。此外,如果您希望您的过程是同步的,您将遇到问题,因为您正在使用时钟的两种状态。您可能应该:
- 缩进你的代码,这样我们就可以毫不费力地阅读它,
- 首先考虑硬件:如果您对所需的硬件(寄存器、加法器、多路复用器...)有清晰的认识,编码通常会变得非常容易,
- 再读一遍教科书中关于同步进程的部分。