`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的数据储存下来,这样才能在下一个时钟沿输出第一位。

这个题总体来说就是一个比较反常识的一个串并转换。坑多