`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,其他时候就移位寄存。