「Verilog学习笔记」非整数倍数据位宽转换24to128

专栏前言

本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网

「Verilog学习笔记」非整数倍数据位宽转换24to128_第1张图片

「Verilog学习笔记」非整数倍数据位宽转换24to128_第2张图片

        要实现24bit数据至128bit数据的位宽转换,必须要用寄存器将先到达的数据进行缓存。24bit数据至128bit数据,相当于5个输入数据+第6个输入数据的拼接成一个输出数据,出于对资源的节省以及时序要求,采用120bit的寄存器(data_lock)进行数据缓存。由24 * 16 = 128 * 3可知,每16组data_in就会是一轮循环,并且在第6,11,16组数据来临时,data_out完成输出,data_lock的值是由原data_lock的低位和新data_in补低位实现的(各位可模拟一下)这样可以实现先输入的数据将会在输出数据的高位优先输出。

`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] data_lock ; 
	reg [3:0] valid_cnt ; 

	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) valid_cnt <= 1'd0 ; 
		else if (valid_in) 
			if (valid_cnt == 4'd15) valid_cnt <= 4'd0 ; 
			else valid_cnt <= valid_cnt + 1'd1 ; 
	end
	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) begin 
			data_lock <= 1'd0 ; 
			data_out <= 1'd0 ; 
		end
		else if (valid_in) begin 
			if (valid_cnt == 4'd5) begin 
				data_lock <= {data_lock[119:16], data_in[15:0]} ; 
				data_out <= {data_lock, data_in[23:16]} ; 
			end
			else if (valid_cnt == 4'd10) begin 
				data_lock <= {data_lock[119:8], data_in[7:0]} ; 
				data_out <= {data_lock[111:0], data_in[23:8]} ;
			end
			else if (valid_cnt == 4'd15) begin 
				data_lock <= {data_lock[119:24], data_in} ; 
				data_out <= {data_lock[103:0], data_in} ; 
			end
			else data_lock <= {data_lock[95:0], data_in} ; 
		end
	end
	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) valid_out <= 1'd0 ; 
		else if (valid_in && (valid_cnt == 4'd5 || valid_cnt == 4'd10 || valid_cnt == 4'd15)) 
			valid_out <= 1'd1 ; 
		else valid_out <= 1'd0 ;
	end
endmodule

你可能感兴趣的:(Verilog学习笔记,学习,笔记,Verilog)