Vhdl 右移和左移(SLL/SRL)

Vhdl 右移和左移(SLL/SRL),vhdl,fpga,intel-fpga,Vhdl,Fpga,Intel Fpga,所以,我正在为MIPS架构开发一个ALU,我正在尝试左移和右移,这样ALU可以移动任意数量的位 我的想法是将移位值转换为整数,并选择结果中的条目(整数存储在X中),但Quartus不接受变量值,只接受常量 我该怎么做才能做到这一点? (案例在“当“1000”=>…”和“当“1001”=>…”行上) 谢谢 PROCESS ( ALU_ctl, Ainput, Binput, X ) BEGIN -- Select ALU operation --ALU_ou

所以,我正在为MIPS架构开发一个ALU,我正在尝试左移和右移,这样ALU可以移动任意数量的位

我的想法是将移位值转换为整数,并选择结果中的条目(整数存储在X中),但Quartus不接受变量值,只接受常量

我该怎么做才能做到这一点? (案例在“当“1000”=>…”和“当“1001”=>…”行上)

谢谢

PROCESS ( ALU_ctl, Ainput, Binput, X )
BEGIN
                -- Select ALU operation
    --ALU_output_mux <= X"00000000"; --padrao   
CASE ALU_ctl IS
    WHEN "1000" =>  ALU_output_mux(31 DOWNTO X) <= (Ainput( 31-X DOWNTO 0 ));
    WHEN "1001" =>  ALU_output_mux(31-X DOWNTO 0) <= (Ainput( 31 DOWNTO X ));
    WHEN OTHERS =>  ALU_output_mux  <= X"00000000";
END CASE;
END PROCESS;
进程(ALU\U ctl、Ainput、Binput、X)
开始
--选择ALU操作

--ALU_-output_-mux ALU_-output_-mux(31向下到X)ALU_-output_-mux(31-X向下到0)ALU_-output_-mux我在Quartus中也遇到过这个问题,尽管您的代码也有一些隐式锁存(在两个移位的情况下,您没有分配输出的所有位)

我使用的解决方法是定义一个包含所有可能结果的中间数组,然后使用选择器选择其中一个结果。在您的情况下,类似于以下内容:

subtype DWORD_T         is std_logic_vector( 31 downto 0);
type    DWORD_A         is array (natural range <>) of DWORD_T;
signal  shift_L         : DWORD_A(31 downto 0);
signal  shift_R         : DWORD_A(31 downto 0);
signal  zero            : DWORD_T;

...

zero <= (others=>'0');

process (Ainput)
begin    
    for index in Ainput'range loop
        shift_L(index) <= Ainput(31 - index downto 0) & zero(index - 1 downto 0);
        shift_R(index) <= zero(index - 1 downto 0) & Ainput(31 downto index);
    end loop;
end process;

ALR_output_mux <= shift_L(to_integer(X)) when ALU_ctl="1000", 
                  shift_R(to_integer(X)) when ALU_ctl="1001",
                  (others=>'0') when others;
子类型DWORD_T是标准逻辑向量(31向下到0);
类型DWORD_A是DWORD_T的数组(自然范围);
信号移位:DWORD_A(31向下至0);
信号移位R:DWORD_A(31向下至0);
信号零:DWORD_T;
...
零‘0’;
进程(Ainput)
开始
对于输入范围循环中的索引

shift_L(index)如果Quartus不喜欢它,您有两个选择:

  • 以Quartus喜欢的方式编写它——您试图推断桶移位器,所以您可以直接写出一个,然后实例化它。潜在的时间成本
  • 找一个不同的合成器来接受它。钱可能很贵

  • 您可以使用
    generate
    for
    来创建每个移位/旋转级别,或者您可以使用({shift,rotate}{uuuu{left,right})来进行移位和旋转。

    我使用VHDL已经有3年了,甚至当时它还在Vortex 3板上。难道你不需要定义线路、输入和输出吗?还是我的记性不好?我假设Quartus是您的IDE在我的情况下,我使用了完全不同的东西。