正如标题所说,我需要编写一个vhdl代码,将32位向量和6位向量作为输入。我需要输出另一个32位向量,它等于输入32位向量,但它的第n位被翻转。 n = 6位向量的数量。这是我的代码,但不正确。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity flipMSB is
Port ( Anotf : in STD_LOGIC_VECTOR (31 downto 0);
count : in STD_LOGIC_VECTOR (5 downto 0);
Af : out STD_LOGIC_VECTOR (31 downto 0));
end flipMSB;
architecture bhv of flipMSB is
signal sig: STD_LOGIC_VECTOR(31 downto 0);
signal n : integer;
begin
n<=CONV_INTEGER(count);
sig<=Anotf;
sig(n)<=not sig(n);
Af<=sig;
end bhv;
答案 0 :(得分:0)
首先,6位数字最多可达64位,count
信号只需要5位!
第二
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
std_logic_arith
和numeric_std
存在冲突类型。由于std_logic_arith
和std_logic_unsigned
不是VHDL标准(和IEEE,尽管有库名称)的一部分,我建议您只使用numeric_std
。如果您使用VHDL-2008,则可以使用numeric_std_unsigned
。您需要将n <= conv_integer(count)
替换为n <= to_integer(unsigned(count))
最后,
sig<=Anotf;
sig(n)<=not sig(n);
将为位n
提供两个输出驱动程序,这很糟糕。如果你把这个逻辑放到一个过程中,那就没问题,因为第一次分配给sig(n)
会被覆盖(而不是被驱动两次):
process(Anotf, count)
variable n : natural;
begin
Af <= Anotf;
n := to_integer(unsigned(count));
Af(n) <= not Anotf(n);
end process;
可以这样想,如果两个进程驱动相同的信号,这会导致两个驱动程序(并发生冲突!)。流程外部的声明隐含在其自身的流程中。此外,在一个过程中,只有分配信号的最后一个语句才会生效。