牛客进阶题目8:非整数倍数据位宽转换24to128

第一阶段:120bit+8bit

第二阶段:16bit+96bit+16bit

第三阶段:8bit+120bit

所以相当于发送了16个24bit数据,作为一个循环。第6、第11两个数据被拆开使用。

根据上述分析可知,缓存采用120bit即可够用。然后建立一个0-15计数器进行计数,对输出条件进行精确判断。

`timescale 1ns/1ns

module width_24to128(
	input 				clk 		,   
	input 				rst_n		,
	input				valid_in	,
	input	[23:0]		data_in		,
 
 	output	reg			valid_out	,
	output  reg [127:0]	data_out
);
reg[119:0]	seq_temp	;
reg[3:0]	cyc_cnt		;

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		cyc_cnt <= 'd0 ; 
	else if(valid_in)
		cyc_cnt <= cyc_cnt + 1 ;
	else
		cyc_cnt <= cyc_cnt ;
end

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		seq_temp <='d0 ;
	else if(((cyc_cnt <= 4) | (5 <cyc_cnt<= 9) | (cyc_cnt >= 11)) & valid_in )
		seq_temp <= {seq_temp[95:0],data_in} ;
	else if(cyc_cnt == 5 & valid_in)
		seq_temp <= {104'b0,data_in[15:0]} ;
	else if(cyc_cnt == 10 % valid_in)
		seq_temp <= {112'b0,data_in[7:0]} ;
	else if (cyc_cnt == 15 & valid_in)
		seq_temp <= {96'b0,data_in} ;
	else
		seq_temp <= seq_temp ;
end

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		valid_out <= 1'b0 ;
	else if((cyc_cnt==5||cyc_cnt==10||cyc_cnt==15)&valid_in)
		valid_out <= 1'b1 ;
	else
		valid_out <= 1'b0 ;
end

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		data_out <= 'd0 ;
	else if(cyc_cnt == 5 )
		data_out <= {seq_temp,data_in[23:16]};
	else if(cyc_cnt == 10 )
		data_out <= {seq_temp[111:0],data_in[23:8]};
	else if (cyc_cnt == 15)
		data_out <= {seq_temp[103:0],data_in};
	else
		data_out <= data_out ;
end


endmodule
posted @ 2023-01-07 21:05  骑猪上树的少年  阅读(48)  评论(0编辑  收藏  举报
回到顶部