Vhdl 右移寄存器并行加载

Vhdl 右移寄存器并行加载,vhdl,Vhdl,我必须创建一个具有并行加载的n位右移寄存器(这里使用4位)。为此,我使用了mux2in1和d触发器。如果load为'1',则寄存器加载一个值(DataIn),否则寄存器开始移位。 多路复用器的代码为: entity Mux2in1onebit is Port ( A : in STD_LOGIC; B : in STD_LOGIC; Q : out STD_LOGIC; sel : in STD_LOGIC); end Mux2in1onebit

我必须创建一个具有并行加载的n位右移寄存器(这里使用4位)。为此,我使用了
mux2in1
d触发器
。如果
load
'1'
,则寄存器加载一个值(
DataIn)
,否则寄存器开始移位。 多路复用器的代码为:

entity Mux2in1onebit is
Port ( A : in  STD_LOGIC;
       B : in  STD_LOGIC;
       Q : out  STD_LOGIC;
       sel : in  STD_LOGIC);
end Mux2in1onebit;

architecture Behavioral of Mux2in1onebit is
begin
Q <= A when sel = '0' else
          B;
end Behavioral
实体Mux2in1onebit为
端口(A:标准_逻辑中;
B:标准逻辑;
Q:输出标准逻辑;
sel:标准逻辑中);
结束mux21位;
MUX2INOnebit的体系结构是
开始
Q sigdin(3),
Q=>sigq(3),
Enable=>Enable,
时钟=>Clk,
重置=>重置
);
MBIT2:Mux2in1onebit端口映射(
A=>sigq(3),
B=>DataIn(2),
Q=>sigdin(2),
sel=>负载
);
比特2:触发器端口映射(
Din=>sigdin(2),
Q=>sigq(2),
Enable=>Enable,
时钟=>Clk,
重置=>重置
);
MBIT1:MUX2IN1one位端口映射(
A=>sigq(2),
B=>DataIn(1),
Q=>sigdin(1),
sel=>负载
);
比特1:触发器端口映射(
Din=>sigdin(1),
Q=>sigq(1),
Enable=>Enable,
时钟=>Clk,
重置=>重置
);
MBIT0:mux2in1one位端口映射(
A=>sigq(1),
B=>DataIn(0),
Q=>sigdin(0),
sel=>负载
);
比特0:触发器端口映射(
Din=>sigdin(0),
Q=>sigq(0),
Enable=>Enable,
时钟=>Clk,
重置=>重置
);

BitOut你的问题不太复杂,缺少刺激因素和实际结果

所有三个实体和体系结构对都缺少上下文子句(
库ieee;使用ieee.std_logic_1164.All;
),MUX2inOne位的体系结构在
结束行为后缺少分号

修复这些问题后,我编写了一个简单的测试台:

library ieee;
use ieee.std_logic_1164.all;

entity sr_tb is
end entity;

architecture fum of sr_tb is
    signal datain:     std_logic_vector (3 downto 0) := "1011"; -- load value
    signal dataout:    std_logic_vector (3 downto 0);
    signal enable:     std_logic := '0';
    signal load:       std_logic := '0';
    signal bitin:      std_logic;
    signal bitout:     std_logic;
    signal reset:      std_logic := '0';
    signal clk:        std_logic := '0';
begin
DUT:
    entity work.shiftregister
        port map (
            datain => datain,
            dataout => dataout,
            enable => enable,
            load => load,
            bitin => bitin,
            bitout => bitout,
            reset => reset,
            clk => clk
        );

CLOCK:
    process
    begin
        wait for 5 ns;
        clk <= not clk;
        if now > 160 ns then
            wait;
        end if;
    end process;
STIMULI:
    process
    begin
        wait for 6 ns;
        reset <= '0';
        wait for 10 ns;
        reset <= '1';
        wait for 10 ns;
        reset <= '0';
        wait for 10 ns;
        load <= '1';
        enable <= '1';
        wait for 10 ns;
        load <= '0';
        enable <= '0';
        wait for 10 ns;
        bitin <= '0';
        wait for 10 ns;
        enable <= '1';
        wait for 10 ns;
        bitin <= '1';
        wait for 10 ns;
        bitin <= '0';
        wait for 10 ns;
        wait for 10 ns;
        bitin <= '1';
        wait for 10 ns;
        wait;
    end process;
end architecture;
ieee库;
使用ieee.std_logic_1164.all;
实体sr_tb是
终端实体;
sr_tb的架构fum是
信号数据输入:标准逻辑向量(3到0):=“1011”——负荷值
信号数据输出:标准逻辑向量(3到0);
信号启用:标准逻辑:='0';
信号负载:标准逻辑:='0';
信号bitin:std_逻辑;
信号位输出:标准逻辑;
信号复位:标准逻辑:='0';
信号时钟:标准逻辑:='0';
开始
DUT:
实体work.shiftregister
港口地图(
datain=>datain,
dataout=>dataout,
enable=>enable,
加载=>加载,
比丁=>比丁,
比特=>比特,
重置=>重置,
时钟=>clk
);
时钟:
过程
开始
等待5ns;
时钟160纳秒
等待
如果结束;
结束过程;
刺激:
过程
开始
等待6ns;

重置除了缺少上下文子句、缺少分号和连接到sigdin而不是sigq的DataOut之外,您显示的代码中似乎没有错误。我写了一个测试台,它看起来很实用。请展示你的刺激和错误。谢谢你的回复!我做了些改变,它成功了。此外,看到您的刺激,我意识到在我的测试台上,我没有在加载时设置
Enable=1
    entity ShiftRegister is
    Port ( DataIn : in  STD_LOGIC_VECTOR (3 downto 0);
           DataOut : out  STD_LOGIC_VECTOR (3 downto 0);
           Enable : in  STD_LOGIC;
              Load :in STD_LOGIC;
              BitIn : in STD_LOGIC;
              Bitout : out STD_LOGIC;
           Reset : in  STD_LOGIC;
           Clk : in  STD_LOGIC);
end ShiftRegister;

architecture Structural of ShiftRegister is

COMPONENT FlipFlop
    PORT(
        Din : IN std_logic;
        Enable : IN std_logic;
        Clk : IN std_logic;
        Reset : IN std_logic;          
        Q : OUT std_logic
        );
    END COMPONENT;
COMPONENT Mux2in1onebit
    PORT(
        A : IN std_logic;
        B : IN std_logic;
        sel : IN std_logic;          
        Q : OUT std_logic
        );
    END COMPONENT;

signal sigdin, sigq : std_logic_vector(3 downto 0);

begin
MBIT3: Mux2in1onebit PORT MAP(
        A => BitIn,
        B => DataIn(3),
        Q => sigdin(3),
        sel => Load
    );
BIT3: FlipFlop PORT MAP(
        Din => sigdin(3),
        Q => sigq(3),
        Enable => Enable,
        Clk => Clk,
        Reset => Reset
    );
MBIT2: Mux2in1onebit PORT MAP(
        A => sigq(3),
        B => DataIn(2),
        Q => sigdin(2),
        sel => Load
    );
BIT2: FlipFlop PORT MAP(
        Din => sigdin(2),
        Q => sigq(2),
        Enable => Enable,
        Clk => Clk,
        Reset => Reset
    );
MBIT1: Mux2in1onebit PORT MAP(
        A => sigq(2),
        B => DataIn(1),
        Q => sigdin(1),
        sel => Load
    );
BIT1: FlipFlop PORT MAP(
        Din => sigdin(1),
        Q => sigq(1),
        Enable => Enable,
        Clk => Clk,
        Reset => Reset
    );
MBIT0: Mux2in1onebit PORT MAP(
        A => sigq(1),
        B => DataIn(0),
        Q => sigdin(0),
        sel => Load
    );
BIT0: FlipFlop PORT MAP(
        Din => sigdin(0),
        Q => sigq(0),
        Enable => Enable,
        Clk => Clk,
        Reset => Reset
    );

BitOut <= sigq(0);
DataOut <= sigdin;

end Structural;
library ieee;
use ieee.std_logic_1164.all;

entity sr_tb is
end entity;

architecture fum of sr_tb is
    signal datain:     std_logic_vector (3 downto 0) := "1011"; -- load value
    signal dataout:    std_logic_vector (3 downto 0);
    signal enable:     std_logic := '0';
    signal load:       std_logic := '0';
    signal bitin:      std_logic;
    signal bitout:     std_logic;
    signal reset:      std_logic := '0';
    signal clk:        std_logic := '0';
begin
DUT:
    entity work.shiftregister
        port map (
            datain => datain,
            dataout => dataout,
            enable => enable,
            load => load,
            bitin => bitin,
            bitout => bitout,
            reset => reset,
            clk => clk
        );

CLOCK:
    process
    begin
        wait for 5 ns;
        clk <= not clk;
        if now > 160 ns then
            wait;
        end if;
    end process;
STIMULI:
    process
    begin
        wait for 6 ns;
        reset <= '0';
        wait for 10 ns;
        reset <= '1';
        wait for 10 ns;
        reset <= '0';
        wait for 10 ns;
        load <= '1';
        enable <= '1';
        wait for 10 ns;
        load <= '0';
        enable <= '0';
        wait for 10 ns;
        bitin <= '0';
        wait for 10 ns;
        enable <= '1';
        wait for 10 ns;
        bitin <= '1';
        wait for 10 ns;
        bitin <= '0';
        wait for 10 ns;
        wait for 10 ns;
        bitin <= '1';
        wait for 10 ns;
        wait;
    end process;
end architecture;
    dataout <= sigdin;  -- should be sigq
end architecture structural;