`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的数据储存下来,这样才能在下一个时钟沿输出第一位。
这个题总体来说就是一个比较反常识的一个串并转换。坑多