module shift(nreset,clk,en,in,out)
input nreset,clk,en,in
output [3:0] out
reg [1:0] count//移位计数,控制并行数据更新,这里是4bit并行数据
reg [3:0] data
reg [3:0] out
/* 移位计数,用于并行数据输出,也可以外加一个脉冲控制数据边界,这里移位4bit就并行输出一次*/盯裤
always@(posedge clk or negedge nreset)
begin
if(~nreset)
count <= 2'b00
else if(en)
count <= count + 2'b01
end
//移位
always@(posedge clk or negedge nreset)
begin
if(~nreset)
data <= 4'b0000
eale if(en)
data <= {data[2:0],in}
end
//并行输出咐掘
always@(posedge clk or negedge nreset)
begin
if(~nreset)
out <= 4'b0000
else if(en &&(count==2'b11))
out <= data
end
endmodule
我编译、仿真过了,没有问题,你原有的out<={out,in}应该写成像这样data <= {data[2:0],in}这就是一个移位寄存器!
这种情况坦漏唯一般都是状态机出问搜梁题了data_input_1信号在在S3的情况下过早为0,会导致current_state不让培能进入S4状态.data_input_1必须值到下一个时钟周期开始时也为1,保证next_state最终为S4,这样才能在上升沿加载到current_state寄存器中,因此这个设计对于前导码之后第1位为0是失效的,第一位为1则可以运行,你可以做个实验验证一下.
解决方案:用个寄存器先对输入信号同步采样一下.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)