题解 | #并串转换#
并串转换
https://www.nowcoder.com/practice/296e1060c1734cf0a450ea58dd09d36c
`timescale 1ns/1ns
module huawei5(
input wire clk ,
input wire rst , //本题第一个坑,复位是低电平复位
input wire [3:0]d ,
output wire valid_in ,
output wire dout
);
//*************code***********//
reg [1:0] r_cnt;
reg [3:0] d_reg;
reg valid_reg;
reg dout_reg;
//其次要根据波形图判断数字次序,第一次复位时,没有valid_in生成
always@(posedge clk or negedge rst)begin
if(!rst)
r_cnt <= 1'b0;
else if(r_cnt == 2'b11)
r_cnt <= 1'b0;
else
r_cnt <= r_cnt + 1'b1;
end
//需要寄存d的值,但是又不能只采样d_reg的值作为移位输出
always@(posedge clk or negedge rst)begin
if(!rst)begin
d_reg <= 1'b0;
valid_reg <= 1'b0;
dout_reg <= 1'b0;
end
else begin
case(r_cnt)
2'b00:begin
d_reg <= d_reg;
valid_reg <= 1'b0;
dout_reg <= d_reg[2];
end
2'b01:begin
d_reg <= d_reg;
valid_reg <= 1'b0;
dout_reg <= d_reg[1];
end
2'b10:begin
d_reg <= d_reg;
valid_reg <= 1'b0;
dout_reg <= d_reg[0];
end
2'b11:begin
d_reg <= d;
valid_reg <= 1'b1;
dout_reg <= d[3];
end
default:begin
d_reg <= 1'b0;
valid_reg <= 1'b0;
dout_reg <= 1'b0;
end
endcase
end
end
assign valid_in = valid_reg;
assign dout = dout_reg;
//*************code***********//
endmodule