题解 | #非整数倍数据位宽转换24to128#

非整数倍数据位宽转换24to128

https://www.nowcoder.com/practice/6312169e30a645bba5d832c7313c64cc

`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 [3:0]seq_num;

reg [143:0] data_reg;
 
always@(posedge clk or negedge rst_n)begin
  if(!rst_n)
    seq_num <= 1'b0;
  else if(seq_num == 4'd15)
    seq_num <= 1'b0;
  else if(valid_in)
    seq_num <= seq_num + 1'b1;
  else
    seq_num <= seq_num;
end

//取24*6也就是144位作为填充位,其实120位应该就足够了,多余的会直接溢出
always@(posedge clk or negedge rst_n)begin
  if(!rst_n)
    data_reg <= 1'b0;
  else if(valid_in)
    data_reg <= {data_reg[119:0],data_in};
end

//除了使用一些寄存器作为缓冲器之外,由于移位寄存器使用时钟触发,再次直接寄存结果会导致结果滞后
//为了使时序与波形一致,data_out不能直接锁存data_reg的值,需要锁存下一时钟周期data_reg的值
//即需要人为的计算该时钟周期下data-reg会寄存的值来寄存
always@(posedge clk or negedge rst_n)begin
  if(!rst_n)begin
    data_out <= 1'b0;
	valid_out <= 1'b0;
  end
  else if(valid_in && (seq_num==3'd5))begin
    data_out <= {data_reg[119:0],data_in[23:16]};
	valid_out <= 1'b1;
  end
  else if(valid_in && (seq_num==4'd10))begin
    data_out <=  {data_reg[111:0], data_in[23:8]};
	valid_out <= 1'b1;
  end
  else if(valid_in && (seq_num==4'd15))begin
    data_out <= {data_reg[103:0], data_in};
	valid_out <= 1'b1;
  end
  else begin
    data_out <= data_out;
	valid_out <= 1'b0;
  end
end

endmodule

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:32
点赞 评论 收藏
分享
Hakasee:我的简历和你的基本一样,上周去了上海,boss投了三百家, 三家线下面试 第一家没有做题,全是八股和项目,因为第一次面试不怎么熟练,挂了 第二家,给你几个题目(①css垂直居中文字,字体每两秒闪烁一下以及点击弹窗,②给你一个链接,实现可视化地图,③然后是八股,图片性能优化,以及对图片app有什么想法),45分钟内做完,然后老板面试) 第三家特别偏僻,有点阴森,到了之后让了一个工位给我,有四个题目,①格式化时间 年月日当前时间星期几② 正则表达式提取新闻文字,③在文本域输入文字生成选择题以及选项④生成商品排版还是什么来着 三家都是不超过50人的小公司 两家线上牛客笔试(卡伦特,七牛云,但是笔试不仅要考前端,还要考后端,算法,甚至数学题 我的建议是如果只做了这两个vue项目且不怎么熟练的情况下,先沉淀沉淀,把react学了,上海好的公司基本都是react查看图片
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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