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

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

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

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

应该没有比我这思路更清晰的解法了吧,自吹自擂,哈哈哈哈!!!

嘿嘿嘿,也看了大家的题解,也有思路非常棒的小伙伴呀。

大家多多分享哈。

欢迎评论,欢迎多交流

代码

`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;
always@(posedge clk , negedge rst_n)begin
	if(rst_n==0) cnt<=0; 
	else if(cnt==3 & valid_in) cnt<=1;//后面的data_out和valid_out都是由这个cnt决定的,所以cnt正确与否至关重要
	else if(valid_in)cnt<= cnt+1;	
	else cnt<=cnt;
end

reg [15:0] data_shift_in;
always@(posedge clk , negedge rst_n)begin
	if(rst_n==0)  data_shift_in<=0;
	else if(valid_in) data_shift_in<= {data_shift_in[7:0],data_in} ;
	else data_shift_in<=data_shift_in;					
end
always@(*) begin
	if(rst_n==0) data_out=0;
	else if(cnt==2) data_out = data_shift_in[15:4];
	else if(cnt==3) data_out = data_shift_in[11:0];
	else data_out =data_out;
end

always@(posedge clk , negedge rst_n)begin
	if(rst_n==0)  valid_out<=0;
	else if((cnt==1 | cnt==2) & valid_in) valid_out<= 1 ;
	else if((cnt==2  | cnt==3) & valid_out) valid_out<= 0;
	else valid_out<=0;					
end


endmodule
#Verilog进阶#
全部评论
给个建议,你这代码可能只能在仿真有效,实际使用时候不建议,因为你组合逻辑保持了,生成了latch,避免生成latch不是说在组合逻辑中分支完全就行的,简单来说只要组合的逻辑中存在保持上次的值的这个逻辑语句,就会生成latch,你可以验证下。
点赞 回复 分享
发布于 2023-05-19 13:53 陕西
https://blog.csdn.net/weixin_41445387/article/details/130357453?spm=1001.2014.3001.5501,这个帖子中有讲
点赞 回复 分享
发布于 2023-05-19 13:55 陕西

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
牛客769922382号:轮到大佬给公司发感谢信了,想想就爽
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务