module sreg_piso #(parameter N = 8)( input sys_clk, input sys_rst_n, input load, input [N - 1 : 0] D, output sout ); // 请在下面添加代码,完成8位并入串出移位寄存器(左移)的建模 // 代码量预计7行 /****** Begin ******/ /****** End ******/ endmodule
时间: 2023-06-26 13:05:27 浏览: 59
module sreg_piso #(parameter N = 8)(
input sys_clk,
input sys_rst_n,
input load,
input [N - 1 : 0] D,
output sout
);
reg [N-1:0] shift_reg;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n) begin
shift_reg <= {N{1'b0}};
end
else if(load) begin
shift_reg <= D;
end
else begin
shift_reg <= {shift_reg[N-2:0], 1'b0};
end
end
assign sout = shift_reg[N-1];
endmodule
// 以上是完整的 8 位并入串出移位寄存器的模块代码实现
相关问题
module sreg_sipo #(parameter N = 8)( input sys_clk, input sys_rst_n, input sin, input rd, output [N - 1 : 0] sout ); // 请在下面添加代码,完成8位串入并出移位寄存器(左移)的建模 // 代码量预计6行 /****** Begin / / End ******/ endmodule预期输出: VCD info: dumpfile waveform.vcd opened for output. At time 0ns: sys_rst_n = 0, sin = 0, rd = 0, sout = 00000000 At time 20ns: sys_rst_n = 1, sin = 0, rd = 0, sout = 00000000 At time 35ns: sys_rst_n = 1, sin = 1, rd = 0, sout = 00000000 At time 95ns: sys_rst_n = 1, sin = 0, rd = 1, sout = 00111111
module sreg_sipo #(parameter N = 8)(
input sys_clk,
input sys_rst_n,
input sin,
input rd,
output [N - 1 : 0] sout
);
reg [N - 1 : 0] shift_reg;
always @(posedge sys_clk) begin
if (!sys_rst_n) begin
shift_reg <= 0;
end else begin
shift_reg <= {shift_reg[N-2:0], sin};
end
end
assign sout = rd ? shift_reg : {N{1'b0}}; //当rd为1时,输出移位寄存器的值,否则输出0
endmodule
//测试模块
module testbench();
reg sys_clk, sys_rst_n, sin, rd;
wire [7:0] sout;
sreg_sipo #(.N(8)) uut(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.sin(sin),
.rd(rd),
.sout(sout)
);
initial begin
$dumpfile("waveform.vcd");
$dumpvars(0, testbench);
sys_rst_n <= 0;
sys_clk <= 0;
sin <= 0;
rd <= 0;
#20 sys_rst_n <= 1;
#15 sin <= 1;
#60 rd <= 1;
#10 $finish;
end
always #10 sys_clk <= ~sys_clk;
endmodule
//将16位2进制数data转为5*4位BCD码 reg[3:0] dec_out0=4'h0; reg[3:0] dec_out1=4'h0; reg[3:0] dec_out2=4'h0; reg[3:0] dec_out3=4'h0; reg[3:0] dec_out4=4'h0; wire [15:0] product; assign product=data; wire [15:0] bin_in=product; wire[4:0] c_in; wire[4:0] c_out; reg [3:0] dec_sreg0=4'h0; reg [3:0] dec_sreg1=4'h0; reg [3:0] dec_sreg2=4'h0; reg [3:0] dec_sreg3=4'h0; reg [3:0] dec_sreg4=4'h0; wire[3:0] next_sreg0,next_sreg1,next_sreg2,next_sreg3,next_sreg4; reg [7:0] bit_cnt=8'h0; reg [15:0] bin_sreg; wire load=~|bit_cnt;//读入二进制数据,准备转换 wire convert_ready= (bit_cnt==8'h11);//转换成功 wire convert_end= (bit_cnt==8'h12);//完毕,重新开始 always @ (posedge clk) begin if(convert_end) bit_cnt<=4'h0; else bit_cnt<=bit_cnt+4'h1; end always @ (posedge clk) begin if(load) bin_sreg<=bin_in; else bin_sreg <={bin_sreg[14:0],1'b0}; end assign c_in[0] =bin_sreg[15]; assign c_in[1] =(dec_sreg0>=5); assign c_in[2] =(dec_sreg1>=5); assign c_in[3] =(dec_sreg2>=5); assign c_in[4] =(dec_sreg3>=5); assign c_out[0]=c_in[1]; assign c_out[1]=c_in[2]; assign c_out[2]=c_in[3]; assign c_out[3]=c_in[4]; assign c_out[4]=(dec_sreg4>=5); //确定移位输出 assign next_sreg0=c_out[0]? ({dec_sreg0[2:0],c_in[0]}+4'h6):({dec_sreg0[2:0],c_in[0]}); assign next_sreg1=c_out[1]? ({dec_sreg1[2:0],c_in[1]}+4'h6):({dec_sreg1[2:0],c_in[1]}); assign next_sreg2=c_out[2]? ({dec_sreg2[2:0],c_in[2]}+4'h6):({dec_sreg2[2:0],c_in[2]}); assign next_sreg3=c_out[3]? ({dec_sreg3[2:0],c_in[3]}+4'h6):({dec_sreg3[2:0],c_in[3]}); assign next_sreg4=c_out[4]? ({dec_sreg4[2:0],c_in[4]}+4'h6):({dec_sreg4[2:0],c_in[4]}); //装入数据 always @ (posedge clk) begin if(load) begin dec_sreg0<=4'h0; dec_sreg1<=4'h0; dec_sreg2<=4'h0; dec_sreg3<=4'h0; dec_sreg4<=4'h0; end else begin dec_sreg0<=next_sreg0; dec_sreg1<=next_sreg1; dec_sreg2<=next_sreg2; dec_sreg3<=next_sreg3; dec_sreg4<=next_sreg4; end end //输出 always @ (posedge clk) begin if(convert_ready) begin dec_out0<=dec_sreg0; dec_out1<=dec_sreg1; dec_out2<=dec_sreg2; dec_out3<=dec_sreg3; dec_out4<=dec_sreg4; end end
这段代码是一个Verilog HDL实现的模块,用于将一个16位的二进制数转换成5个4位的BCD码。BCD码是一种二进制编码,可以将0~9的十进制数字用4位二进制数表示。该模块的输入是一个16位的二进制数data,输出是5个4位的BCD码dec_out0、dec_out1、dec_out2、dec_out3和dec_out4。
该模块采用了一种叫做移位加减法的算法,将输入的二进制数逐位转换成BCD码。具体的实现过程如下:
首先,输入的二进制数通过assign语句赋值给一个16位的wire类型变量product,然后将其赋值给一个16位的wire类型变量bin_in。
接着,定义了5个4位的寄存器dec_sreg0~dec_sreg4和5个4位的wire类型变量next_sreg0~next_sreg4,用于存储和计算转换后的BCD码。
在时钟上升沿时,根据load信号的值,将输入的二进制数装载到一个16位的寄存器bin_sreg中,或将bin_sreg向左移动一位。
同时,根据转换算法,通过assign语句计算出5个4位的BCD码对应的进位信号c_in和进位输出信号c_out。
然后,根据进位信号和进位输出信号,计算出下一个时刻5个4位BCD码寄存器的值。
最后,在时钟上升沿时,根据convert_ready信号的值,将计算出的5个4位BCD码输出到相应的输出端口。
需要注意的是,该模块的工作顺序是由时钟信号驱动的,因此需要在实际使用时将其作为一个子模块集成到整个系统中,并与其他模块进行时序上的配合。