0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RAM的两种应用:统计计数和位宽转换

sanyue7758 来源:IC的世界 2023-12-05 09:48 次阅读

应用1 统计计数

在进行模块设计时,我们经常需要统计报文的数量,以供软件(or 主机)读取,有些统计仅仅用于debug,有些统计是协议要求,有些统计是为了便于功能实现。

当需要统计的数量较多时,为了降低功耗和减少面积,我们通常采用RAM去实现。

如下案例中,统计有效数据包的个数。

假设数据中存在pkt_id,pkt_id为0~63,则ram的深度为64。pkt_id用于作为读写地址。RAM读延时为3个时钟周期。

有数据来临时,pkt_vld作为读使能,读出当前包计数rdata,三个周期后,rdata加1回写到ram。

如下图所示:需要有三个注意事项

NOTE1:需要有读写保护,因为可能出现连续4个周期内,pkt_vld为1,且pkt_id相同,此时会出现同一个周期对相同的地址进行读写,因此需要RAM需要添加读写保护模块,保证数据能够正确写入,且读出的都是最新值,否则就会出现统计错误。

NOTE2:图中既有软件读、又存在硬件读,且硬件读优先级更高,软件读优先级低,因此为了保证软件读能够在有效周期内得到响应,因此需要在主数据流上插入空拍,避免出现软件读长时间无法响应而产生超时。

wKgZomVugViATGPZAABdxDuAeHU769.png

应用2 位宽转换

在进行模块设计时,我们经常需要进行数据位宽的转换,常见的两种转换场景有同步时钟域位宽转换和异步时钟域位宽转换。本文将介绍异步时钟域位宽转换

异步时钟域的位宽转换读时钟和写时钟属于两个时钟。如下案例中,数据位宽由32bit转40bit,写时钟频率156.25MHz,读时钟频率125Mhz,写数据为32bit,读数据位宽为40bit,通过计算得到入口数据速率和出口数据速率保持一致(156.2532==40125)。

存储模块是由寄存器搭建的。那么需要多大存储模块呢?32和40的最小公倍数为160,极限场景下,只需要160bit的寄存器作为存储就够了,但是读操作通常晚于写操作,并且考虑到时钟有抖动有偏移,为了避免溢出,稍微增加一部分缓存,我们可以采用320bit作为存储模块。因此写侧32bit写10次,读侧40bit读8次,读写两侧所需的时间相等。

注意事项:写地址(wr_addr)跳转范围是09,读地址(rd_addr)跳转范围07。

wKgaomVugViAHCE3AACFx-wvlYA974.png

wKgaomVugViAIYjXAAFTzh9fxhU679.png

如图所示:

buff_array为320bit的数据存储。

vld_array为80bit的有效标志位存储:vld_array[n]为1表示buff_array[4n+3:4n]存在4bit的有效数据。

wKgaomVugViAFRVZAABOda71nBA740.png

always @(posedge wr_clk or negedge wr_rst_n) begin
  if (~wr_rst_n) begin
    buff_array  <= {DATA_FIFO_DEPTH{1'b0}};
    vld_array <= {VALID_FIFO_DEPTH{1'b0}};
  end else begin
    if (wr_en) begin
        buff_array[ wr_addr*32  +: 32]  <= wr_data_i;
        vld_array[wr_addr*8 +: 8] <= {8{wr_valid_i}};
      end
    end
  end


reg [10-1:0] rd_valid_bus;
reg [40-1:0]  rd_data_bus;
always @(*) begin
  rd_data_bus[40-1:0]  = buff_array[  rd_addr*40  +: 40];
  rd_valid_bus[10-1:0] = vld_array[rd_addr*10 +: 10];
end
integer i;
reg [40-1:0] rd_data_valid_mask;
always @(*) begin
  for(i = 0; i < 40; i = i + 1) begin
      rd_data_valid_mask[i] = rd_valid_bus[i/4];
  end
end
always @(posedge rd_clk or negedge rd_rst_n) begin
  if (~rd_rst_n) begin
    rd_data_o  <= {40{1'b0}};
    rd_valid_o <= 1'b0;
  end else begin
    if (rd_en) begin
      rd_data_o  <= rd_data_bus & rd_data_valid_mask;
      rd_valid_o <= |rd_valid_bus;
    end else begin
      rd_data_o  <= {40{1'b0}};
      rd_valid_o <= 1'b0;
    end
  end
end

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117721
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1321

    浏览量

    113706
  • 数据包
    +关注

    关注

    0

    文章

    229

    浏览量

    24095
  • 读写保护
    +关注

    关注

    0

    文章

    4

    浏览量

    5841

原文标题:ram的两种应用~统计计数和位宽转换

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于FPGA的HDTV视频图像灰度直方图统计算法设计

    结构,即在内存中开辟一个整数数组来进行计数,但是在FPGA 中定义数组是非常消耗资源的,尤其是当数组成员的很大时。例如用触发器来统计256 灰度的720p 图像的直方图,将消耗40
    发表于 05-14 12:37

    两种采样方式

    两种采样方式.....................................
    发表于 08-08 15:04

    如何用片四全加器和必要的逻辑门设计数转换电路

    如何用片四全加器和必要的逻辑门设计数转换电路 将输入的十进制转换成二进制 十进制输入采用8421BCD码表示
    发表于 07-04 14:52

    AVR的两种操作及比较

    AVR的两种操作的比较(域方式和移位宏方式) 测试环境如下: 硬件:AT90S2313 软件: WiinAVR gcc3.3-Os级优化(最小size)。 说明: 由于AVR不支持
    发表于 09-06 10:24

    SQL语句的两种嵌套方式

    一般情况下,SQL语句是嵌套在宿主语言(如C语言)中的。有两种嵌套方式:1.调用层接口(CLI):提供一些库,库中的函数和方法实现SQL的调用2.直接嵌套SQL:在代码中嵌套SQL语句,提交给预处理器,将SQL语句转换成对宿主语言有意义的内容,如调用库中的函数和方法代替S
    发表于 05-23 08:51

    Ultrascale器件中如何将字节写入启用转换wibe写入enalbe?

    大家好, 在Ultrascale器件中,RAM具有字节写入使能,但我想要Bit Wide Write Enable,所以 如何将字节写入启用转换
    发表于 04-26 13:53

    20V双输出转换器适合需要两种电源的LCD偏置应用

    电路显示LT1617,20V双输出转换器非常适合需要两种电源的LCD偏置应用
    发表于 06-19 08:08

    请问如何去实现一管理统计计数器?

    请问如何去实现一管理统计计数器?
    发表于 05-14 07:06

    掌握原理图输入以及Verilog的两种设计方法

    过1全加器的详细设计,掌握原理图输入以及Verilog的两种设计方法。
    发表于 11-08 07:57

    STC12系列单片机的定时器有两种计数速率

    STC12系列单片机的定时器有两种计数速率:一是12T模式,每12个时钟加1,与传统8051单片机相同;另一是1T模式,每个时钟加1,速度是传统8051单片机的12倍。
    发表于 11-25 06:13

    SQL语言的两种使用方式

    编写)-DBMS预处理程序-预处理过的源程序(嵌入的SQL语句已转换成函数调用形式)-宿主语言编译程序(SQL函数定义库)-目标程序嵌入式SQL涉及到SQL语句在主语言程序中的使用规定,以解决两种语言的不一致和相互联系的问题。...
    发表于 12-20 06:51

    ROM和RAM两种寄存器的区别是什么呢

    ROM或者对于玩电脑的人并不陌生,什么内存3G(内存就是RAM),硬盘100G(硬盘就是ROM)单片机里面和电脑一样,有ROM和RAM之分..那这两种寄存器的区别是什么呢?1 . ROM的功能:ROM的数据在程序运行的时候是不容
    发表于 03-01 07:35

    嵌入式中的计算

    的100,转换为二进制为1100100,需要用到7。当用低于7
    发表于 03-02 19:52

    求分享S32G2内存映射系统计数器的地址

    计时器: • 提供一个系统计数器,用于实时测量时间的流逝。 在同一参考文献的 D7.1.1 节中,指出: 内存映射计数器模块,需要 此模块控制系统计数器。它有个框架: • 一个控制
    发表于 05-12 06:18

    IC设计:RAM的应用-统计计数

    在进行模块设计时,我们经常需要统计报文的数量,以供软件(or 主机)读取,有些统计仅仅用于debug,有些统计是协议要求,有些统计是为了便于功能实现。
    的头像 发表于 11-17 17:16 428次阅读
    IC设计:<b class='flag-5'>RAM</b>的应用-<b class='flag-5'>统计</b><b class='flag-5'>计数</b>