循环8位移位器,VHDL

时间:2013-04-28 20:05:03

标签: vhdl

我有以下问题:我必须实现8位左移位器,使一个移位到左边,它的代码是:

entity left_shift is

generic ( N: integer := 8);

Port(
    Databitsin : in STD_LOGIC_vector(N-1 downto 0);
    Databitsout : out STD_LOGIC_vector(N-1 downto 0);
    Carry: out std_logic  
);

end left_shift;

architecture Behavioral_l of left_shift is
begin
    Databitsout(N-1 downto 1)<= Databitsin(N-2 downto 0);
    Carry<=Databitsin(N-1);
end Behavioral_l;

然后我必须实现另一个必须向右移动

的那个
entity Right_shift is
generic ( N: integer := 8);
Port(
    Databitsin : in STD_LOGIC_vector(N-1 downto 0);
    Databitsout : out STD_LOGIC_vector(N-1 downto 0);
    Carry: out std_logic 
);

end Right_shift;

architecture Behavioral of Right_shift is
begin
    Databitsout(N-2 downto 0)<= Databitsin(N-1 downto 1);
    Carry<=Databitsin(0);
end Behavioral;

现在,我必须构建一个主模块,它必须使用这两个组件进行循环移位(左,右)。 我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

这听起来很像家庭作业,但从来没有:

首先,为什么必须使用两个组件?优雅的解决方案是编写一个能够向左或向右移动的组件。

如果您有一些令人惊讶的理由以您建议的方式做事,请尝试实例化两者并在两者的数据位输出信号之间进行多路复用,具体取决于所需的模式。要进行循环移位而不是线性移位,需要将进位位合并到逻辑向量数组的适当末端。

答案 1 :(得分:1)

有不同的方法来实现循环移位(=旋转!)。如果添加方向选择器目录,则可以在一个代码中同时包含两个方向。

ex.1

添加“use IEEE.NUMERIC_STD.all”以使用numeric_std包函数:

Databitsout<=std_logic_vector(rotate_right(unsigned(Databitsin),1)) when Dir='0' else
             std_logic_vector(rotate_left(unsigned(Databitsin),1));                 

<强>离。 2

直接使用std_logic_vectors:

Databitsout<=Databitsin(0) & Databitsin(N-1 downto 1) when Dir='0' else
             Databitsin(N-2 downto 0) & Databitsin(N-1);

进位标志在两者中都是相同的:

Carry<=      Databitsin(0) when Dir='0' else 
             Databitsin(N-1);