Vhdl 右移寄存器并行加载
我必须创建一个具有并行加载的n位右移寄存器(这里使用4位)。为此,我使用了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
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;