题解 | #并串转换#
理解题意:如果输入的d = 0101,则:当 valid_in 有效时(即为高电平),采取d的值,存入 data 中,将 data 从高位向低位输出,即 dout依次输出 0、1、0、1。那么 valid_in在什么时候有效呢,就是在data的值全部输出完成过后,将valid_in 拉高,就是需要四个时钟周期,此时我们就需要定义一个计数器 cnt,来计数从0~3,共四个数,当 cnt == 3时,valid_in <= 1;此时逻辑就是很清楚了,代码如下:
`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]cnt; reg [3:0]data; reg valid; assign valid_in = valid; assign dout = data[3]; always@(posedge clk or negedge rst) if(!rst) cnt <= 2'd0; else cnt <= cnt == 2'd3 ? 0 : cnt + 1; always@(posedge clk or negedge rst) if(!rst) valid = 1'b0; else if(cnt == 2'd3) valid <= 1'b1; else valid <= 1'b0; always@(posedge clk or negedge rst) if(!rst)begin data <= 4'd0; end else data <= cnt == 2'd3 ? d : {data[2:0],1'b0}; //*************code***********// endmodule