Verilog写题笔记--------#并串转换#
并串转换
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***********//
//bit_cnt is used to count the transmited bits.
//bit_flag is the valid_in
//data_reg is used to storage the data.
parameter BIT_MAX = 'd3;
reg [2:0] bit_cnt;
reg bit_flag;
reg [3:0] data_reg;
assign valid_in = bit_flag;
always @(posedge clk or negedge rst)
begin
if(rst == 1'b0)
begin
bit_cnt <= 3'b0;
bit_flag <= 1'b0;
data_reg <= 4'd0;
end
else if(bit_cnt == BIT_MAX)
begin
bit_cnt <= 3'b0;
bit_flag <= 1'b1;
data_reg <= data_reg;
end
else if(bit_cnt == 3'd2)
begin
bit_cnt <= bit_cnt + 1'b1;
bit_flag <= 1'b0;
data_reg <= d;
end
else
begin
bit_cnt <= bit_cnt + 1'b1;
bit_flag <= 1'b0;
data_reg <= data_reg;
end
end
////////////////////////////////////////////////////////////////////////
//dout_reg is the reg dout.
reg dout_reg;
assign dout = dout_reg;
always @(posedge clk or negedge rst)
begin
if(rst == 1'b0)
begin
dout_reg <= 1'b0;
end
else if(bit_cnt == BIT_MAX)
begin
dout_reg <= data_reg[3];
end
else if(bit_cnt == 3'd0)
begin
dout_reg <= data_reg[2];
end
else if(bit_cnt == 3'd1)
begin
dout_reg <= data_reg[1];
end
else if(bit_cnt == 3'd2)
begin
dout_reg <= data_reg[0];
end
else
begin
dout_reg <= 1'b0;
end
end
//*************code***********//
endmodule
写题笔记:
这个题有三个输入:
1、clk时钟
2、异步复位信号rst
3、4位输入信号d
两个输出:
1、发射开始信号valid_in。
2、1bit发射信号dout。
代码说白了就是实现下面这个时序图:
这个时序图最大的坑,其实是红圈标志的地方:在复位置高后,并没有立刻开始串并转换,而是到第四个上升沿才开始输出,所以我们设置计数器时,可以发现,一个0-3的计数器,在计数器为3时,才会发射第一个数据,为0时,发射第二个数据,以此类推。
还有一个坑,在计数器为3时,发射第一个数据的话,就需要在上一个上升沿,也就是计数器为2时,将d的数据储存下来,这样才能在下一个时钟沿输出第一位。
这个题总体来说就是一个比较反常识的一个串并转换。坑多
verilog写题笔记 文章被收录于专栏
写Verilog题目的一些笔记备忘
查看10道真题和解析
