题解 | #非整数倍数据位宽转换8to12#

非整数倍数据位宽转换8to12

https://www.nowcoder.com/practice/11dfedff55fd4c24b7f696bed86190b1

//注意valid_out的输出与valid_in的判断逻辑有关
`timescale 1ns/1ns

module width_8to12(
	input 				 clk 		,   
	input 			     rst_n		,
	input				 valid_in	,
	input	[7:0]		 data_in	,
 
 	output  reg			 valid_out,
	output  reg [11:0]   data_out
);


reg [1 :0]	cnt			;
reg [7 :0]	data_tempt	;


///cnt
always @ (posedge clk or negedge rst_n)
begin//valid_in期间计数,在0-2之间轮续
	if(!rst_n)
		cnt <= 2'd0	;
	else if(valid_in)	
	begin
		if(cnt == 2'd2)	
			cnt <= 2'd0	;
		else
			cnt <= cnt + 1'b1	;
	end
end


///data_tempt
always @ (posedge clk or negedge rst_n)
begin
    if(!rst_n)
        data_tempt <= 8'd0  ;
    else if(valid_in)
        data_tempt <= data_in   ;
end


///data_out & valid_out
always @ (posedge clk or negedge rst_n)
begin
    if(!rst_n)  begin
        data_out    <= 12'd0;
        valid_out   <= 1'b0 ;
    end
    else    begin
        if(cnt == 2'd1 & valid_in)begin
            valid_out <= 1'b1   ;
            data_out  <= {data_tempt, data_in[7:4]}  ;
        end
        else if(cnt == 2'd2 & valid_in)begin
            valid_out <= 1'b1   ;
            data_out  <= {data_tempt[3:0], data_in}  ;
        end
        else	begin
			valid_out <= 1'b0	;
			data_out  <= data_out	;
		end
    end
end


endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务