上周阿里面试官问ram两侧读写位宽不一样改如何解决?当时含糊了一下,事后再认真分析其中缘由。

思路

取读写位宽的最大公因数作为ram的位宽,控制读写指针的步进,并预测下一次的指针位置从而判断空满,和普通fifo一样的是指针还是要计两圈。

module sync_dff_wid_fifo#(parameter I_WID = 15,parameter O_WID = 10,parameter FIFO_WID = 5,parameter DEPTH = 8,parameter ADDR_WID = 3,parameter I_ADDR_STEP = 3,parameter O_ADDR_STEP = 2
)
(input clk,input rst_n,input wr_en,input [I_WID - 1 : 0] wr_data,input rd_en,output [O_WID - 1 : 0] rd_data,output empty,output full
);//=============definationreg [FIFO_WID - 1 : 0] ram [0 : DEPTH - 1];reg [ADDR_WID : 0] wr_pnt;reg [ADDR_WID : 0] rd_pnt;wire [ADDR_WID - 1 : 0] wr_addr;wire [ADDR_WID - 1 : 0] rd_addr;wire [ADDR_WID : 0] wr_pnt_next;wire [ADDR_WID : 0] rd_pnt_next;reg full, empty;reg [O_WID - 1 : 0] rd_data;//=============combinal logicassign wr_addr = wr_pnt[ADDR_WID - 1 : 0];assign rd_addr = rd_pnt[ADDR_WID - 1 : 0];assign wr_pnt_next = wr_pnt + I_ADDR_STEP;assign rd_pnt_next = rd_pnt + O_ADDR_STEP;//=============sequential logicalways@(posedge clk or negedge rst_n)beginif(!rst_n) wr_pnt <= 'd0;else if(wr_en && !full) wr_pnt <= wr_pnt + I_ADDR_STEP;endalways@(posedge clk or negedge rst_n)beginif(!rst_n) rd_pnt <= 'd0;else if(rd_en && !empty) rd_pnt <= rd_pnt + O_ADDR_STEP;endalways@(posedge clk)beginif(wr_en && !full) beginram[wr_addr] <= wr_data[I_WID - 1 -: FIFO_WID];ram[wr_addr + 1] <= wr_data[I_WID - FIFO_WID - 1 -: FIFO_WID];ram[wr_addr + 2] <= wr_data[I_WID - FIFO_WID * 2 - 1 -: FIFO_WID];endendalways@(*)beginif(rd_en && !empty) rd_data = {ram[rd_addr], ram[rd_addr + 1]};endalways@(*)beginif((wr_pnt_next[ADDR_WID] ^ rd_pnt_next[ADDR_WID]) && wr_pnt_next[ADDR_WID - 1 : 0] > rd_pnt[ADDR_WID - 1 : 0]) full = 1'b1;else full = 1'b0;endalways@(*)beginif(rd_pnt_next > wr_pnt) empty = 1'b1;else empty = 1'b0;end
endmodule
module tb_sync_dff_wid_fifo();//===================parameterparameter PERIOD = 10 / 2;//===================definationreg clk, rst_n;reg wr_en, rd_en;reg [14 : 0] wr_data;wire [9 : 0] rd_data;wire full, empty;//===================outputinitial beginclk = 0;forever #PERIOD clk = ~clk;endinitial beginrst_n = 0;#20 rst_n = 1;endinitial begin@(rst_n);wr('b1);wr('d2);wr('d3);rd();rd();rd();//wait(done);#5000 $finish; endsync_dff_wid_fifo u_sync(.clk(clk),.rst_n(rst_n),.wr_en(wr_en),.wr_data(wr_data),.rd_en(rd_en),.rd_data(rd_data),.full(full),.empty(empty));task wr(input [29 : 0] data);@(posedge clk);#1;wr_en = 1;wr_data = data;@(posedge clk);#1;wr_en = 0;endtasktask rd();@(posedge clk);#1;rd_en = 1;@(posedge clk);#1;rd_en = 0;endtask`ifdef FSDB
initial begin$fsdbDumpfile("tb_sync_dff_wid_fifo.fsdb");$fsdbDumpvars;$fsdbDumpMDA();
end
`endifendmodule

解决FIFO读写位宽不等的问题相关推荐

  1. FPGA之FIFO详解,读写位宽不同

    这篇博客里,通过两个练习来总结在FPGA设计中FIFO读写位宽不同的情况下,我们应该去如何设计时序逻辑,因为在现实工程中FIFO读写位宽不同也是经常出现的情况. 练习1 设计一个模块包含读写位宽是32 ...

  2. 读写位宽不同的FIFO,数据输入输出顺序是怎么样的?BRAM又如何呢?

    原文地址:https://wenku.baidu.com/view/7d7cf156284ac850ac0242b6.html 对于BRAM: 1)写位宽小于读位宽: 先入存低位,后入存高位: 如写4 ...

  3. FIFO实现位宽转换

    之前在博客中实现了位宽相同的同步FIFO,然而,实际的应用场景往往更加复杂,它不仅需要FIFO实现先入先出的功能,有时候还需要实现数据位宽的转换,本文就介绍了如何通过Verilog实现一个具有位宽转换 ...

  4. verilog 常见位宽问题集合

    verilog 常见的位宽问题集合 1. 位宽不等 wire b[31:0]; assign b = 5'b0; 这种错误常见于赋值操作中. 2. 保留最低位 wire b; assign b = 3 ...

  5. Verilog设计中如何匹配变量的位宽?($clog2系统函数)

    1.位宽太小 在FPGA设计中,我们经常需要用寄存器来寄存某些"数量类"的变量,比如FIFO的深度啦.或者计数器的最大值啦:又或者输入输出信号也需要将位宽用parameter参数化 ...

  6. 【ZYNQ Ultrascale+ MPSOC FPGA教程】第八章FPGA片内FIFO读写测试实验

    原创声明: 本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E ...

  7. 【基础知识】~ 数据位宽转换器

    1. 概述 数据位宽转换器,一般常用于模块接口处,比如一个电路模块的输出数据位宽大于另一个模块的输入数据位宽,此时就需要进行数据位宽转换.比如SATA控制器中,内部数据位宽为32bit,但外部物理收发 ...

  8. 位宽512bit显卡_显卡知识:关于显卡位宽的基础知识科普

    显卡的位宽,准确应该说是显存的位宽.众所周知显卡的主要部件有GPU和显存,所谓显存位宽可以理解为数据从显存转移到GPU的通道的运载量,就是车间传送带的运输量. 由于买电脑的时候大家对显卡的显存大小过于 ...

  9. 计算机组成原理 位宽,数据总线宽度一般为存储单元位宽的整数倍 这怎么理解哦...

    满意答案 gy96300 2015.03.25 采纳率:42%    等级:9 已帮助:112人 计算机在访问存储器时,用地址来进行索引,也就是根据地址来找到数据进行存储或读取 而计算机内最小的地址单 ...

最新文章

  1. HDOJ 1236 排名(练耐心题)
  2. 演化:这五年里,我们对架构师职责的思考与定位
  3. 打通NTFS权限 文件共享各取所需
  4. 【答案放在最后,看题看不到答案】2017年下半年软件设计师 上午选择题
  5. 重庆高职高专计算机排名,重庆十大大专排名(含分数线2021年参考)-重庆最好的全日制专科学校...
  6. 关于网络编程中MTU、TCP、UDP优化配置的一些总结
  7. DirectAdmin安装mod_encoding支持中文
  8. ant中调用外部ant任务的两种方法
  9. [转]UML建模的要点总结
  10. struts2 + json 包冲突问题
  11. 昆明钉钉智慧校园K12解决方案,校园安全、健康、生活、办公、网络整体解决方案
  12. SolidWorks DocumentManager LicenseKey
  13. Arcgis更换布局模板_PPT模板到底怎么用呢?
  14. Linux系统下查找最近修改过的文件
  15. Autofill Framework(自动填写)用法详解
  16. java内存中读文件_关于内存管理:读取Java中的大文件
  17. 一种双 SoC 智能座舱域控设计
  18. 工作两年,Java社招岗位,阿里,头条等多家大厂面经出炉
  19. jar包配置开机自启
  20. ios 即时通讯 xmpp

热门文章

  1. 总结两个最近遇到 校园网连不上或丢失WLAN如何解决的方案
  2. [AHOI2014/JSOI2014] 骑士游戏
  3. solar在linux系统下的部署过程
  4. eating的中文意思_eating什么意思
  5. sketchup 计算机配置,流畅运行SU草图大师软件的最低电脑配置要求
  6. 各种品牌主板、笔记本、台式一体机的U盘启动热键一览表
  7. 计算机主机电源重量,怎么看电脑主机的电源功率是多少
  8. matlab plotroc 画roc曲线
  9. L3-python语言中的几种特征操作
  10. 微信小程序约课_基于微信小程序的瑜伽馆约课系统设计