在进行模块设计时,我们经常需要进行数据位宽的转换,常见的两种转换场景有同步时钟域位宽转换和异步时钟域位宽转换。本文将介绍异步时钟域位宽转换 异步时钟域的位宽转换读时钟和写时钟属于两个时钟。如下案例中,数据位宽由32bit转40bit,写时钟频率156.25MHz,读时钟频率125Mhz,写数据为32bit,读数据位宽为40bit,通过计算得到入口数据速率和出口数据速率保持一致(156.25*32==40*125)。存储模块是由寄存器搭建的。那么需要多大存储模块呢?32和40的最小公倍数为160,极限场景下,只需要160bit的寄存器作为存储就够了,但是读操作通常晚于写操作,并且考虑到时钟有抖动有偏移,为了避免溢出,稍微增加一部分缓存,我们可以采用320bit作为存储模块。因此写侧32bit写10次,读侧40bit读8次,读写两侧所需的时间相等。注意事项:写地址(wr_addr)跳转范围是0~9,读地址(rd_addr)跳转范围0~7。
如图所示:buff_array为320bit的数据存储。vld_array为80bit的有效标志位存储:vld_array[n]为1表示buff_array[4n+3:4n]存在4bit的有效数据。
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文章
5036浏览量
117762 -
RAM
+关注
关注
7文章
1322浏览量
113708 -
存储模块
+关注
关注
0文章
14浏览量
8830
原文标题:IC设计:ram的应用 - 位宽转换
文章出处:【微信号:IP与SoC设计,微信公众号:IP与SoC设计】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
tms320f28069 char是16位宽的麻烦
一个很 麻烦的问题,就是他的 ram最小位宽是16位的, 在编译器里的 发现 char 和 short 和int 的sizeof 都1,即16位
发表于 09-13 09:38
RocketIO TM GTP在串行高速接口中的位宽设计
的数据处理主体逻辑之前,还必须进行等速率的时钟域和位宽的转换。为此,本文在对Virtex-5 RocketIOTMGTP进行了解的基础上,针对串行高速接口开发中位
发表于 12-11 11:04
请推荐反激有源钳位的IC
请TI工程师推反激有源钳位的IC,主要应用在DC-DC电源上,因宽电压输入9-36V范围,若用正激有源钳位的话二次侧续流管会是比较难处理的问题,加之体积小,所以想用反激有源钳
发表于 07-05 11:51
Ultrascale器件中如何将字节宽写入启用转换为位wibe写入enalbe?
大家好, 在Ultrascale器件中,RAM具有字节宽写入使能,但我想要Bit Wide Write Enable,所以 如何将字节宽写入启用转换为
发表于 04-26 13:53
如何构建一个具有不同读写位宽的异步双端口RAM模块?
你好我正在尝试构建一个具有不同读写位宽的异步双端口RAM模块。我已经参考了Xilinx综合指南(UG901)和Xilinx用户指南(UG687)中提供的示例。这两个指南都会使用写入数据宽度小于读取
发表于 08-04 08:15
怎么实现RocketIOTM GTP在串行高速接口中的位宽设计?
本文在对Virtex-5 RocketIOTM GTP进行了解的基础上,针对串行高速接口开发中位宽不匹配的问题,提出了一种位宽转换方法,以解
发表于 05-28 06:21
带升降压转换器的宽输入电源管理ic是否有可能消除N-MOSFET呢?
我们有一个带升降压转换器的宽输入电源管理 ic。28V VBUS 不是问题。那么是否有可能消除 N-MOSFET(至少在 Sink 模式下)?如果可以,您对 IN_GD、Gate 和 Source 引脚的连接有何建议?
发表于 01-09 06:29
如何利用片内RAM单元直接转换BCD 码与 BIN 数据
把二进制数转换成 BCD 码,是很常见的,做而论道以前也发表过这样的程序。 但是,过去都是用寄存器,如果要求用片内RAM单元,就少见了。 当然,也可以把片内RAM单元的数据,先传送到寄存器,再利用
发表于 05-19 01:18
•3350次阅读
评论