移位寄存器和并转串
移位寄存器:思路很清晰,就是利用一个中间变量,在reset时将in的值赋给Q,与其说是rst其实更像是load,不过看别人确实有一个load键,这样就可以避免必须按下rst影响到其他模块,不过我感觉问题不大,可以直接rst
设计文件
module top(in,out,en,clk,rst);
input [7:0] in;
input clk;
input en;
input rst;
output reg[7:0] out;
reg[7:0] Q;//中间变量传递in
always@(posedge clk or posedge rst)begin
if(rst)
Q<=in;
else if(en)
begin
out={Q[0],Q[7:1]};
Q<={Q[0],Q[7:1]};//其实还有更优雅的写法{Q,out}<={Q[0],Q};
end
else
begin
out={Q[6:0],Q[7]};
Q<={Q[6:0],Q[7]};
end
end
endmodule
仿真文件
module simular(
);
reg[7:0]in;
reg en;
reg clk;
reg rst;
wire[7:0]out;
top t(.in(in),.clk(clk),.en(en),.out(out),.rst(rst));
always
#10 clk=~clk;
initial begin
rst=1'b0;
clk=1'b0;en=1'b1;
in=8'b10010101;
#1 rst=1'b1;
#1 rst=1'b0;
#100 en=1'b0;
end
endmodule
对于它的仿真图
然后看到这对于并转串就很明了了
module top(in,out,en,clk,rst);
input [7:0] in;
input clk;
input en;
input rst;
output reg out;
reg[7:0] Q;
always@(posedge clk or posedge rst)begin
if(rst)
Q<=in;
else if(en)
begin
out=Q[0];
Q<={1'b0,Q[7:1]};
end
else
begin
out=Q[7];
Q<={Q[6:0],1'b0};
end
end
endmodule
仿真文件
module simular(
);
reg[7:0]in;
reg en;
reg clk;
reg rst;
wire out;
top t(.in(in),.clk(clk),.en(en),.out(out),.rst(rst));
always
#10 clk=~clk;
initial begin
rst=1'b0;
clk=1'b0;en=1'b1;
in=8'b10010101;
#1 rst=1'b1;
#1 rst=1'b0;
end
endmodule
仿真图
最后遇到的一个神奇操作,并转串的仿真文件我是copy的移位寄存器的改的,但是第一次仿真莫名其妙的都出现高阻态(Z),代码是没问题的(确信),然后我在仿真里把top文件设置成设计文件,然后又设置回来,仿真图就出现了。