如何解决VHDL移位寄存器
我正在更新我的VHDL编程技能(通过使用ModelSim),我编写了一个Shift寄存器项目。 有一个问题,我不知道该怎么办。
问题是 Q_out :当我在流程内部编写Q_out Q_out时-处理结束后-当clk上升时,Q_out发生了变化(按原意),但是在我的测试台上,我看到的是X而不是'1'...
我做错了什么? VHDL代码:
Library ieee;
Use ieee.std_logic_1164.all;
Use work.New_Data_Pack.all;
Entity Shift_Reg IS
port(
Rst,Clk :IN std_logic;
Data :IN byte; -- std_logic_vector(7 downto 0);
Sel :IN t_shift; --sample,shl,shr,rotl,rotr
Q_out :OUT byte
);
End Shift_Reg;
ARCHITECTURE Shift_Reg_arc OF Shift_Reg IS
Signal ACC: byte:=(OTHERS=>'0'); -- std_logic_vector(7 downto 0);
BEGIN
ShiftPro:PROCESS (Rst,Clk)
BEGIN
IF Rst='1' Then
Q_out<=(OTHERS=>'0');
ACC<=(OTHERS=>'0');
ELSIF Clk'EVENT and Clk='1' THEN
CASE Sel is
WHEN sample=>
ACC<=Data;
WHEN shl=>
ACC<= ACC (6 downto 0) & '0'; -- & concatenation
WHEN shr=>
ACC<='0' & ACC (7 downto 1);
WHEN rotl=>
ACC<=ACC (6 downto 0)& ACC(7);
WHEN rotr=>
ACC<=ACC(0) & ACC(7 downto 1);
WHEN OTHERS=>
NULL;
END CASE;
END IF;
--Q_out<=ACC;
End PROCESS;
Q_out<=ACC;
End Shift_Reg_arc;
测试平台:
Library ieee;
use ieee.std_logic_1164.all;
Use work.New_Data_Pack.all;
ENTITY Shift_Reg_TB IS END;
ARCHITECTURE Shift_Reg_TB_arc OF Shift_Reg_TB IS
---DUT Componenet Declaration
COMPONENT Shift_Reg
port(
Rst,rotr
Q_out :OUT byte);
END COMPONENT;
-----Signal Declaration----
SIGNAL S_Clk,S_Rst :std_logic:='0';
SIGNAL S_Data,S_Q_out : byte;
SIGNAL S_Sel : t_shift;
SIGNAL S_Run :std_logic:='1';
BEGIN
-----DUT installation----
DUT: Shift_Reg
Port Map(S_Rst,S_Clk,S_Data,S_Sel,S_Q_out);
-----Signal Wave Creation----
S_Rst<='1' after 0ns,'0' after 80 ns;
S_Run<= '1' after 0ns,'0' after 600 ns;
S_Sel<= sample,shl after 150 ns,shr after 250 ns,sample after 350 ns,rotl after 450 ns,rotr after 550 ns;
S_Data<=X"45" after 0ns;--,"10" after 125 ns,"33" after 620 ns,x"44" after 720 ns;
---CLK Creation---------
S_Clk_Create:Process
BEGIN
while S_Run='1' loop
S_clk<='1','0' after 50 ns;
Wait for 100 ns;
END LOOP;
S_clk<='1';
Wait;
END PROCESS;
END Shift_Reg_TB_arc;
解决方法
您的Q_out
驱动程序有冲突。它要么必须由流程顺序驱动,要么必须同时驱动,而决不能由流程驱动。但是现在,您在流程之外都拥有并发分配:
Q_out<=ACC;
以及流程中的顺序分配
IF Rst='1' Then
Q_out<=(OTHERS=>'0');
将时钟更新移到进程外时,必须删除进程内重置。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。