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

专栏前言

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

要实现8bit数据至12bit数据的位宽转换,必须要用寄存器将先到达的数据进行缓存。8bit数据至12bit数据,相当于1.5个输入数据拼接成一个输出数据,出于对资源的节省以及时序要求,采用1个8bit的寄存器(data_lock)进行数据缓存。

根据时序图,数据是在第二个数据到来之后输出,当仅有一个数据到来时,不产生输出,所以内部设计一个计数器(valid_cnt),用来指示数据接收状态。当检测到valid_in拉高时,valid_cnt加1,valid_cnt在0-2之间循环,valid_cnt复位值是0。当valid_cnt是1或2,且valid_in为高时,输出数据,valid_out拉高。

复制代码
`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 [7:0] data_lock ; 
	reg [1:0] valid_cnt ; 

	always @ (posedge clk or negedge rst_n) begin
		if (~rst_n) data_lock <= 'd0 ; 
		else if (valid_in) data_lock <= data_in ; 
	end

	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) valid_cnt <= 'd0 ; 
		else if (valid_in) 
			if (valid_cnt == 2'd2) valid_cnt <= 'd0 ; 
			else valid_cnt <= valid_cnt + 1'd1 ; 
	end

	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) valid_out <= 'd0 ; 
		else if (valid_in && (valid_cnt == 2'd1 || valid_cnt == 2'd2)) valid_out <= 1'd1 ; 
		else valid_out <= 'd0 ;
	end

	always @ (posedge clk or negedge rst_n) begin 
		if (~rst_n) data_out <= 'd0 ; 
		else if (valid_in && valid_cnt == 2'd1) 
			data_out <= {data_lock, data_in[7:4]} ;
		else if (valid_in && valid_cnt == 2'd2) 
			data_out <= {data_lock[3:0], data_in} ; 
	end

endmodule
相关推荐
ctrl_v助手25 分钟前
HALCON 学习笔记1
笔记·数码相机·学习·算法·计算机视觉
丰锋ff28 分钟前
Qt6.10.3安装教程
笔记
Edward111111111 小时前
一AI名词
java·开发语言·数据库·学习
GLDbalala1 小时前
GPU PRO 5 - 4.5 Tiled Deferred Blending 笔记
笔记
栈溢出了1 小时前
Redis repl_backlog 学习笔记
java·开发语言·redis·学习
心中有国也有家2 小时前
AtomGit Flutter 鸿蒙客户端:初始化流水线
学习·flutter·华为·harmonyos
a1117762 小时前
SLAM 学习笔记(三)视觉里程计2(VO) 特征点法
人工智能·笔记·学习
Yang_jie_032 小时前
笔记:数据结构(循环队列相关判断条件)
数据结构·笔记
三品吉他手会点灯2 小时前
嵌入式机器学习 - 学习笔记1.1.2 - 机器学习的局限性与伦理
人工智能·笔记·嵌入式硬件·学习·机器学习
Xpower 172 小时前
详细解释 Codex 最近一次功能更新,以及 GPT-5.6 Sol、Terra、Luna 的能力、价格、使用方式和适用场景。
人工智能·python·gpt·学习