精华内容
下载资源
问答
  • 关于同步RAM和异步RAM的研究
    千次阅读
    2014-10-21 22:11:16

    这里简单认为同步RAM的读写在时钟驱动下,而异步不是。

    需要理解的是在一本书上讲:同步RAM的好处是它的带宽可以做的很大,可以采用流水线(pipeline)结构。

    所谓RAM的带宽可以认为就是其读写时钟频率,速度越快,带宽越大。而且流水线技术也是为了提高读写速度。

     

    对于同步RAM连续读写有两种模式,flow-through模式 和 pipelined模式。
    flow-through模式 是时钟上升沿采样到地址数据,在第二个时钟上升沿采样要写入的数据或者要读出的数据,

    pipelined模式 是时钟上升沿采样到地址数据,在第二个时钟上升沿采样要写入的数据或者要读出的数据。

    更多相关内容
  • ram同步异步时序

    千次阅读 2016-09-09 15:19:02
    Verilog一例(同步异步时序) 问题 顶层模块有一个50MHz时钟输入(使用testbench实现),一个8位信号输出。 有一个容量为90的8位RAM子模块,每个时钟上升沿,RAM根据8位地址线,输出对应的数据。 ...

    Verilog一例(同步与异步时序)

    问题
    1. 顶层模块有一个50MHz时钟输入(使用testbench实现),一个8位信号输出。

    2. 有一个容量为90的8位RAM子模块,每个时钟上升沿,RAM根据8位地址线,输出对应的数据。

    3. 顶层模块在每100个时钟周期里,前10个时钟周期信号无效,输出为0;后面90个时钟周期,输出值分别为RAM中地址0~89的数据。

    代码实现

    RAM子模块

     
    1. module ram(
    2. input clk,
    3. input [7:0] addr,
    4. output reg [7:0] data
    5. );
    6. always @(posedge clk) begin
    7. data <= addr;
    8. end
    9. endmodule

    顶层模块

     
    1. module sync_async(
    2. );
    3. // 50MHz时钟 testbench
    4. reg clk = 0;
    5. always #10 clk = ~clk;
    6. // 0~99循环计数器
    7. reg [7:0] cnt = 0;
    8. always @(posedge clk) begin
    9. if(cnt == 99)
    10. cnt <= 0;
    11. else
    12. cnt <= cnt + 1;
    13. end
    14. // 数据有效
    15. wire valid;
    16. assign valid = cnt >= 10;
    17. // 地址线
    18. wire [7:0] addr;
    19. assign addr = cnt - 10;
    20. // 调用子模块,读取ram数据
    21. wire [7:0] ramdata;
    22. ram ram1(clk, addr, ramdata);
    23. // 输出
    24. wire [7:0] out;
    25. assign out = valid ? ramdata : 0;
    26. 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一样的上升沿同步触发。即将

     
    1. // 数据有效
    2. wire valid;
    3. assign valid = cnt >= 10;

    改为

     
    1. // 数据有效
    2. reg valid = 0;
    3. always @(posedge clk) begin
    4. valid = cnt >= 10;
    5. end

    修改正确后的仿真波形如下图,可以看出valid信号和RAM信号相对于cnt,都滞后了一个周期。从而实现了问题中给出的要求。

    展开全文
  • 异步单口RAM(假如是同步读,异步写)意味着唯一的端口的“读”是受到时钟控制的,而“写”是不受时钟控制的(就是一个组合逻辑电路) 问题1:请问以上四点的描述是否准确? 问题2:在保证两个时钟不会重合的前提下...
  • 数字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学习笔记SRAMDRAM区别与联系器件结构SRAMDRAM性能差异使用场景SRAM类别与实现单端口伪双端口双端口同步异步 SRAMDRAM区别与联系 从基本的cell结构上划分,RAM分为SRAMDRAM,二者在性能,成本,使用场景上...
  • 同步和异步区别及优缺点

    万次阅读 多人点赞 2018-11-26 21:41:42
    学习编程,同步异步是必须要理解学习的知识点,同步和异步区别和有确定往往都是相对的,各自有各自的使用场景,同步的优点往往就是异步的缺点,反过来亦然。
  • This 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:31
    FiFo外部是没有地址的,外部端口只负责读写,内部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 写时钟频率小于读...
  • 上篇博文讲到了:单端口同步读写RAM的设计,那里对RAM的读写采用的是同步的方式,也就是时钟同步,读写都依赖于时钟。 这篇博文,我们的写依然是同步的,但是读是异步的,所谓的异步就是指不依赖于时钟,这点我们...
  • 同步FIFO和异步FIFO

    万次阅读 多人点赞 2017-09-19 09:30:03
    1.定义 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据, 其数据地址由内部...
  • 同步 FIFO 实现较为直接,如下图所示,一个 FIFO 内部实现了 RAM 一个控制读写的控制端,普通的随机存储器不一样的是,FIFO 内部需要自动产生读写地址。 控制端产生空、满信号。因此如何实现控制端去产生空满...
  • 1、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其...
  • 1、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其...
  • 前面有博文写了同步读写和异步读、同步写的单端口RAM设计: 【FPGA】单端口RAM的设计(同步读、同步写) 【FPGA】单端口RAM的设计(异步读、同步写) 这篇博文讲异步读写: 在博文:【FPGA】单端口RAM的设计...
  • 在之前的工作中,我们对常见存储器件进行了名词扫盲,并通过调用IP核实现了简单的同步读写SRAM;并进一步对同步读写SRAM进行了Verilog...现在在之前工作的基础上,进一步实现单端口同步写,异步读SRAM 一、原理 与...
  • 三、同步FIFO原理及实现 1.原理 2.Verilog实现 3.优缺点分析 四、异步FIFO原理及实现 1.原理 2.Verilog实现 3.优缺点分析 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、单端口RAM...
  • 异步和同步数据备份的差别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 位停止位,以标记一个字符的开始结束,并以此实现数据传输同步。所谓异步传输是指字符与字符(一个字符结束到下一个字符开始)之间的时间间隔是...
  • FIFO介绍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】 同步复位和异步复位比较    同步复位 sync 异步复位 async 特点 复位信号只有在时钟上升沿到来时才能有效。 无论时钟沿是否到来,只要复位信号有效,就进行复位。 Verilog描述 ...
  • 异步简单双口RAM的实现

    千次阅读 2020-08-05 16:59:36
    RAM的分类 RAM,随机存取存储器,有单口和双口之分,单口RAM...另外根据时钟的不同,RAM还有同步异步之分,同步RAM是指读写采用同一个时钟,异步RAM是指读写的时钟不同。 异步简单双口RAM的实现 实现的双口RAM的功能
  • 【verilog】同步FIFO与异步FIFO

    千次阅读 2019-08-22 19:34:37
    一、同步FIFO FIFO表示先进先出的意思。是基于RAM的存储模块,一般多是用于缓冲数据,令模块独立,调用方便、随性。学习FIFO最重要的如何建立先进先出的机制。 图1:先用一个简单的示意图说明: 图1 左边有写入使能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,050
精华内容 6,820
关键字:

同步ram和异步ram区别