编写翻转第n位的代码

时间:2015-04-11 00:20:08

标签: vhdl

正如标题所说,我需要编写一个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;

1 个答案:

答案 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_arithnumeric_std存在冲突类型。由于std_logic_arithstd_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;

可以这样想,如果两个进程驱动相同的信号,这会导致两个驱动程序(并发生冲突!)。流程外部的声明隐含在其自身的流程中。此外,在一个过程中,只有分配信号的最后一个语句才会生效。