`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] buffer ; reg valid ; always@(posedge clk or negedge rst)begin if(!rst) CNT <= 'd0 ; else if(CNT == 'd3) CNT <= 'd0 ; else CNT <= CNT + 1'd1 ; end always@(posedge clk or negedge rst)begin if(!rst) valid <= 1'b0 ; else if(CNT == 'd3) valid <= 1'b1 ; else valid <= 1'b0 ; end always@(posedge clk or negedge rst)begin if(!rst) buffer <= 'd0 ; else if(CNT == 'd3) buffer <= d ; else buffer <= {buffer[2:0], buffer[3]} ; end assign dout = buffer[3] ; assign valid_in = valid ; //*************code***********// endmodule
注解:很久没写代码了,思路有些混乱。再加上看错了输入输出,我把 valid_in 当成了输入。 其实很简单的。并转串的核心思想就是移位寄存,然后把最高位输出出来。
这题要注意的是,valid_in 信号是你自己产生并输出的。由于dout 信号和valid_in 信号 是同时输出的。所以不能使用valid_in信号来作为控制信号,而是使用你自己的计数器(因为这个valid_in 信号是你自己使用计数器 4个时钟产生的)CNT == ‘d3的时候进行赋值给你的缓存buffer,其他时候就移位寄存。