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

京公网安备 11010502036488号