存储器。

1. rom,ram,flash,ddr,sram,dram,mram..列举并解释一下这些名词。

2. 用verilog实现一个深度为16,位宽8bit的单端口SRAM。搭建一个仿真环境,完成初始化,读取,写入的操作。

3. 接第2题,如果同时对一个地址进行读和写操作,会怎样?实际中应该如何处理?

4. 使用单端口SRAM构造一个双端口同步FIFO。



解答:

1. rom,ram,flash,ddr,sram,dram,mram..列举并解释一下这些名词。

ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别

ROM内部的资料是在ROM的制造工序中,在工厂里用特殊的方法被烧录进去的,其中的内容只能读不能改,一旦烧录进去,用户只能验证写入的资料是否正确,不能再作任何修改。如果发现资料有任何错误,则只有舍弃不用,重新订做一份。ROM是在生产线上生产的,由于成本高,一般只用在大批量应用的场合。

由于ROM制造和升级的不便,后来人们发明了PROM(Programmable ROM,可编程ROM)。最初从工厂中制作完成的PROM内部并没有资料,用户可以用专用的编程器将自己的资料写入,但是这种机会只有一次,一旦写入后也无法修改,若是出了错误,已写入的芯片只能报废。PROM的特性和ROM相同,但是其成本比ROM高,而且写入资料的速度比ROM的量产速度要慢,一般只适用于少量需求的场合或是ROM量产前的验证。

EPROM(Erasable Programmable ROM,可擦除可编程ROM)芯片可重复擦除和写入,解决了PROM芯片只能写入一次的弊端。EPROM芯片有一个很明显的特征,在其正面的陶瓷封装上,开有一个玻璃窗口,透过该窗口,可以看到其内部的集成电路,紫外线透过该孔照射内部芯片就可以擦除其内的数据,完成芯片擦除的操作要用到EPROM擦除器。

鉴于EPROM操作的不便,后来出的主板上的BIOS ROM芯片大部分都采用EEPROM(Electrically Erasable Programmable ROM,电可擦除可编程ROM)。EEPROM的擦除不需要借助于其它设备,它是以电子信号来修改其内容的,而且是以Byte为最小修改单位,不必将资料全部洗掉才能写入,彻底摆脱了EPROM Eraser和编程器的束缚。

FLASH ROM则属于真正的单电压芯片,在使用上很类似EPROM,因此,有些书籍上便把FLASH ROM作为EPROM的一种。事实上,二者还是有差别的。FLASH ROM在擦除时,也要执行专用的刷新程序,但是在删除资料时,并非以Byte为基本单位,而是以Sector(又称Block)为最小单位,Sector的大小随厂商的不同而有所不同;只有在写入时,才以Byte为最小单位写入;FLASH ROM芯片的读和写操作都是在单电压下进行,不需跳线,只利用专用程序即可方便地修改其内容;FLASH ROM的存储容量普遍大于EPROM,约为512K到至8M KBit,由于大批量生产,价格也比较合适,很适合用来存放程序码,近年来已逐渐取代了EPROM,广泛用于主板的BIOS ROM,也是CIH攻击的主要目标。

随机访问内存(RAM)相当于PC机上的移动存储,用来存储和保存数据的。在任何时候都可以读写,RAM通常用作操作系统或其他正在运行的程序的临时存储介质(可称作系统内存)。不过,当电源关闭时时RAM不能保留数据,如果需要保存数据,就必须把它们写入到一个长期的存储器中(例如硬盘)。正因为如此,有时也将RAM称作"可变存储器"。RAM内存可以进一步分为静态RAM(SRAM)和动态内存(DRAM)两大类。

静态随机存取存储器Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。

SRAM不需要刷新电路即能保存它内部存储的数据。而DRAM(Dynamic Random Access Memory)每隔一段时间,要刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,功耗较DRAM大   ,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积。同样面积的硅片可以做出更大容量的DRAM,因此SRAM显得更贵。

参考文献:百度百科


2. 用verilog实现一个深度为16,位宽8bit的单端口SRAM。搭建一个仿真环境,完成初始化,读取,写入的操作。

方式一:手写代码

参考:Verilog极简教程

module mini_sp_ram #(parameter ADDR_BITS=4
)(    input             clk,input      [ 7:0] addr,input      [ 7:0] din,input             ce,input             we,output reg [ 7:0] dout
);localparam MEM_DEPTH= 1<<ADDR_BITS;reg [7:0] mem[MEM_DEPTH-1:0];// synopsys_translate_off
integer i;
initial beginfor(i=0; i<MEM_DEPTH;i=i+1) beginmem[i] = 8'h00;end
end
// synopsys_translate_onalways @(posedge clk) beginif(ce & we) beginmem[addr] <= din;end
endalways @(posedge clk) beginif(ce && (!we)) begindout <= mem[addr];end
endendmodule

这段代码有一段:

// synopsys_translate_off
integer i;
initial begin
    for(i=0; i<MEM_DEPTH;i=i+1) begin
        mem[i] = 8'h00;
    end
end
// synopsys_translate_on

可能会让人疑惑,这能综合吗?

后来特意查了下,原来是我等太为浅薄:

引导语句“// synopsys translate_off”

以前一直没弄懂,以为就是个简单的注释完事,原来还可以用来引导综合过程:

设计者在写设计代码时,有时可能针对仿真写一些语句,这些语句可能是不为DC所接受,也不希望DC接受;设计者如果不对这些语句进行特殊说明,DC读入设计代码时就会产生语法错误。

另一种情况是,设计者在写设计代码,有些设计代码是为专有的对象写的(如公司内部),这些专有的设计代码可能不希望被综合。

Synopsys提供了引导语句,设计者可以使用这些引导语句控制DC综合的对象。
在设计代码中,引导语句“// synopsys translate_off”后直到“// synopsys translate_on”之间的语句被DC忽略。

参考链接:引导语句“// synopsys translate_off”

测试文件(参考:https://halftop.github.io/post/verilog-day13/):

`timescale 1ns / 1ps
//
// Company:
// Create Date: 2019/05/16 21:04:57
// Design Name:
// Module Name: SRAM_tb
//module sram_tb();reg [3 : 0] addr;reg [7 : 0]data_in;reg clk;reg we;reg ce;wire [7 : 0] data_out;integer i;//clock generationinitial beginclk = 0;forever#4 clk = ~clk;endinitial begince = 1'b0;we = 1'b0;addr = 4'd0;data_in = 8'h00;#20@(negedge clk)//readce = 1'b1;for (i = 0; i<16; i=i+1) begin@(negedge clk)addr = i;end@(negedge clk)//writewe = 1'b1;for (i = 0; i<16; i=i+1) begin@(negedge clk) beginaddr = i;data_in = data_in + 'h01;endend@(negedge clk)//readwe = 1'b0;for (i = 0; i<16; i=i+1) begin@(posedge clk)addr = i;end@(negedge clk)ce = 1'b0;//#100 $finish;#100 $stop;endsram #( .ADDR_BITS(4) ) u_sram(.clk(clk),.ce(ce),.we(we),.addr(addr),.din(data_in),.dout(data_out));endmodule

行为仿真时序图:

方式二(用FPGA的IP核生成):

可以采用Distributed RAM以及Block RAM生成,这里采用Distributed RAM生成:

生成的模板:

SRAM your_instance_name (
  .a(a),      // input wire [3 : 0] a
  .d(d),      // input wire [7 : 0] d
  .clk(clk),  // input wire clk
  .we(we),    // input wire we
  .spo(spo)  // output wire [7 : 0] spo
);

仿真文件:

`timescale 1ns / 1ps
//
// Company:
// Create Date: 2019/05/16 21:04:57
// Design Name:
// Module Name: SRAM_tb
//module SRAM_tb();reg [3 : 0] addr;reg [7 : 0]data_in;reg clk;reg we;wire [7 : 0] data_out;integer i;//clock generationinitial beginclk = 0;forever#4 clk = ~clk;endinitial beginwe = 1'b0;addr = 4'd0;data_in = 8'h00;#20@(negedge clk)//readfor (i = 0; i<16; i=i+1) begin@(negedge clk)addr = i;end@(negedge clk)//writewe = 1'b1;for (i = 0; i<16; i=i+1) begin@(negedge clk) beginaddr = i;data_in = data_in + 'h01;endend@(negedge clk)//readwe = 1'b0;for (i = 0; i<16; i=i+1) begin@(posedge clk)addr = i;end// #100 $finish;#100 $stop;endSRAM U0_SRAM (.a(addr),      // input wire [3 : 0] a.d(data_in),      // input wire [7 : 0] d.clk(clk),  // input wire clk.we(we),    // input wire we.spo(data_out)  // output wire [7 : 0] spo
);endmodule


3. 接第2题,如果同时对一个地址进行读和写操作,会怎样?实际中应该如何处理?

单端口SRAM,不能同时读写!

但第4题用单端口SRAM构造一个双端口同步FIFO,可以同时读写。


4. 使用单端口SRAM构造一个双端口同步FIFO。

使用单端口SRAM制作双端口FIFO

算了吧,暂时实力不足,时间也不允许这样搞,费点资源搞直接点。

【Verilog HDL 训练】第 13 天(存储器、SRAM)相关推荐

  1. 【Verilog HDL 训练】第 11 天(分频电路)

    设计一个占空比50%的三分频电路. 针对这个分频器,博文的末尾会给出一个反面教材,这是我上次写的一个分频器,看起来很好,其实是不能综合的.针对其中的错误,我令立博文记录之:[ Verilog ]alw ...

  2. 【Verilog HDL 训练】第 06 天(边沿检测)

    1. 复习verilog语法 [选做题] - reg和wire的区别 寄存器数据类型 Verilog中规定,凡是在程序块中被赋值的变量,都必须是寄存器类型的.(程序块:例如always块) 这里未免还 ...

  3. 【Verilog HDL 训练】第 07 天(串并转换)

    串并转换 1. 复习verilog语法 [选做题] - 文件操作fopen fdisplay fwrite fclose - 生成随机数 random - 初始化 readmemh readmemb ...

  4. 【Verilog HDL 训练】第 14 天(glitch-free的两个时钟切换电路)

    2019年5月13日 glitch-free的两个时钟切换电路. 可以看到这是一个星期之前的题目了,现在才抽空做,把这篇颠倒个顺序吧,也是最后一天了,以后的题目都是讨论性质的,不会以第多少天的形式来写 ...

  5. 【Verilog HDL 训练】第 04 天(竞争、冒险、译码等)

    1. 什么是竞争和冒险? 记得我刚学FPGA那会,恶补基础知识,其中之一就是竞争与冒险,我参考了<FPGA之道>,记录了几篇博客: [ FPGA ]组合逻辑中的竞争与险象问题(一) 第一篇 ...

  6. 【Verilog HDL 训练】第 10 天(PWM 呼吸灯)

    5月8日 PWM 用verilog实现PWM控制呼吸灯.呼吸周期2秒:1秒逐渐变亮,1秒逐渐变暗.系统时钟24MHz,pwm周期1ms,精度1us. 今天的题目我是第一次见,答案借鉴大神的:Veril ...

  7. 【Verilog HDL 训练】第 09 天(按键消抖)

    5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...

  8. 【Verilog HDL 训练】第 08 天(二进制、Johnson、环形计数器)

    5月6日 计数器 1. 用verilog实现一个4bit二进制计数器. a) 异步复位 b) 同步复位 input clk, rst_n; output [3:0] o_cnt; Verilog实现代 ...

  9. 【Verilog HDL 训练】第 05 天(序列检测)

    1. dff和latch有什么区别. 锁存器是一种对脉冲电平(也就是0或者1)敏感的存储单元电路,而触发器是一种对脉冲边沿(即上升沿或者下降沿)敏感的存储电路. "触发器" 泛指一 ...

最新文章

  1. # 2017-2018-1 20155224 《信息安全系系统设计基础》实验四
  2. 在.NET中从app.config或web.config读取设置
  3. ES transport client使用
  4. 运维工程师 | 交换机堆叠
  5. qt中设置父窗口中某一控件样式后,子窗口中某一控件也随父控件样式
  6. 为什么 React Native 连遭 Airbnb、Udacity 抛弃?
  7. 项目实战之服务端分页的实现——SQL
  8. 还记得爆火的图解算法吗?现在图解机器学习算法书来了!送书10本!
  9. 城通网盘API的链接研究
  10. echarts常见图形-不同种类不同颜色柱状图(二)
  11. C语言4位BCD码加法器,四位二进制8421BCD码加法器.doc
  12. 第十五周 项目三 归并排序算法的改进
  13. 经典 CNN 神经网络 LeNet-5 的 C++ 实现(MNIST数据集)
  14. iosetup mysql_InnoDB:Error:io_setup()failedwithEAGAIN
  15. C#【必备技能篇】VS2019 使用C/C++ 生成DLL 文件,并用 C/C++、C#调用DLL
  16. hasnext() java_关于Java:为什么HasNeXT()false,但hasNextLine() 是真的?
  17. XP系统经典故障FAQ
  18. ZYPlayer隐藏功能!再不看就被删掉了!
  19. 【docker】Docker核心技术快速入门及私有仓库搭建
  20. XenDesktop 5 .VS.View 4.5

热门文章

  1. 2005-3-28 + 探索ASP.NET Forum (1) 最初的印象
  2. yjv是电缆还是电线_电力电缆YJV与BVV二者之间的区别是什么?
  3. android fersco 框架,Android Fresco框架的简单使用
  4. oracle10g提权,Oracle 10g提权测试
  5. 安装黑屏_含能公司黑屏管理助力智能化改造
  6. HTML控制文本框只能输入数字和小数点,并且只能保留小数点后两位 金额转换,阿拉伯数字的金额转换成 面试题
  7. Js 对小数的处理(科学计数法 , 显示精度)
  8. 五连阳回调买入法_短线高手总结的强势股回调买入法,散户需牢记
  9. 智能车竞赛技术报告 | 双车接力组 - 东北大学 - 三好学生
  10. Python - 移除List中重复项的五种常用方法