1.题目描述

实现数据位宽转换电路,实现24bit数据输入转换为128bit数据输出。其中,先到的数据应置于输出的高bit位。电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;clk是时钟信号;rst_n是异步复位信号。

2.波形图

3.错误分析

最开始的时候分析问题,只考虑了在一次数据传输的周期中的传输过程,由于是24to128的数据转换,需要传输六次,且最后一次的数据只会存最高的8位。即开始时的数据转换是通过data_out_reg缓存数据,但是最后一次会慢一拍,所以,最后需要通过data_out再缓存最终的高位数据。

reg [127:0] data_out_reg;always@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)data_out_reg <= 128'd0;else if(valid_in)data_out_reg <= {data_out_reg[103:0],data_in};elsedata_out_reg <= 128'd0;end
always@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)data_out <= 128'd0;else if(valid_in && (data_cnt == 4'd5))data_out <= {data_out_reg[119:0],data_in[23:16]};else data_out <= data_out;  end

4.错误代码

整体代码也不赘述了,只能实现次6位数据的转换,后续数据处理都是错误的:

`timescale 1ns/1nsmodule 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] data_cnt;always@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)data_cnt <= 4'd0;else if(valid_in == 1'b1)data_cnt <= (data_cnt == 4'd5)? 4'd0 : data_cnt + 1'b1;endalways@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)valid_out <= 1'b0;else if(data_cnt == 4'd5 && valid_in)valid_out <= 1'b1;elsevalid_out <= 1'b0;endreg [127:0] data_out_reg;always@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)data_out_reg <= 128'd0;else if(valid_in)data_out_reg <= {data_out_reg[103:0],data_in};elsedata_out_reg <= 128'd0;endalways@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)data_out <= 128'd0;else if(valid_in && (data_cnt == 4'd5))data_out <= {data_out_reg[119:0],data_in[23:16]};else data_out <= data_out;  endendmodule

验证代码,一次数据转换:

`timescale 1ns/1nsmodule width_24to128_tb;reg           clk         ;
reg             rst_n       ;
reg             valid_in    ;
reg  [23:0]     data_in     ;wire           valid_out   ;
wire [127:0]    data_out    ;width_24to128 inst1(.clk(clk),.rst_n(rst_n),.valid_in(valid_in),.data_in(data_in),.valid_out(valid_out),.data_out(data_out)
);initial begin clk = 1'b0; forever begin #10; clk = ~clk; end end
initial begin rst_n = 1'b0; #25; rst_n = 1'b1; end
initial begin valid_in = 1'b0; #52 ;valid_in = 1'b1; #120;valid_in =1'b0; end
initial begin data_in = 24'd0; #52 ;data_in = 24'ha0a1a2;#20;data_in = 24'hb2b1b0;#20;data_in = 24'hc2c1c0;#20;data_in = 24'hd2d1d0;#20;data_in = 24'he2e1e0;#20;data_in = 24'hf2f1f0;#20;end
initial begin #5000; $stop; endendmodule


从波形图也可以看出问题所在,所以对RTL代码进行修改。

5.正确分析

输入数据是24bit,输出数据是128bit,要找到二者的公倍数,才能将所有传输的数据都进行一个合理的整合。因为128 * 3 = 24 * 16,所以每输入16个有效数据,就可以产生三个完整的输出。因此设置一个仅在输入数据有效时工作的计数器cnt,计数范围是0-15。

`timescale 1ns/1nsmodule 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] data_cnt;//16位always@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)data_cnt <= 4'd0;else if(valid_in == 1'b1)data_cnt <=  data_cnt + 1'b1;endalways@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)valid_out <= 1'b0;else if((data_cnt == 4'd5 || data_cnt == 4'd10 || data_cnt == 4'd15) && valid_in)valid_out <= 1'b1;elsevalid_out <= 1'b0;endreg [127:0] data_out_reg;always@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)data_out_reg <= 128'd0;else if(valid_in)data_out_reg <= {data_out_reg[103:0],data_in};elsedata_out_reg <= data_out_reg;endalways@(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)data_out <= 128'd0;else if(data_cnt == 4'd5)data_out <= {data_out_reg[119:0],data_in[23:16]};else if(data_cnt == 4'd10)data_out <= {data_out_reg[119:0],data_in[23:8]};else if(data_cnt == 4'd15)data_out <= {data_out_reg[119:0],data_in[23:0]};else data_out <= data_out;  endendmodule

后续的验证波形大家可以自己写一下,后面如果有,相对来说还是比较简单的。祝大家越学越开心。

[牛客网刷题]L32 非整数倍数据位宽转换24to128相关推荐

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

    非整数倍数数据位宽转换8to12 题目描述 实现数据位宽转换电路,实现8bit数据输入转换为12bit数据输出.其中,先到的数据应置于输出的高bit位. 电路的接口如下图所示.valid_in用来指示 ...

  2. 牛客网刷题之SQL篇:非技术快速入门39T

    导航 前序 一.简单的关键字练习 1-10 二.知识点复习之 ==运算符== 1.算数运算符 2.比较运算符 3.逻辑运算符 4.位运算符 三.10-28T 0.简单题总结 1. SQL18 ==分组 ...

  3. 牛客网刷题记录 || 结构体和类

    这是牛客网刷题记录专栏第五篇博文,先给大家简单介绍一下牛客网,牛客网是一个集笔面试系统.题库.课程教育.社群交流.招聘内推于一体的优质网站,牛客网题库中包含几万道题目,注重通过边学边练的模式揽获编程人 ...

  4. 2023年大年初一 —— 牛客网刷题经验分享~

    2023年大年初一 -- 牛客网刷题经验分享~

  5. 牛客网 刷题前的准备工作(输入 输出 如何接收?)

    牛客网 刷题前的准备工作 牛客网 刷题前的准备工作 1. 数据读取接受问题 2.牛客刷题前的准备: 2.1. 弄清楚输入输出的行数关系 3.代码怎么写 3.1. 在牛客上测试自己的模板代码,是否能正确 ...

  6. 牛客网刷题记录 || 循环

    这是牛客网刷题记录专栏第七篇博文,先给大家简单介绍一下牛客网,牛客网是一个集笔面试系统.题库.课程教育.社群交流.招聘内推于一体的优质网站,牛客网题库中包含几万道题目,注重通过边学边练的模式揽获编程人 ...

  7. 【牛客网刷题】中秋节前开启java专项练习错题总结第一天

    [牛客网刷题]中秋节前开启java专项练习错题总结第一天 概述 写在前面 错题分析 值得记录的错题 总结 写在最后 概述 还有十几天就到中秋节了,从此又老了一岁,也多了一年的知识积累.对于这样一个特殊 ...

  8. verilog牛客网刷题代码汇总

    verilog牛客网刷题代码汇总 作者:安静到无声 个人主页 作者简介:人工智能和硬件设计博士生.CSDN与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇. Thanks♪(・ω・)ノ 如果 ...

  9. 牛客网刷题 --- 输入输出数据处理

    正确处理输入输出格式 常见的输入格式: 预先不输入数据的组数 - 直接读到文件结尾 预先输入数据的组数 - 读数据组数然后循环 只有一组数据 - 直接读数据 处理输出格式要注意细节,看题目的具体要求 ...

最新文章

  1. uva 12167(强连通分支)
  2. 选择创业型还是成熟型公司?
  3. Guava包学习---Maps
  4. php如何读取多个url文件,如何从PHP中的URL获取具有相同名称的多个参数
  5. pyqt 把控制台信息显示到_(基础篇 01)在控制台创建对应的应用
  6. 永大电梯小键盘服务器显示黑色条杠,永大电梯小键盘操作手顺
  7. [LibTorch] C++ 调用 PyTorch 导出的模型
  8. (转)Windows Form Application 读取并修改App.config文件
  9. 视频过大怎么压缩变小
  10. 70个具有商业实战性的精品Android源码
  11. GAN代码实操(github代码实操)
  12. 计算机知识怎么记忆,计算器记忆加怎么用
  13. Go 的时间转换和时区校对总记不住?给你一份备忘单
  14. 小米笔试题(句子反转)
  15. 如何在产品经理工作面试中回答估算问题
  16. 内容创业洗稿,知识付费拆书
  17. H5--大概的,没事看看
  18. HTML网页内嵌入网页
  19. Paper写作查重需要注意哪些问题?
  20. 杭电数电实验(二)译码器

热门文章

  1. 地铁供电系统原理图_地铁工作原理?
  2. fpdf.php教程,fpdf使用教程 - ican2089的个人空间 - OSCHINA - 中文开源技术交流社区
  3. IT学习网站推荐排行
  4. 高并发系统设计40问 - 学习/实践
  5. 利用几何画板来画出弧的中点
  6. html百度页面js代码,js代码让网页自动提交到百度
  7. 用计算机解锁ipad密码忘了怎么办,如果忘记并锁定了Apple ipad开机密码,该怎么办?如果Apple平板电脑忘记了锁屏密码,该怎么办...
  8. Filter Listener——概述、应用、Filter的使用 细节
  9. supplier java8_Java8-Supplier接口
  10. 你真的会除甲醛吗?除甲醛才不是通风这么简单!