-
2014-10-21 22:11:16
这里简单认为同步RAM的读写在时钟驱动下,而异步不是。
需要理解的是在一本书上讲:同步RAM的好处是它的带宽可以做的很大,可以采用流水线(pipeline)结构。
所谓RAM的带宽可以认为就是其读写时钟频率,速度越快,带宽越大。而且流水线技术也是为了提高读写速度。
对于同步RAM连续读写有两种模式,flow-through模式 和 pipelined模式。
flow-through模式 是时钟上升沿采样到地址数据,在第二个时钟上升沿采样要写入的数据或者要读出的数据,pipelined模式 是时钟上升沿采样到地址数据,在第二个时钟上升沿采样要写入的数据或者要读出的数据。
更多相关内容 -
ram同步与异步时序
2016-09-09 15:19:02Verilog一例(同步与异步时序) 问题 顶层模块有一个50MHz时钟输入(使用testbench实现),一个8位信号输出。 有一个容量为90的8位RAM子模块,每个时钟上升沿,RAM根据8位地址线,输出对应的数据。 ...Verilog一例(同步与异步时序)
问题-
顶层模块有一个50MHz时钟输入(使用testbench实现),一个8位信号输出。
-
有一个容量为90的8位RAM子模块,每个时钟上升沿,RAM根据8位地址线,输出对应的数据。
-
顶层模块在每100个时钟周期里,前10个时钟周期信号无效,输出为0;后面90个时钟周期,输出值分别为RAM中地址0~89的数据。
代码实现
RAM子模块
module ram(
input clk,
input [7:0] addr,
output reg [7:0] data
);
always @(posedge clk) begin
data <= addr;
end
endmodule
顶层模块
module sync_async(
);
// 50MHz时钟 testbench
reg clk = 0;
always #10 clk = ~clk;
// 0~99循环计数器
reg [7:0] cnt = 0;
always @(posedge clk) begin
if(cnt == 99)
cnt <= 0;
else
cnt <= cnt + 1;
end
// 数据有效
wire valid;
assign valid = cnt >= 10;
// 地址线
wire [7:0] addr;
assign addr = cnt - 10;
// 调用子模块,读取ram数据
wire [7:0] ramdata;
ram ram1(clk, addr, ramdata);
// 输出
wire [7:0] out;
assign out = valid ? ramdata : 0;
endmodule
仿真与分析
一眼看上去,好像程序是没有问题的。
使用软件进行仿真后的时序图如下。
从仿真波形就看出问题来了。当
cnt=0~9
的时候,输出都是out=0
没有问题。但是当cnt=10
的时候,输出变成了255。之后所有的数据都滞后了一个时钟周期。原因在于代码中的同步异步设计不协调。
代码中,RAM子模块是上升沿触发并且同步输出的(这样也比较符合正常的RAM结构),而不是直接由组合逻辑电路实现。如果直接将
assign addr = cnt - 10
作为RAM的地址线,RAM的输出相对于addr和cnt的值会滞后一个周期。也就是说,当RAM输出地址为0的数据时,实际上addr的值已经是1了。在RAM模块的always语句中(
always @(posedge clk) data <= addr;
),使用同步赋值操作data <= addr
在时钟上升沿时触发,上升沿结束后data输出的值,为上升沿前一瞬间addr的值。而另一方面,
valid
变量却使用的是直接异步赋值,相比cnt,不会有滞后。于是在
cnt==10
的时候,valid已经变成1,而RAM还没有输出地址为0的数据,所以发生了与设计不相符的问题。解决方法
一种比较容易想到的方法是,将valid信号的跳变,也设计成和RAM一样的上升沿同步触发。即将
// 数据有效
wire valid;
assign valid = cnt >= 10;
改为
// 数据有效
reg valid = 0;
always @(posedge clk) begin
valid = cnt >= 10;
end
修改正确后的仿真波形如下图,可以看出valid信号和RAM信号相对于cnt,都滞后了一个周期。从而实现了问题中给出的要求。
-
-
关于同步RAM和异步RAM时钟设计的问题
2022-04-06 17:16:41异步单口RAM(假如是同步读,异步写)意味着唯一的端口的“读”是受到时钟控制的,而“写”是不受时钟控制的(就是一个组合逻辑电路) 问题1:请问以上四点的描述是否准确? 问题2:在保证两个时钟不会重合的前提下... -
数字IC笔试基础:同步与异步双端口RAM实现
2020-04-03 19:41:56数字IC设计——SRAM的Verilog语言实现(三)(双端口SRAM) 在FPGA设计中,经常会用到RAM,这里的RAM一般指的是静态的RAM(SRAM)。一般FPGA中就有所谓的block RAM, 它就是现成的RAM...1)用Verilog实现一个同步双端...数字IC笔试基础——RAM的Verilog语言实现
在FPGA设计中,经常会用到RAM,这里的RAM一般指的是静态的RAM(SRAM)。一般FPGA中就有所谓的block RAM, 它就是现成的RAM资源。通常情况下,我们使用IP核,进行设计,我们来设计自己的IP核。
RAM分为单端、伪双端、真双端三种模式。
1、单端RAM读写共享一个地址
2、伪双端RAM一个写端口,一个读端口,各自的地址和使能信号,写端口只负责写,读端口只负责读,所以称为伪双端
3、真双口RAM可以在任意时间访问任意地址,两个端口的地址是一样的,即共享内存和地址。这就会带来一个问题:同时读写一个地址会发生冲突。基于这个点矛盾就要设置限制条件。
我们使用伪双端RAM(在这里就称为双端口RAM)做数据缓存,其中FIFO就是基于双端口RAM。FIFO分为同步和异步,是因为双口RAM分为同步和异步。下节介绍同步和异步FIFO的IP实现。
主要设计如下ram:
1、用Verilog实现一个同步双端口ram,深度128,位宽16bit。A口写入,B口读出。支持片选,读写请求,要求代码可综合。
2、用Verilog实现一个异步双端口ram,深度128,位宽16bit。A口写入,B口读出。支持片选,读写请求,要求代码可综合。一、用Verilog实现一个同步双端口ram,深度128,位宽16bit
A口写入,B口读出。支持片选,读写请求,要求代码可综合。
设计框图如下:
verilog 代码实现:module double_ram( clk, rst_n, cs_n,//片选信号,低有效 //A port write signals wrdata_a, wraddr_a, wrena_n, //B port read signals rdaddr_b, rdenb_n, rddata_b); parameter ADDR_WIDTH=7; parameter DATA_WIDTH=16; parameter DATA_DEPTH=128; input clk; // input signal default type wire input rst_n; input cs_n; input [DATA_WIDTH-1:0]wrdata_a; input [ADDR_WIDTH-1:0]wraddr_a; input wrena_n; input [ADDR_WIDTH-1:0]rdaddr_b; input rdenb_n; output [DATA_WIDTH-1:0]rddata_b; reg [DATA_WIDTH-1:0]rddata; integer i; reg [DATA_WIDTH-1:0] mem [DATA_DEPTH-1:0];// 定义一个位宽为DATA_WIDTH,深度为DATA_DEPTH的存储器 always@(posedge clk or negedge rst_n) begin if(~rst_n) begin for(i=0;i<DATA_DEPTH;i=i+1) mem[i]<=0; end else if(cs_n==1'b0 & wrena_n==1'b0 )//片选和写信号均低有效 mem[wraddr_a]<=wrdata_a; //写入 end always@(posedge clk or negedge rst_n)begin if(~rst_n)begin rddata<=0; end else if(cs_n==1'b0 & rdenb_n==1'b0)begin rddata<=mem[rdaddr_b]; end else rddata<=rddata; end assign rddata_b=rddata; endmodule
重点:
1、代码的参数化设计,调用时更加灵活。
2、存储器的声明与初始化testbench仿真测试:
`timescale 1 ns/ 1 ps module double_ram_tb( ); // input type ---> reg // output type ---> wire reg clk; reg rst_n; reg cs_n; reg [15:0]wrdata_a; reg [7:0] wraddr_a; reg wrena_n; reg [7:0]rdaddr_b; reg rdenb_n; wire [15:0]rddata_b; //参数化调用 double_ram #( .ADDR_WIDTH(7), .DATA_WIDTH(16), .DATA_DEPTH(128)) double_ram_u0 ( .clk(clk), .rst_n(rst_n), .cs_n(cs_n),//片选信号,低有效 // A port write signals .wrdata_a(wrdata_a), .wraddr_a(wraddr_a), .wrena_n(wrena_n), // B port read signals .rdaddr_b(rdaddr_b), .rdenb_n(rdenb_n), .rddata_b(rddata_b) ); //generate clk always # 10 clk=~clk; initial begin clk=1'b1; rst_n=1'b0; cs_n=1'b1; wrena_n=1'b1; wraddr_a=0; wrdata_a=0; rdenb_n=1'b1; rdaddr_b=0; #50 rst_n=1'b1; cs_n=1'b0; #10 wrena_n=1'b0; repeat (127)begin @(posedge clk )begin wraddr_a=wraddr_a+1; wrdata_a=wrdata_a+1; end end #35 wrena_n=1'b1; rdenb_n=1'b0; repeat (127)begin @(posedge clk )begin rdaddr_b=rdaddr_b+1; end end #50 rdenb_n=1'b1; cs_n = 1'b1; #100 $stop; end endmodule
先向RAM中写入128个数据,然后再读出来,写入和读出一样,需要注意的时读出的数据延时一拍(因为读时使用触发器在时钟上升沿读出),至此同步双端口RAM IP已实现,下面实现异步双端口RAM IP。二、用Verilog实现一个异步双端口ram,深度128,位宽16bit
A口写入,B口读出。支持片选,读写请求,要求代码可综合。
设计框图:
verilog 代码实现:module double_ram( rst_n, cs_n,//片选信号,低有效 //A port write signals clk_a, wrdata_a, wraddr_a, wrena_n, //B port read signals clk_b, rdaddr_b, rdenb_n, rddata_b); parameter ADDR_WIDTH=7; parameter DATA_WIDTH=16; parameter DATA_DEPTH=128; input clk_a; // input signal default type wire input clk_b; input rst_n; input cs_n; input [DATA_WIDTH-1:0]wrdata_a; input [ADDR_WIDTH-1:0]wraddr_a; input wrena_n; input [ADDR_WIDTH-1:0]rdaddr_b; input rdenb_n; output [DATA_WIDTH-1:0]rddata_b; reg [DATA_WIDTH-1:0]rddata; integer i; reg [DATA_WIDTH-1:0] mem [DATA_DEPTH-1:0];// 定义一个位宽为DATA_WIDTH,深度为DATA_DEPTH的存储器 always@(posedge clk_a or negedge rst_n) begin if(~rst_n) begin for(i=0;i<DATA_DEPTH;i=i+1) mem[i]<=0; end else if(cs_n==1'b0 & wrena_n==1'b0 )//片选和写信号均低有效 mem[wraddr_a]<=wrdata_a; //写入 end always@(posedge clk_b or negedge rst_n)begin if(~rst_n)begin rddata<=0; end else if(cs_n==1'b0 & rdenb_n==1'b0)begin rddata<=mem[rdaddr_b]; end else rddata<=rddata; end assign rddata_b=rddata; endmodule
1、两者的区别只是时钟不同。
2、分别使用同步双端口RAM和异步双端口RAM构造同步FIFO和异步FIFO。
3、仿真只需生成两个不同的时钟即可,有兴趣自己完成。参考:https://blog.csdn.net/vivid117/article/details/102659951
-
同步和异步的区别在哪
2018-04-09 21:22:44同步和异步的区别?同步交互: 指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待程;异步交互: 指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。区别:一个需要等待,一个...同步和异步的区别?
同步交互: 指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待程;
异步交互: 指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。
区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先
选择不需要等待的异步交互方式。
哪些情况建议使用同步交互呢?比如银行的转账系统,对数据库的保存操作等等,都
会使用同步交互操作,其余情况都优先使用异步交互。同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。
-
RAM学习笔记(SRAM,DRAM,同步,异步)
2021-07-28 19:25:23RAM学习笔记SRAM和DRAM区别与联系器件结构SRAMDRAM性能差异使用场景SRAM类别与实现单端口伪双端口双端口同步与异步 SRAM和DRAM区别与联系 从基本的cell结构上划分,RAM分为SRAM和DRAM,二者在性能,成本,使用场景上... -
同步和异步的区别及优缺点
2018-11-26 21:41:42学习编程,同步异步是必须要理解学习的知识点,同步和异步的区别和有确定往往都是相对的,各自有各自的使用场景,同步的优点往往就是异步的缺点,反过来亦然。 -
同步SRAM和异步SRAM FPGA时序约束和分析
2013-11-29 10:42:38This document describes Altera TimeQuest timing constraints and analysis for synchronous and asynchronous interfaces, Including a sample project. -
同步电路和异步电路的区别
2020-05-19 15:12:04同步电路是由时序电路(寄存器和各种触发器)和组合逻辑电路构成的电路,其所有操作都是在严格的时钟控制 下完成的。这些时序电路共享同一个时钟CLK,而所有的状态变化都是在时钟的上升沿(或下降沿 -
同步和异步FIFO
2021-11-27 19:45:31FiFo外部是没有地址的,外部端口只负责读写,内部RAM有地址...两边速度不同的情况下,RAM的空间和两边读写速度满足一定的公式就可随意读写 FIFO中的RAM设计 module dp_ram #(parameter DLY = 1, RAM_WIDTH = 8, RA. -
FPGA同步和异步电路
2018-07-21 09:33:06异步电路和同步时序电路的区别。 异步电路: 电路核心逻辑有用组合电路实现; 异步时序电路的最大缺点是容易产生毛刺; 不利于器件移植; 不利于静态时序分析(STA)、验证设计时序性能。 同步时序电路... -
同步FIFO和异步FIFO总结
2020-09-17 17:06:09关于异步FIFO最小深度的计算9.1 写时钟快于读时钟,写和读的过程中没有空闲周期9.2 写时钟频率大于读时钟频率,但在读写的过程中存在空闲周期9.3 写时钟慢于读时钟,且读写过程中没有空闲周期9.4 写时钟频率小于读... -
【FPGA】单端口RAM的设计(异步读、同步写)
2019-05-28 17:31:12上篇博文讲到了:单端口同步读写RAM的设计,那里对RAM的读写采用的是同步的方式,也就是和时钟同步,读写都依赖于时钟。 这篇博文,我们的写依然是同步的,但是读是异步的,所谓的异步就是指不依赖于时钟,这点我们... -
同步FIFO和异步FIFO
2017-09-19 09:30:031.定义 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据, 其数据地址由内部... -
同步FIFO和异步FIFO的实现
2021-06-10 14:14:40同步 FIFO 实现较为直接,如下图所示,一个 FIFO 内部实现了 RAM 和一个控制读写的控制端,和普通的随机存储器不一样的是,FIFO 内部需要自动产生读写地址。 控制端产生空、满信号。因此如何实现控制端去产生空满... -
同步逻辑和异步逻辑,同步电路和异步电路
2021-01-14 05:36:581、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其... -
什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么(转)
2020-12-24 04:30:301、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其... -
【FPGA】单端口RAM的设计(异步读、异步写)
2019-05-28 20:42:04前面有博文写了同步读写和异步读、同步写的单端口RAM设计: 【FPGA】单端口RAM的设计(同步读、同步写) 【FPGA】单端口RAM的设计(异步读、同步写) 这篇博文讲异步读写: 在博文:【FPGA】单端口RAM的设计... -
Verilog实现RAM(3-单端口同步写、异步读SRAM)
2020-02-24 12:58:27在之前的工作中,我们对常见存储器件进行了名词扫盲,并通过调用IP核实现了简单的同步读写SRAM;并进一步对同步读写SRAM进行了Verilog...现在在之前工作的基础上,进一步实现单端口同步写,异步读SRAM 一、原理 与... -
数字IC设计系列----单端口RAM、双端口RAM、同步FIFO、异步FIFO
2020-10-03 16:58:29三、同步FIFO原理及实现 1.原理 2.Verilog实现 3.优缺点分析 四、异步FIFO原理及实现 1.原理 2.Verilog实现 3.优缺点分析 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、单端口RAM... -
异步和同步数据备份的差别_备份和同步数据的最佳文章
2020-10-01 08:36:29异步和同步数据备份的差别World Backup Day is March 31st and we decided to provide you with some useful information to make backing up your data easier. We’ve published articles about backing up ... -
同步和异步的区别
2014-01-24 10:10:30通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步。所谓异步传输是指字符与字符(一个字符结束到下一个字符开始)之间的时间间隔是... -
IC设计 — 同步FIFO和异步FIFO设计实现(一)
2021-04-19 23:22:46FIFO介绍1.1 FIFO参数1.2 full/empty 检测1.3 同步FIFO和异步FIFO2. FIFO设计2.1 二进制和格雷码2.2 同步FIFO2.3 异步FIFO总结 1. FIFO介绍 FIFO(First In First Out),是一种先进先出的数据缓存器,它与... -
同步逻辑电路和异步逻辑电路
2021-03-15 20:42:00只被一个时钟信号驱动的设计称为同步逻辑,因为所有的记忆元素(比如寄存器、RAM。锁存器等)都被同一个时钟信号驱动,他们的输出都是同时变化的,因此对数字电路的影响也是同步的。典型的同步逻辑电路如下: 上面... -
verilog实现(infer)一个异步(双口)RAM
2018-10-13 17:01:21在异步FIFO的应用中所用的存储器一般都是RAM,所以异步的RAM对于异步FIFO实现是基础的 module asyn_ram #(parameter DWIDTH=4,//data width AWIDTH=10)//address width ( input wr_clk, input[DWIDTH-1:0] ... -
RAM和ROM的区别
2020-11-15 13:01:55是计算机内部存储器中的一种,也是其中最重要的,计算机和手机中一般把其叫做(运行)内存,它的速度要比硬盘快得多,所以用运行程序在RAM中,而存放运行时不用的数据则在硬盘中,什么时候需要数据,便把数据从硬盘... -
Verilog中同步复位和异步复位比较
2020-12-19 17:21:00【Verilog】 同步复位和异步复位比较 同步复位 sync 异步复位 async 特点 复位信号只有在时钟上升沿到来时才能有效。 无论时钟沿是否到来,只要复位信号有效,就进行复位。 Verilog描述 ... -
异步简单双口RAM的实现
2020-08-05 16:59:36RAM的分类 RAM,随机存取存储器,有单口和双口之分,单口RAM...另外根据时钟的不同,RAM还有同步异步之分,同步RAM是指读写采用同一个时钟,异步RAM是指读写的时钟不同。 异步简单双口RAM的实现 实现的双口RAM的功能 -
【verilog】同步FIFO与异步FIFO
2019-08-22 19:34:37一、同步FIFO FIFO表示先进先出的意思。是基于RAM的存储模块,一般多是用于缓冲数据,令模块独立,调用方便、随性。学习FIFO最重要的如何建立先进先出的机制。 图1:先用一个简单的示意图说明: 图1 左边有写入使能...