【问题标题】:cyclically 8 bit shifter ,VHDL循环8位移位器,VHDL
【发布时间】:2013-04-28 20:05:02
【问题描述】:

我有以下问题:我必须实现一个向左移位的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;

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

【问题讨论】:

    标签: vhdl


    【解决方案1】:

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

    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);
    

    【讨论】:

    • 非常感谢您的帮助
    【解决方案2】:

    这听起来很像家庭作业,但绝不是这样:

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

    如果您有一些非常好的理由按照您建议的方式做事,请尝试根据所需的指令对两者进行实例化并在两者的 databitsout 信号之间进行多路复用。要进行循环移位而不是线性移位,您需要将进位位连接到逻辑向量数组的适当末端。

    【讨论】:

    • @user2280448 如果您对问题有更新,您应该编辑问题而不是答案之一。
    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多