搜档网
当前位置:搜档网 › 双口RAM应用实例

双口RAM应用实例

双口RAM应用实例
双口RAM应用实例

双端口RAM在高速数据采集中的应用

利用传统方法设计的高速数据采集系统由于集成度低、电路复杂,高速运行电路干扰大,电路可靠性低,难以满足高速数据采集工作的要求。应用FPGA可以把数据采集电路中的数据缓存、控制时序逻辑、地址译码、总线接口等电路全部集成进一片芯片中,高集成性增强了系统的稳定性,为高速数据采集提供了理想的解决方案。下面以一个高速数据采集系统为例介绍双端口RAM的应用。

该系统要求实现对频率为5MHz的信号进行采样,系统的计算处理需要对信号进行波形分析,信号采样时间为25μs。根据设计要求,为保证采样波形不失真,A/D采样频率用80MHz,采样精度为8位数据宽度。计算得出存储容量需要2K字节。其系统结构框图如图3所示,图4给出了具体电路连接图。

根据设计要求,双端口RAM的LPM_WIDTH参数设置为8,LPM_WIDTHAD 参数设置为11(211=2048),使用读写使能端及读写时钟。ADCLK、WRCLK和地址发生器的计数频率为80MHz。

A/D转换值对双端口RAM的写时序为顺序写方式,每完成一次A/D转换,存储一次数据,地址加1指向下一单元,因此写地址发生器(RAM_CONTROL)采用递增计数器实现,计数频率与ADCLK、WRCLK一致以保证数据写入时序的正确性。写操作时序由地址和时钟发生器、A/D转换时钟和双端口RAM的写时钟产生。停止采样时AD_STOP有效,写地址发生器停止计数,同时停止对RAM的写操作。将地址发生器的计数值接至DSP总线可以获取采样的首尾指针。地址发生器单元一般用(VHDL)语言编程实现,然后生成符号文件

RAM_CONTROL在上层文件调用。其部分VHDL语言程序如下:

对双端口RAM的读操作采用存储器映像方式,其读出端口接DSP的外扩RAM 总线,DSP可随机读取双端口RAM的任一单元数据,以方便波形分析。由于

LPM_RAM_DP模块的读端数据总线q不具有三态特性,因此调用三态缓冲器74244,通过其将输出数据连接到DSP数据总线上。

在高速数据采集电路中,数据缓存也可以用FIFO或单端口RAM实现。用FIFO 进行数据缓存,由于其已经把地址发生部分集成在模块单元内,因此省去了一部分程序编写,但是DSP却不能任意地访问FIFO的存储单元,只能是顺序写入/读出数据,这样设计,系统的灵活性就大大降低。如果DSP的分析计算需要特定单元的数据,则系统的效率和速度会因为无效数据的读取而降低。使用单端口RAM进行数据缓存同样存在一些问题。由RAM侧看,DSP和A/D转换器是挂在一条总线上的,当从RAM向DSP传输数据的时候,A/D转换器就不能有数据传到该总线上,否则会产生总线冲突,引起芯片损坏。解决这个问题就需要增加电路。应用双端口RAM就不存在这个问题,而且使系统结构划分更明确,符合模块化设计思想。

结语

综上所述,利用FPGA芯片的高速工作特性,以及其内部集成嵌入式阵列和大规模逻辑阵列的特点,设计存储器,三态缓存器、地址发生器、以及复杂的时序逻辑电路等,应用于高速数据采集电路中可以使电路大大简化,性能提高。同时由于FPGA可实现在系统编程(ISP),使系统具有可在线更新、升级容易等特点,是一种较为理想的系统及电路实现方法。

在FPGA中构造存储器

许多系列的FPGA芯片内嵌了存储阵列,如ALTERA EPlK50芯片内嵌了5K字节的存储阵列。因此,在FPGA中实现各种存储器,如单/双端口RAM、单/双端口ROM、先进先出存储器FIFO等非常方便,而且具有诸多优点。其硬件可编程的特点允许开发人员灵活设定存储器数据的宽度、存储器的大小、读写控制逻辑等,尤其适用于各种特殊存储要求的场合。FPGA/FPGA器件可工作于百兆频率以上,其构造的存储器存取速度也可达百兆次/秒以上,这样构成的高速存储器能够胜任存储数据量不太大,但速度要求很高的工作场合。

FPGA中构造存储器主要有两种方法实现。一是通过硬件描述语言如VHDL、AHDL、Verilog HDL等编程实现。二是调用MAX+PLUSⅡ自带的库函数实现。调用库函数方法构造存储器较硬件描述语言输入方式更为方便、灵活、快捷和可靠,故也更常用之。

利用库函数构造双端口RAM

在MAX+PLUSⅡ中有几个功能单元描述库。prim逻辑元库,包括基本逻辑单元电路,如与、或、非门,触发器、输入、输出引脚等;mf宏功能库,包括TTL数字逻辑单元如74系列芯片;而下文将要详细介绍的参数化双端口RAM模块所在的参数化模块库(mega-lpm)

中,包括各种参数化运算模块(加、减、乘、除)、参数化存储模块(单、双端口RAM、ROM、FIFO等)以及参数化计数器、比较器模块等等。库中的这些元件功能逻辑描述经过了优化验证,是数字电路设计中的极好选择。

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模块相对简单,读与写共用一组地址总线,有各自的数据线和时钟线。LPM_RAM_IO模块只有一组地址总线和数据总线。

mega-1pm函数库中的双端口RAM模块全是参数化调用,这为设计带来极大的方便。通过对各种参数的取舍、参数设置和组合,再结合读写控制逻辑就可以构造出设计需要的存储器模块。双端口RAM常见的应用模式主要有以下两种:

1.存储器映像方式。该方式可以随意对存储器的任何单元进行读写操作。其主要应用于多CPU的共享数据存储、数据传送等。该方式中,读、写控制线、地址总线和数据总线有两套。根据两端口之间数据的传送方向为单向或双向,又有单向数据总线和双向数据总线之分。

2.顺序写方式。该方式对RAM的写操作只能顺序写入。这种情况适用于对象特性与时间紧密相关或传送数据与顺序密切相关的场合,如文件传送、时序过程、波形分析等。根据写控制逻辑的不同,可对RAM进行循环写入或一次写入方式。该方式下的读操作可以是存储器映像读或顺序读,前一种有较大的灵活性,而后一种则类似于FIFO形式。

在读、写使用独立的地址总线和数据总线时,可以同时对RAM不同单元进行读写操作。根据不同控制逻辑的要求,对读写时钟、时钟使能端口可以适时设置,以满足控制需要。我用的FPGA芯片是EP1C6Q240C6,其内部静态RAM容量Up to 294,912 RAM bits (36,864 bytes)

如果作为采集图像的中间缓存,分辨率为1280*1024的一帧图像,图像数据量为1280*1024*8bit(RAW DA TA)= 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,

rd_aclr,

q);

input [0:0] data;

input wren;

input [13:0] wraddress;

input [8:0] rdaddress;

input wrclock;

input rdclock;

input wr_aclr;

input rd_aclr;

output [31:0] q;

wire [31:0] sub_wire0;

wire [31:0] q = sub_wire0[31:0];

altsyncram altsyncram_component (

.wren_a (wren),

.aclr0 (wr_aclr),

.clock0 (wrclock),

.aclr1 (rd_aclr),

.clock1 (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 (),

.clocken0 (),

.clocken1 (),

.data_b (),

.q_a (),

.rden_b (),

.wren_b ()

// synopsys translate_on

);

defparam

altsyncram_component.intended_device_family = "Cyclone",

altsyncram_component.operation_mode = "DUAL_PORT",

altsyncram_component.width_a = 1,

altsyncram_component.widthad_a = 14,

altsyncram_component.numwords_a = 16384, //2^14 = 16384

altsyncram_component.width_b = 32,

altsyncram_component.widthad_b = 9,

altsyncram_component.numwords_b = 512, //2^9 = 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_component.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_up_uninitialized = "FALSE";

endmodule

//

双端口RAM的设计与测试(verilog)

以下是用verilog语言写的同步双端口设计文件(来自Actel官方文件中)

写的很精炼

编程风格也不错,该文档中注释的相当明确

自己综合和仿真测试过,没问题

测试

测试写的比设计长多了,写的很好值得学习,也可以直接用在你的设计中`timescale 1 ns/100 ps

module test;

parameter width = 8; // bus width

parameter addr = 8; // # of addr lines

parameter numvecs = 20; // actual number of vectors

parameter Clockper = 1000; // 100ns period

reg [width-1:0] Data;

reg [addr-1:0] WAddress, RAddress;

reg Clock, WE, RE,rst; //addition rst

reg [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(Q), .clk(Clock),

.rst(rst),

.wen(WE),

.ren(RE), .waddr(WAddress), .raddr(

RAddress));

initial

begin

// sequential test patterns entered at neg edge Clock data_in[0]=8'h00; data_out[0]=8'hxx;

data_in[1]=8'h01; data_out[1]=8'hxx;

data_in[2]=8'h02; data_out[2]=8'hxx;

data_in[3]=8'h04; data_out[3]=8'hxx;

data_in[4]=8'h08; data_out[4]=8'hxx;

data_in[5]=8'h10; data_out[5]=8'hxx;

data_in[6]=8'h20; data_out[6]=8'hxx;

data_in[7]=8'h40; data_out[7]=8'hxx;

data_in[8]=8'h80; data_out[8]=8'hxx;

data_in[9]=8'h07; data_out[9]=8'h01;

data_in[10]=8'h08; data_out[10]=8'h02;

data_in[11]=8'h09; data_out[11]=8'h04;

data_in[12]=8'h10; data_out[12]=8'h08;

data_in[13]=8'h11; data_out[13]=8'h10;

data_in[14]=8'h12; data_out[14]=8'h20;

data_in[15]=8'h13; data_out[15]=8'h40;

data_in[16]=8'h14; data_out[16]=8'h80;

data_in[17]=8'haa; data_out[17]=8'h80;

data_in[18]=8'h55; data_out[18]=8'haa;

data_in[19]=8'haa; data_out[19]=8'h55;

end

initial

begin

rst=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;

end

always#(Clockper / 2) Clock = ~Clock;

initial

begin

#2450 WE = 1;

#8000 WE = 0;

RE = 1;

#8000 RE = 0;

WE = 1;

#1000 RE = 1;

end

initial

begin

#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;

end

initial

begin

$display("\nBeginning Simulation...");

//skip first rising edge

for (i = 0; i <= numvecs-1; i = i + 1)

begin

@(negedge Clock);

// apply test pattern at neg edge

Data = data_in;

@(posedge Clock)

#450; //45 ns later

// check result at posedge + 45 ns

$display("Pattern#%d time%d: WE=%b; Waddr=%h; RE=%b; Raddr=%h; Data=%h; Expected Q=%h;Actual Q=%h", i, $stime, WE, WAddress, RE, RAddress,Data, data_out, Q);

if ( Q !== data_out )

begin

$display(" ** Error");

numerrors = numerrors + 1;

end

end

if (numerrors == 0)

$display("Good! End of Good Simulation.");

else

if (numerrors > 1)

$display(

"%0d ERRORS! End of Faulty Simulation.",

numerrors);

else

$display(

"1 ERROR! End of Faulty Simulation.");

#1000 $finish; // after 100 ns later

end

endmodule

设计

为了方便,我将其设计代码也放在这儿,你可以直接用综合和仿真`timescale 1 ns/100 ps

//#############################################

//# Behavioral dual-port SRAM description :

//# Active High write enable (WE)

//# Active High read enable (RE)

//# Rising clock edge (Clock)

//#############################################

module 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-1:0] Q;

reg [width-1:0] Q;

reg [width-1:0] mem_data [depth-1:0];

// ############################################

// # Write Functional Section

// ############################################

always @(posedge Clock)

begin

if(WE)

mem_data[WAddress] = #1 Data;

end

//############################################# //# Read Functional Section

//############################################# always @(posedge Clock)

begin

if(RE)

Q = #1 mem_data[RAddress];

end

endmodule

双口RAM应用

高速双口RAM IDT7026的原理和应用 作者:合肥电子工程学院刘春生来源:《国外电子元器件》 摘要:IDT7026是美国IDT公司开发研制的高速16k×16bit的双口静态RAM。它可允许两个端口同时进行高速读写数据,内含主/从控制脚,并具有标识器功能。文中介绍了IDT7026的内部组成、功能及原理,并给出具体的应用电路框图。 关键词:双口RAM 高速并行接口信号处理 1 概述 在高速数据采集和处理系统中,随着采样数据量的增大及信息处理任务的增加,对数据传送的要求也越来越高。在系统或模块间如果没有能够高速传送数据的接口,则在数据传送时极易造成瓶颈堵塞现象,从而影响整个系统对数据的处理能力。所以,高速并行数据接口的研制在信息处理系统中占有非常重要的地位。利用高性能双口RAM能够方便地构成各种工作方式的高速数据传送接口,不管是在并行处理网络中的数据共享,还是在流水方式中的高速数据传送中,高性能双口RAM都发挥着重要作用,从而保证数据通路的畅通。 IDT7026是美国IDT公司开发研制的高速16k×16bits的双口静态RAM。它是真正的双口RAM,允许两个(左、右)端口同时读写数据,每个端口具有自己独立的控制信号线、地址线和数据线。可高速存取数据,最快存取时间为15ns,可与大多数高速处理器配合使用,而无需插入等待状态。它具有Master/slave控制脚,可方便地扩展存储容量和数据位宽。IDT7026除具有双端口存取功能外,还具有标识器功能,在数据传送时可构成多种接口形式。 2 IDT及管脚功能组成及管脚功能

IDT7026的内部功能框图如图1所示。 IDT7026的管脚分布如图2所示。各管脚的功能见表1所列。 3 工作原理 3.1 双端口数据存取工作原理 IDT7026的核心部分是用于数据存储的存储器阵列,可为左右两个端口所共用。这样,位于两个端口的左右处理单元就可共享一个存储器。当两个端口对双口RAM存取时,存在以下4种情况:(1)两个端口不同时对同一地址单元存取数据; (2)两个端口同时对同一地址单元读出数据; (3)两个端口同时对一地址单元写入数据;

双口RAM应用实例

双端口RAM在高速数据采集中的应用 利用传统方法设计的高速数据采集系统由于集成度低、电路复杂,高速运行电路干扰大,电路可靠性低,难以满足高速数据采集工作的要求。应用FPGA可以把数据采集电路中的数据缓存、控制时序逻辑、地址译码、总线接口等电路全部集成进一片芯片中,高集成性增强了系统的稳定性,为高速数据采集提供了理想的解决方案。下面以一个高速数据采集系统为例介绍双端口RAM的应用。 该系统要求实现对频率为5MHz的信号进行采样,系统的计算处理需要对信号进行波形分析,信号采样时间为25μs。根据设计要求,为保证采样波形不失真,A/D采样频率用80MHz,采样精度为8位数据宽度。计算得出存储容量需要2K字节。其系统结构框图如图3所示,图4给出了具体电路连接图。

根据设计要求,双端口RAM的LPM_WIDTH参数设置为8,LPM_WIDTHAD 参数设置为11(211=2048),使用读写使能端及读写时钟。ADCLK、WRCLK和地址发生器的计数频率为80MHz。 A/D转换值对双端口RAM的写时序为顺序写方式,每完成一次A/D转换,存储一次数据,地址加1指向下一单元,因此写地址发生器(RAM_CONTROL)采用递增计数器实现,计数频率与ADCLK、WRCLK一致以保证数据写入时序的正确性。写操作时序由地址和时钟发生器、A/D转换时钟和双端口RAM的写时钟产生。停止采样时AD_STOP有效,写地址发生器停止计数,同时停止对RAM的写操作。将地址发生器的计数值接至DSP总线可以获取采样的首尾指针。地址发生器单元一般用(VHDL)语言编程实现,然后生成符号文件 RAM_CONTROL在上层文件调用。其部分VHDL语言程序如下: 对双端口RAM的读操作采用存储器映像方式,其读出端口接DSP的外扩RAM 总线,DSP可随机读取双端口RAM的任一单元数据,以方便波形分析。由于

双口ram和多模块存储器

3.6 双口RAM和多模块存储器 CPU和主存储器的速度不匹配问题一直以来都是计算机系统发展的障碍,到现在,这个问题变得越来越严重,以至于主存的存储速度成为了计算机系统的瓶颈。为了解决这一瓶颈,尝试了多种办法,除通过寻找高速元件来提高访问速度外,还可以通过采用双口RAM和多模块存储器,使在一个存取周期内可以并行地读写多个字,从而提高存储器的访问速度。 1.双口RAM 双口RAM是因同一个RAM具有两组相对独立的读写控制线路而得名,它可以进行并行的独立操作。可以说双口RAM是具有两个独立端口的存储器,而每个端口又具有各自的地址线、数据线和控制线,可以对存储器中任何位置上的数据进行独立的存取操作。 双口RAM是常见的共享式多端口存储器,其最大的特点是存储数据共享。它允许两个独立的CPU或控制器同时异步访问存储单元。既然数据共享,就必须存在访问仲裁控制,否则就会出现错误或冲突。两个端口对同一内存操作有4种情况: ① 两个端口不同时对同一地址单元存取数据; ② 两个端口同时对同一地址单元读出数据; ③ 两个端口同时对同一地址单元写入数据; ④ 两个端口同时对同一地址单元,一个写入数据,另一个读出数据。 在第①、第②种情况时,两个端口的存取不会出现错误,第③种情况会出现写入错误,第④种情况会出现读出错误。为避免第③、第④种错误情况的出现, 双口RAM设计有硬件“”功能输出,其工作原理如下。 当左、右端口不对同一地址单元存取时,可正常存取;当左、右端口对同一地址单元存取时,有一个端口的禁止数据的存取。此时,两个端口中,哪个存取请求信号出现在前,则其对应的允许存取;哪个存取请求信号出现在后,则其对应的禁止其写入数据。 需要注意的是,两端口间的存取请求信号出现时间要相差在5ns以上,否则仲裁逻辑无法判定哪一个端口的存取请求信号在前;在无法判定哪个端口先出现存取 请求信号时,控制线和只有一个为低电平,不会同时为低电平。这样,就能保证对应于的端口能进行正常存取,对应于的端 口不存取,从而避免双端口存取出现错误。 2.多模块存储器 顾名思义,多模块存储器是指由多个模块组成的存储器,不过这些模块具有相同的容量和存取速度,各模块都有独立的地址寄存器、数据寄存器、地址译码、驱动电路和读/写电路,它们既能并行工作,又能交叉工作。

双口RAM

双口RAM 1.模块功能: 双口RAM模块主要采用IDT7132等器件,它是一种特殊的数据存储芯片,它既可以用于单片机存储大容量的数据,也可以以双口RAM为共享存储器来实现两个处理器之间的通信和数据传输。双口RAM的优点是提供了两条完全独立的端口,每个端口都有完整的地址、数据和控制总线,允许两个CPU对双端口存储器的同一单元进行同时存取;具有两套完全独立的终端逻辑来实现两个CPU 之间的握手控制信号;具有两套独立的“忙”逻辑,保证两个CPU同时对同一单元进行读/写操作的正确性。对于单个CPU而言,双口RAM同普通RAM没有什么明显的区别。 本模块原理图见图1。

图1

3.主要器件: (1)IDT7132: (a)器件功能: IDT7132是高速2k*8端口静态RAM,可提供图2.1.3 IDT7132引脚图 两个拥有独立的控制总线、地址总线和I/O总线端口,允许CPU独立访问内部的任何存储单元。当/CE 引脚出现下降沿时,选中DPRAM即可通过控制OE 或R/W来访问内部存储单元。 (b) 器件引脚: IDT7132的引脚图如图2所示。 /CE、/CER:(左、右)片选控制信号。 R/WL、R/WR:(左、右)读写控制信号。 /OEL、/OER:(左、右)使能控制信号。 /BUSYL、/BUSYR:(左、右)繁忙查询控制信号。 A0L—A9L、A0R—A9R:(左、右)地址总线。 I/O0L—I/O7L、I/O0R—I/O7R:(左、右)输入/ 输出总线。 VCC:电源。 (c) 工作原理: IDT7132的工作时序如图3所示。它与RAM的 读写时序非常类似。当CPU选中DPRAM时/CE引 脚出现下降沿,当控制线/OE为高且R/W 为低时,CPU对内部存储单元进行写操作;而当控 制线OE为低且R/W为高时,CPU对内部存储单元 进行读操作。当外部CPU通过两个端口对双口RAM 内部的同一个存储单元进行操作时,系统将出现竞 图 2 争。这种竞争一般有如下两种模式: (1)如果两个端口的总线访问地址相同,并先于片选信号/CE有效,则片内逻辑将在CEL与CER之间发生竞争。 (2)如果两个端口的片选信号CE在地址信号有效之前变低,则片内控制逻辑将在地址信号到达时发生竞争。 为避免因竞争而导致的通 讯失败,设计者提出了意下 三种常见的解决方案。(1) 设置标志位:在开辟数据通 讯区的同时,可通过软件方 法在某个固定 的存储单元设立标 志位。这种方法要求 两端CPU每次访问双图 3 口RAM之前,必须查询、测试和设置标志位,然后再根据标志位的 状态决定是否可以访问数据区;有的双口RAM本身就具有专用的一 个或多个硬件标志所存器和专门的测试和设置指令,可直接对标志位 进行读/写操作。这种方法通常用在多个处理器共享一个存储器块时。

基于双口RAM的单片机通信

目录 1.绪论 (2) 1.1课题的提出 (2) 1.2 双端口RAM概述 (2) 1.3本论文主要研究的内容 (4) 2. 基于双端口RAM的单片机间通信概述 (4) 2.1双端口RAM的发展过程、存储原理 (4) 2.1.1.双端口RAM的发展过程 (4) 2.1.2.双端口RAM的基本存储原理 (5) 2.1.3.双端口RAM的中断逻辑功能 (6) 2.1.4.标识器逻辑及主/从模式 (6) 2.2双端口RAM的应用 (7) 2.3接口电路实现方案概述 (8) 2.3.1. 基于CY7C133双口RAM (8) 2.3.2. ISA总线与IDT7025的接口 (9) 2.3.3. IDT7026实现高速并口缓存的接口电路 (10) 2.4初期主要元器件的选择 (11) 2.6双口RAMIDT7005S概述 (11) 2.7其它主要器件概述 (17) 3.系统硬件接口及实现 (18) 3.1引言 (18) 3.2 89C52单片机简介 (18) 3.3 单片机与双口RAM的接口电路简介 (23) 3.4硬件的调试 (26) 4.系统软件及实现 (27) 4.1引言 (27) 4.2双口RAM的地址空间分配和旗语、中断逻辑 (28) 4.3软件主要部分流程图 (30) 4.4系统主要模块程序说明 (33) 5.结论 (41) 主要参考文献: (42)

1.绪论 1.1课题的提出 在一些应用系统的通信设计中,PC机与单片机间常常采用串行异步通信方式。因为这种通信方式,硬件电气连接简单在PC机上针对串口编程方便。但是串行异步通信受传输速率的限制,通常最高波特率设定在9 600 b/s左右。采用串行同步方式可提高传输率,但需在PC机上扩展设备。如果所设计的数据采集系统,其数据传输速率要求达到60 kb/s以上,采用串行异步通信远远不能满足这个要求。随着采集数据量的增大以及数据处理任务的增加,对数据传送的要求也越来越高,依靠单片机的自带串口实现数据的串行传输已经无法满足要求,在系统或模块间必须要能够进行高速的并行数据传输。与串行通信相比,采用双端口RAM (简称DRAM)不仅数据传输速度高,而且抗干扰性能好。高性能的双端口RAM能够方便的构成各种工作方式下的高速数据传送介质,解决数据传输低速的瓶颈问题。无论是并行处理网络中的数据共享,还是流水线方式的高速数据传输,双端口RAM都可以发挥重要作用,从而保证数据通路的畅通。 1.2 双端口RAM概述 双端口RAM不同于一般的RAM,但仍然是存储数据的器件,因此基于双端口RAM的通信实际上利用双端口RAM实现数据的共享,在共享的基础上实现交互就是通信了。因此双端口RAM实现两个单片机间数据的共享和

FPGA实验2 双口RAM的仿真与综合

实验题目双口RAM的仿真与综合 一、实验内容 1、写出双口RAM的设计模块以及激励,并对它进行仿真与综合; 2、双口RAM的端口有写时钟控制端口wr_clk、写始能端口wr_en、数据输 入端口data_in、写地址端口wr_addr、读时钟端口rd_clk、读始能端 口rd_en、读地址端口rd_addr以及输出端口data_out; 3、进一步熟悉QuartusII软件和modelsim软件的功能及环境。 4、学会使用modelsim软件进行前仿真,使用QuartusII软件进行综合进 而在modelsim软件环境下进行后仿真。 二、详细设计 设计步骤如下: 1、设计一个双口RAM,有写时钟控制端口wr_clk、写始能端口wr_en、数 据输入端口data_in、写地址端口wr_addr、读时钟端口rd_clk、读始 能端口rd_en、读地址端口rd_addr以及输出端口data_out; 2、编译,查找错误,进入仿真环境进行前仿真; 3、在QuartusII软件环境下进行综合,得出布线图; 4、在modelsim软件环境下进行后仿真。 5、根据仿真结果分析,最后得出结论。 三、仿真结果 (1)前仿真的结果如下: 由仿真结果可得出双口RAM,有写时钟控制端口wr_clk、写始能端口wr_en、数据输入端口data_in、写地址端口wr_addr、读时钟端口rd_clk、读始能端口rd_en、读地址端口rd_addr以及输出端口data_out。开始在没有数据输入时,输出数据为不确定态。接下来给出地址依据地址寻找数据,在写始能端有效时写

入数据并在读始能有效时才读出数据,及输出数据。 (2)后仿真结果如下: 经过综合得出后仿真结果可以得出输出数据存在一定的时延,数据在输出时必须经过一定时间后才能有稳定的输出,可见前仿真比较稳定,后仿真有延时,更接近实际。 (3)查看设计对应的寄存器传输级视图: (4)在modelsim环境下仿真时的芯片图如下: 此图为地址为3时写入数据34,并读出数据为34的电路仿真图

乒乓操作(两个双口RAM)

library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; entity DPRAM_TEST is port (clk:in std_logic; data_out:out std_logic_vector(7 downto 0); scan:out std_logic_vector(7 downto 0) ); end DPRAM_TEST; architecture ONE of DPRAM_TEST is signal rdaddress1,wraddress1,q1: STD_LOGIC_VECTOR (3 DOWNTO 0); signal rden1,wren1:STD_LOGIC ; signal rdaddress2,wraddress2,q2: STD_LOGIC_VECTOR (3 DOWNTO 0); signal rden2,wren2:STD_LOGIC ; signal clk1hz,clk1khz,clk16_1s:std_logic; signal address:std_logic_vector(3 downto 0):="0000"; signal address_en:integer range 0 to 20; signal data:std_logic_vector(3 downto 0):="0000"; signal cnt1:integer range 0 to 3; signal scan1:std_logic_vector(7 downto 0); signal data_en:integer range 0 to 9; signal q1_en:integer range 0 to 9; signal q1_en2:integer range 0 to 9; signal q2_en:integer range 0 to 9; signal q2_en2:integer range 0 to 9; component RAM1 PORT ( clock : IN STD_LOGIC ; data : IN STD_LOGIC_VECTOR (3 DOWNTO 0); rdaddress : IN STD_LOGIC_VECTOR (3 DOWNTO 0); rden : IN STD_LOGIC := '1'; wraddress : IN STD_LOGIC_VECTOR (3 DOWNTO 0); wren : IN STD_LOGIC := '1'; q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); end component ;

双口ram

双口RAM [ 2008-9-4 9:30:00 | By: sophialee ] 在测控、仪器仪表、语音信号处理和图像通信领域中往往需要多处理器分工完成数字信号处理(DSP)算法和与外部系统的通信、控制、数据采集和人机接口功能。在多机系统中,CPU之间的通信常采用以下几种方式:(1)串行通信。这种方式相对简单,由于受到波特率的限制,在不同档次单片机之间需要通信业务大的场合得不到很好的通信效果。(2)并行通信。利用CP U的I/O功能在CPU之间增加缓冲器或锁存器实现双机通信。通信性能较串行通信有所提高,但仍然得不到理想的效果。(3)利用共享式存储器实现。DMA方式就是其中的一种,能够达到数据的高速传输,但不能同时访问存储器,CPU必须等待总线,而且有些CPU不支持DMA功能。另一种是利用多端口存储器,双口RAM和FIFO是常用的两种多端口的存储器,允许多CPU同时访问存储器,大大提高了通信效率,而且对CPU没有过多的要求,特别适合异种CPU之间异步高速系统中。因此,受到硬件设计者的青睐。 一、两种多端口存储器 1.双口RAM的仲裁控制 双口RAM是常见的共享式多端口存储器,以图1所示通用双口静态RAM为例来说明双口RAM的工作原理和仲裁逻辑控制。双口RAM最大的特点是存储数据共享。图1中,一个存储器配备两套独立的地址、数据和控制线,允许两个独立的CPU或控制器同时异步地访问存储单元。既然数据共享,就必须存在访问仲裁控制。内部仲裁逻辑控制提供以下功能:对同一地址单元访问的时序控制;存储单元数据块的访问权限分配;信令交换逻辑(例如中断信号)等。 (1)对同一地址单元访问的竞争控制 如果同时访问双口RAM的同一存储单元,势必造成数据访问失真。为了防止冲突的发生,采用Busy逻辑控制,也称硬件地址仲裁逻辑。图2给出了地址总线发生匹配时的竞争时序。,此处只给出了地址总线选通信信号先于片选脉冲信号的情况,而且,两端的片选信号至少相差tAPS ——仲裁最小时间间隔(IDT7132为5ns),内部仲裁逻辑控制才可给后访问的一方输出Busy 闭锁信号,将访问权交给另一方直至结束对该地址单元的访问,才撤消Busy闭锁信号,将访问权交给另一方直至结束对该地址单元的访问,才撤消Busy闭锁信号。即使在极限情况,两个CP U几乎同时访问同一单元——地址匹配时片选信号低跳变之差少于tAPS,Busy闭锁信号也仅输出给其中任一CPU,只允许一个CPU访问该地址单元。仲裁控制不会同时向两个CPU发Busy闭锁信号。 2)存储单元数据块的访问权限分配 存储单元数据块的访问权限分配只允许在某一时间段内由1个CPU对自定义的某一数据块进行读写操作,这将有助于存储数据的保护,更有效地避免地址冲突。信号量(Semaphore,简称SEM)仲裁闭锁就是一种硬件电路结合软件实现访问权限分配方法。SEM单元是与存储单元无关的独立标志单元,图3给出了一个信号量闭锁逻辑框图。两个触发器在初始化时均使SEM允许输出为高电平,等待双方申请SEM。如果收到一方写入的SEM信号(通常低电平写入),如图3所示,仲裁电路将使其中一个触发器的SEM允许输出端为低电平,而闭锁另一个SEM允许输出端使其继续保持高电平。只有当先请求的一方撤消SEM信号,即写入高电平,才使另一SEM允许输出端的闭

相关主题