版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、如有帮助,欢迎支持。9双端口 RAM在高速数据采集中的应用利用传统方法设计的高速数据采集系统由于集成度低、 电路复杂,高速运行电路 干扰大,电路可靠性低,难以满足高速数据采集工作的要求。应用 FPGA可以 把数据采集电路中的数据缓存、 控制时序逻辑、地址译码、总线接口等电路全部 集成进一片芯片中,高集成性增强了系统的稳定性,为高速数据采集提供了理想 的解决方案。下面以一个高速数据采集系统为例介绍双端口 RAM的应用。该系统要求实现对频率为5MHz的信号进行采样,系统的计算处理需要对信号 进行波形分析,信号采样时间为25根据设计要求,为保证采样波形不失真,A/D采样频率用80MHz,采样精度为8
2、位数据宽度。计算得出存储容量需要 2K字节。其系统结构框图如图3所示,图4给出了具体电路连接图。笈LITI 0硝,址吃仲 r*发生中CPU17Msy 加横口2灯)9B3嬴速0据基羲系统布图7m品clm r师si Lm uj 一HC" *"也S4双堂口仙耐和读写控制逻辑及场冲棱块连接图根据设计要求,双端口 RAM的LPM_WIDTH 参数设置为8, LPM_WIDTHAD 参数设置为11(211=2048),使用读写使能端及读写时钟。 ADCLK、WRCLK和 地址发生器的计数频率为80MHz。A/D转换值对双端口 RAM的写时序为顺序写方式,每完成一次 A/D转换, 存储一
3、次数据,地址加1指向下一单元,因此写地址发生器(RAM_CONTROL) 采用递增计数器实现,计数频率与 ADCLK、WRCLK 一致以保证数据写入时序 的正确性。写操作时序由地址和时钟发生器、A/D转换时钟和双端口 RAM的写时钟产生。停止采样时 AD_STOP有效,写地址发生器停止计数,同时停止 对RAM的写操作。将地址发生器的计数值接至DSP总线可以获取采样的首尾指针。地址发生器单元一般用(VHDL)语言编程实现,然后生成符号文件 RAM_CONTROL在上层文件调用。其部分 VHDL语言程序如下:Qc=data; begin if CLR=1' thenWW<=0'
4、; elsif (CLK'cveni and CLK- Vy Ihen if ADS.TOP- T ihcn WR<='0': 4山1阜v=d闵灯 elfvif (d4la=1023) thcn WJOOOOOIMM)'i else 拆用©Tat *+ 1; ¥/R<=CLK aerJOns; 檄id if;end if;eKid if; end fiiocesi aa;对双端口 RAM的读操作采用存储器映像方式, 具读出端口接DSP的外扩RAM 总线,DSP可随机读取双端口 RAM的任一单元数据,以方便波形分析。 由于LPM_R
5、AM_DP模块的读端数据总线q不具有三态特性,因此调用三态缓冲器 74244 ,通过其将输出数据连接到DSP数据总线上。在高速数据采集电路中,数据缓存也可以用FIFO或单端口 RAM实现。用FIFO 进行数据缓存,由于其已经把地址发生部分集成在模块单元内,因此省去了一部 分程序编写,但是DSP却不能任意地访问FIFO的存储单元,只能是顺序写入 /读出数据,这样设计,系统的灵活性就大大降低。如果 DSP的分析计算需要 特定单元的数据,则系统的效率和速度会因为无效数据的读取而降低。使用单端口 RAM进行数据缓存同样存在一些问题。由 RAM侧看,DSP和A/D转换器 是挂在一条总线上的,当从RAM向
6、DSP传输数据的时候,A/D转换器就不能 有数据传到该总线上,否则会产生总线冲突,引起芯片损坏。解决这个问题就需 要增加电路。应用双端口 RAM就不存在这个问题,而且使系统结构划分更明确, 符合模块化设计思想。结语综上所述,利用FPGA芯片的高速工作特性,以及其内部集成嵌入式阵列和大 规模逻辑阵列的特点,设计存储器,三态缓存器、地址发生器、以及复杂的时序 逻辑电路等,应用于高速数据采集电路中可以使电路大大简化,性能提高。同时由于FPGA可实现在系统编程(ISP),使系统具有可在线更新、升级容易等特点, 是一种较为理想的系统及电路实现方法。在FPGA中构造存储器许多系列的FPGA芯片内嵌了存储阵
7、列,如ALTERA EP1K50芯片内嵌了 5K字节的存 储阵列。因此,在 FPGA中实现各种存储器,如单/双端口RAM、单/双端口 ROM、先进先出存储器FIFO等非常方便,而且具有诸多优点。其硬件可编程的特点允许开发人员灵 活设定存储器数据的宽度、存储器的大小、读写控制逻辑等,尤其适用于各种特殊存储要求 的场合。FPGA/FPGA器件可工作于百兆频率以上,其构造的存储器存取速度也可达百兆 次/秒以上,这样构成的高速存储器能够胜任存储数据量不太大,但速度要求很高的工作场合。FPGA中构造存储器主要有两种方法实现。一是通过硬件描述语言如 VHDL、AHDL、VerilogHDL等编程实现。二是
8、调用MAX+PLUS II自带的库函数实现。调用库函数方法构造存储器 较硬件描述语言输入方式更为方便、灵活、快捷和可靠,故也更常用之。利用库函数构造双端口 RAM在MAX+PLUS n中有几个功能单元描述库。 如与、或、非门,触发器、输入、输出引脚等; 系列芯片;而下文将要详细介绍的参数化双端口prim逻辑元库,包括基本逻辑单元电路,mf宏功能库,包括 TTL数字逻辑单元如 74RAM模块所在的参数化模块库(mega-lpm)中,包括各种参数化运算模块 (加、减、乘、除卜参数化存储模块(单、双端口 RAM、ROM、 FIFO等)以及参数化计数器、比较器模块等等。库中的这些元件功能逻辑描述经过了
9、优化验 证,是数字电路设计中的极好选择。mega-lpm 库中共有五种参数化双端口RAM 模块:ALTDPRAM 、LPM_RAM_DP 、CSDPRAM、 LPM_RAM_DQ 和 LPM_RAM_IO 。其中 ALTDPRAM 和 LPM_RAM_DP 模块 读写有两套总线,读和写有各自的时钟线、地址总线、数据总线和使能端,可同时进行读写操作。除此之外,ALTDPRAM模块还有一个全局清零端口。CSDPRAM模块则有a、b两组写端时钟线、地址总线、数据总线和使能端, 可同时对RAM进行写操作,但对RAM读、 写只能分时进行。LPM_RAM_DQ 模块相对简单,读与写共用一组地址总线,有各自
10、的数据线和时钟线。LPM_RAM_IO模块只有一组地址总线和数据总线。mega-1pm函数库中的双端口 RAM模块全是参数化调用,这为设计带来极大的方便。 通过对各种参数的取舍、参数设置和组合,再结合读写控制逻辑就可以构造出设计需要的存 储器模块。双端口 RAM常见的应用模式主要有以下两种:1 .存储器映像方式。该方式可以随意对存储器的任何单元进行读写操作。其主要应用 于多CPU的共享数据存储、数据传送等。该方式中,读、写控制线、地址总线和数据总线 有两套。根据两端口之间数据的传送方向为单向或双向,又有单向数据总线和双向数据总线之分。2 .顺序写方式。该方式对 RAM的写操作只能顺序写入。这种
11、情况适用于对象特性与 时间紧密相关或传送数据与顺序密切相关的场合,如文件传送、时序过程、波形分析等。根据写控制逻辑的不同,可对RAM进行循环写入或一次写入方式。该方式下的读操作可以是存储器映像读或顺序读,前一种有较大的灵活性,而后一种则类似于FIFO形式。在读、写使用独立的地址总线和数据总线时,可以同时对RAM不同单元进行读写操作。根据不同控制逻辑的要求,对读写时钟、时钟使能端口可以适时设置,以满足控制需要。我用的 FPGA 芯片是 EP1C6Q240C6,其内部静态 RAM 容量 Up to 294,912 RAM bits (36,864 bytes)如果作为采集图像的中间缓存,分辨率为1
12、280*1024的一帧图像,图像数据量为 1280*1024*8bit (RAW DATA) = 10485760 bit = 1310720 bytes ,远远大于 RAM 的容量,那 么就采用双口 RAM存储1行的图像数据。lpm_ram_dp参数化双端口 RAM宏模块 / synopsys translate_off 'timescale 1 ps / 1 ps / synopsys translate_on module dpram16k_1to512_32 (data, wren, wraddress, rdaddress, wrclock, rdclock, wr_aclr
13、, rd_aclr, q);input0:0 data;inputwren;input13:0 wraddress;input8:0 rdaddress;inputwrclock;inputrdclock;inputwr_aclr;inputrd_aclr;output31:0 q;wire 31:0 sub_wire0;wire 31:0 q = sub_wire031:0;altsyncram altsyncram_component ( .wren_a (wren), .aclrO (wr_aclr), .clock。(wrclock),.aclr1 (rd_aclr), .clockl
14、 (rdclock), .address_a (wraddress), .address_b (rdaddress), .data_a (data), .q_b (sub_wire0) / synopsys translate_off,.addressstall_a (), .addressstall_b (), .byteena_a (), .byteena_b (), .clockenO (), .clockenl (), .data_b (), .q_a (), .rden_b (), .wren_b () / synopsys translate_on ); defparamaltsy
15、ncram_ended_device_family = "Cyclone", altsyncram_component.operation_mode = "DUAL_PORT", altsyncram_component.width_a = 1, altsyncram_component.widthad_a = 14, altsyncram_component.numwords_a = 16384, 2A14 = 16384 altsyncram_component.width_b = 32,altsyncram_compone
16、nt.widthad_b = 9, altsyncram_component.numwords_b = 512, 2A9 = 512 altsyncram_component.lpm_type = "altsyncram", altsyncram_component.width_byteena_a = 1, altsyncram_component.outdata_reg_b = "UNREGISTERED", altsyncram_component.indata_aclr_a = "CLEAR0", altsyncram_comp
17、onent.wrcontrol_aclr_a = "CLEAR0", altsyncram_component.address_aclr_a = "CLEAR0", altsyncram_component.address_reg_b = "CLOCK1", altsyncram_component.address_aclr_b = "CLEAR1", altsyncram_component.outdata_aclr_b = "NONE", altsyncram_component.power
18、_up_uninitialized = "FALSE"endmodule/双端口 RAM勺设计与测试(verilog )以下是用verilog语言写的同步双端口设计文件(来自 Actel官方文件中)写的很精炼编程风格也不错,该文档中注释的相当明确 自己综合和仿真测试过,没问题测试测试写的比设计长多了,写的很好值得学习,也可以直接用在你的设计中'timescale 1 ns/100 psmodule test;parameter width = 8; bus widthparameter addr = 8; / # of addr linesparameter num
19、vecs = 20; / actual number of vectorsparameter Clockper = 1000; / 100ns periodreg width-1:0 Data;reg addr-1:0 WAddress, RAddress;reg Clock, WE, RE,rst; /addition rstreg width-1:0 data_in 0:numvecs-1;reg width-1:0 data_out 0:numvecs-1;wire width-1:0 Q;integer i, j, k, numerrors;ram u0(.data(Data), .q
20、(Q), .clk(Clock),.rst(rst),.wen(WE),.ren(RE), .waddr(WAddress), .raddr(RAddress);initialbegin/ sequential test patterns entered at neg edge Clock data_in0=8'h00; data_out0=8'hxx;data_in1=8'h01; data_out1=8'hxx;data_in2=8'h02; data_out2=8'hxx;data_in3=8'h04; data_out3=8
21、9;hxx;data_in4=8'h08; data_out4=8'hxx;data_in5=8'h10; data_out5=8'hxx;data_in6=8'h20; data_out6=8'hxx;data_in7=8'h40; data_out7=8'hxx;data_in8=8'h80; data_out8=8'hxx;data_in9=8'h07; data_out9=8'h01;data_in10=8'h08; data_out10=8'h02;data_in11=8&
22、#39;h09; data_out11=8'h04;data_in12=8'h10; data_out12=8'h08;data_in13=8'h11; data_out13=8'h10;data_in14=8'h12; data_out14=8'h20;data_in15=8'h13; data_out15=8'h40;data_in16=8'h14; data_out16=8'h80;data_in17=8'haa; data_out17=8'h80;data_in18=8'h5
23、5; data_out18=8'haa;data_in19=8'haa; data_out19=8'h55;endinitialbeginrst=0;Clock = 0;WE = 0;RE = 0;WAddress = 0;RAddress = 0;Data = 0;numerrors = 0;# 200 rst=1; /there rst reset to ram# 200 rst=0;endalways#(Clockper / 2) Clock = Clock;initialbegin# 2450 WE = 1;# 8000 WE = 0;RE = 1;# 8000
24、 RE = 0;WE = 1;# 1000 RE = 1;endinitialbegin# 1450;for (k = 0; k <= width; k = k + 1)# 1000 WAddress = k;WAddress = 0; end initial begin #9450;for (j = 0; j <= width; j = j + 1)# 1000 RAddress = j;RAddress = 0;endinitialbegin$display("nBeginning Simulation.");/skip first rising edgef
25、or (i = 0; i <= numvecs-1; i = i + 1) begin(negedge Clock);/ apply test pattern at neg edgeData = data_in ;(posedge Clock)#450; /45 ns later/ check result at posedge + 45 ns$display("Pattern#%d time%d: WE=%bWaddr=%h;RE=%b;Raddr=%h; Data=%h; Expected Q=%h;Actual Q=%h", i, $stime, WE, WAd
26、dress, RE, RAddress,Data, data_out, Q);if ( Q != data_out ) begin$display(" * Error");numerrors = numerrors + 1;endendif (numerrors = 0)$display("Good! End of Good Simulation."); elseif (numerrors > 1)$display("%0d ERRORS! End of Faulty Simulation.", numerrors);else$
27、display("1 ERROR! End of Faulty Simulation.");#1000 $finish; / after 100 ns laterendendmodule设计为了方便,我将其设计代码也放在这儿,你可以直接用综合和仿真'timescale 1 ns/100 ps/f ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff u
28、u tf u u tftf u u tf u TrTrTrTrTrTrTFTrTrTrTrTrTrTrTrTrTr u u i ttf u u tftf u u ” u u tt u u / / n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n/# Behavioral dual-port SRAM description :/# Active High write enable (WE)/# Active High read enable (RE)/# Risin
29、g clock edge (Clock)/ / f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f u u tf u u tftf u u tf u TrTrTrTrTrTrTFTrTrTrTrTrTrTrTrTrTr u u i ttf u u tftf u u ” u u tt u u
30、/ / n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n nmodule reg_dpram(Data, Q, Clock, WE, RE, WAddress,RAddress);parameter width = 8;parameter depth = 8;parameter addr = 3;input Clock, WE, RE;input addr-1:0 WAddress, RAddress;input width-1:0 Data;output width-
31、1:0 Q;reg width-1:0 Q;reg width-1:0 mem_data depth-1:0;/ ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft ft / " 7T7T7T7T7T7T7T7T7T7T7T7T7T7T U TFTF U JTTFJJ U TF U U TFTF U U U TF7T7T U ”U 7T7T / / ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff/ # Write Functional Section/ ft ft ft ft ft ft ft ft ft ft
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 华为技术区域经理面试全攻略
- 跨部门协作与沟通能力提升课程
- 航空公司飞行员招聘面试全解
- 餐饮业财务经理面试要点及解答
- 新闻媒体编辑部主任面试问题及解答
- 合规政策法规学习资料
- 市场推广经理岗位的应聘准备和面试技巧
- 学校多媒体教室设备的日常使用和保养手册
- 网络教育平台的优化策略与运营管理研究
- 大数据科学家面试知识点
- 热力公司供热培训课件
- 2025年司法助理员考试题及答案
- 2024常州市高级职业技术学校工作人员招聘考试试题及答案
- 专精特新中小企业培育路径研究
- 2026年浙江安防职业技术学院单招职业技能测试题库必考题
- DB23∕T 2849-2021 公共视频监控系统监控杆体施工规范
- 2025官方版标准劳动合同【范本】
- DB41∕T 2454-2023 测量仪器检定校准证书有效性确认技术规范
- 村级残疾人专职委员工作总结
- 会计核算利润讲解
- 人工智能+深度融合智能能源消耗监控平台可行性分析
评论
0/150
提交评论