我有以下问题:我必须实现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;
现在,我必须构建一个主模块,它必须使用这两个组件进行循环移位(左,右)。 我怎么能这样做?
答案 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);