SRAM的FPGA实现

此次SRAM的读写仿真并没有进行SRAM的乒乓操作,只是进行了单个SRAM的读写操作,SRAM的读写操作不需要刷新操作,写端口包括:写时钟,写地址,写数据,写使能;读端口包括:读时钟,读地址,读数据,读使能。

其中,写使能和读使能的信号控制较为重要,只有在读使能或者写使能有效的时候,读操作或者写操作才是有效的,所以在进行SRAM的读写逻辑时,要注意写使能与写地址、写数据之间的协调,读使能与读地址、读数据之间的协调。

在写使能信号无效的情况下,就应该停止写地址的自增与数据的写入操作,因为写入无效,数据会自动丢弃,当下一次写使能有效时,不能确定本次写地址的开始地址,使数据的处理出现混乱,在读使能信号的情况下,就应该停止读地址的自增,因为读使能无效,读地址自增也不会有数据输出,当下一个读使能有效时,无法确定当前的读地址,也会使数据发生混乱。

这里,我是这样进行实验的,首先进行写操作,写满后,在进行读操作。写地址由小到大,写数据依次递增,例如,地址位宽为5位,那地址空间就是5’b0到5’b11111,其中数据的位宽是在引用IP核的时候设定的,深度也是在引用IP核的时候设定的。读出来的数据经过FIFO之后传送给串口TX模块,波特率9600(主时钟25MHz)。

调试过程中遇到的问题就是,因为串口的速率和SRAM的读写速率相差太多,在SRAM写FIFO的时候,在FIFO满之后,SRAM并没有停止读写操作,即SRAM的读写操作与FIFO的写操作几乎是独立的,这就导致,写入FIFO的数据不是顺序的而是乱序的,在调试过程中,发现有数据输出,但数据顺序不对,推测读写应该问题不大,主要问题应该是读写控制信号的不协调,经过改进之后,数据可以按预期目的进行打印,我是这样改进的,只进行一次写SRAM操作,写满之后只进行一次读操作,这样的话就避免了SRAM一直读写导致数据被覆盖引起的数据乱序问题。

下面记录一下实验过程:

首先是整个实验的RTL图:

SRAM的配置页面:

SRAM的读写时序仿真图:

从图中我们可以看到当写使能为高电平时(使能信号高电平有效),读使能就为低电平,当读使能为高电平时,写使能就为低电平。

当写使能有效时,写地址和写数据都进行了相应的递增操作,当独有效时,读地址发生相应变化,而写地址和写数据停止变化。

具体地质变化与使能信号的关系请看下图:(注:实验中写地址和写数据都是递增的,读地址是在最高地址递减的,所以我们看到的打印数据应该是递减的)

下图是写使能信号、写数据、写使能信号的时序图:

我们发现,当写使能为高电平的时刻,读使能为低电平,读地址保持不变,且写地址从0地址开始自增,数据开始变化。

下面是SRAM的读时序:

下面是控制模块源代码(需要完整代码的可以留言):

module SRAM_CONTROL(
						clk,
						sys_rst,
						wr_en,
						wr_data,
						wr_address,
						rd_en,

						rd_address,
						fifo_wr_req,
						wrfull
);

input 			clk;
input				sys_rst;

input				wrfull;

output 			wr_en;
output [7:0] 	wr_data;
output [4:0] 	wr_address;

output 			rd_en;

output [4:0] 	rd_address;

output			fifo_wr_req;

reg [7:0]		wr_data_r;
reg [4:0]		wr_address_r;

reg 				wr_en_r;
reg 				wr_en_r1;

reg [4:0]		rd_address_r;
reg [4:0]		rd_address_r1;
reg 				rd_en_r;
reg				rd_en_r1;
reg				rd_en_r2;
//写SRAM的地址
[email protected](posedge clk or negedge sys_rst)
	if(!sys_rst) wr_address_r <= 5'd0;
	else if((wr_address_r < 5'b11111)&&(wr_en_r)) wr_address_r <= wr_address_r + 1'b1;
	else if(rd_address_r == 5'd1) wr_address_r <= 5'd0;
	else wr_address_r <= wr_address_r;

//写SRAM数据
[email protected](posedge clk or negedge sys_rst)
	if(!sys_rst) wr_data_r <= 8'd0;
	else if((wr_data_r < 8'b1111_1111)&&(wr_address_r < 5'b11111)) wr_data_r <= wr_data_r + 1'b1;
	else if(wr_data_r == 8'b1111_1111)wr_data_r <= 8'd0;
	else ;

//写使能
[email protected](posedge clk or negedge sys_rst)
	if(!sys_rst) wr_en_r <= 1'b1;
//	else if(wr_address_r <  5'b11110) wr_en_r <= 1'b1;
	else if(wr_address_r !=  5'b11111) wr_en_r <= 1'b1;
	else wr_en_r <= 1'b0;

//读SRAM地址//地址倒序读出

[email protected](posedge clk or negedge sys_rst)
	if(!sys_rst) rd_address_r <= 5'b11111;
	else if(!wr_en_r) rd_address_r <= rd_address_r - 1'b1;
	else if(rd_address_r == 5'd0) rd_address_r <= 5'b11111;
	else rd_address_r <= 5'b11111;

[email protected](posedge clk or negedge sys_rst)
	if(!sys_rst) rd_address_r1 <= 5'd0;
	else rd_address_r1 <= rd_address_r;

//读使能
[email protected](posedge clk or negedge sys_rst)
	if(!sys_rst) rd_en_r <= 1'b0;
	else if(wr_address_r ==  5'b11111) rd_en_r <= 1'b1;
	else rd_en_r <= 1'b0;

[email protected](posedge clk or negedge sys_rst)
	if(!sys_rst) begin
		rd_en_r1 <= 1'b0;
		rd_en_r2 <= 1'b0;
	end
	else begin
		rd_en_r1 <= rd_en_r;
		rd_en_r2 <= rd_en_r1;
	end

assign 	wr_en = wr_en_r;
assign	wr_data = wr_data_r;
assign	wr_address = wr_address_r;

assign 	rd_en = rd_en_r;

assign	rd_address = rd_address_r;

assign	fifo_wr_req = ((!wrfull)&&rd_en_r2)?1'b1:1'b0;

endmodule
时间: 2024-12-13 14:03:25

SRAM的FPGA实现的相关文章

异步SRAM的FPGA读写操作

异步SRAM:正如其名,不是与特定的时钟信号同步运行,而是根据输入信号的状态运行的.因为没有信号表明读取时已确定了有效数据,也没有信号表明写入时已接收到数据,所以,需要获取制造商的数据手册,根据时序图,按“应该已读出有效数据”及“应该能接收数据”这样的条件,进行存储器的设计. 1.  读操作:OE读控制 异步SRAM的基本读操作如图1所示. 首先指定地址,然后使CE2=WE=高电平,CE1=OE=低电平,此时将在I/O引脚出现数据. 如果保持该状态而改变地址,则将出现新地址的数据.另外,如果CE

转载论文关于fir滤波器的fpga实现

摘 要 本文讨论的FIR滤波器因其具有严格的线性相位特性而得到广泛的应用.在工程实践中,往往要求信号处理具有实时性和灵活性,本论文研究FIR的FPGA解决方案正体现了电子系统的微型化和单片化. 本论文主要讨论了以下的问题: 首先,以FIR滤波器的基本理论为依据,研究适应工程实际的数字滤波器的设计方法,确定了直接型网络结构.窗函数设计法的设计方案: 然后,讨论了FPGA的原理与结构特点,总结FPGA的设计流程与设计原则,并用Verilog HDL语言根据设计方案编写出FIR滤波器程序: 接着,采用

FPGA第一篇:SRAM工作原理

一.SRAM概述 SRAM主要用于二级高速缓存(Level2 C ache).它利用晶体管来存储数据.与DRAM相比,SRAM的速度快,但在相同面积中SRAM的容量要比其他类型的内存小. 大部分FPGA器件采用了查找表(Look Up Table,LUT)结构.查找表的原理类似于ROM,其物理结构是静态存储器(SRAM), N个输入项的逻辑函数可以由一个2^N位容量的SRAM实现, 函数值存放在SRAM中,SRAM的地址线起输入线的作用,地址即输入变量值,SRAM的输出为逻辑函数值,由连线开关实

Xilinx FPGA结构

FPGA是什么?FPGA是现场可编程逻辑阵列,由可编程逻辑资源(LUT和 REG),可编程连线,可编程I/O构成.Xilinx的FPGA的基本结构是一样的,但随着半导体工艺的发展,FPGA的逻辑容量越来越丰富,速度更快,嵌入越来越多的硬核了,比如:ARM处理器,PCIe, ETHERNET等.在制程工艺上,Xilinx的7系列FPGA采用28 nm工艺,UltraScale采用20nm, UltraScale+ 采用16nm,每一代工艺的可用资源,比上一代就翻了一倍. 从架构而言,Xilinx

FPGA的一些琐碎知识整理

1.生产FPGA的厂家有: ALTERA XILINX ATCEL Lattice ps: Altera和Xilinx主要生产一般用途FPGA,其主要产品采用SRAM工艺 Actel主要提供非易失性FPGA,产品主要基于反熔丝工艺和FLASH工艺 ps: 熔丝,顾名思义:把丝熔掉,反熔丝技术恰相反,原来断接的点在烧录之后,短接上了,这种短接是永久性的! 反熔丝是一次性!! 2.FPGA是由存放在片内RAM中的程序来设置其工作状态的,工作时需要对片内的RAM进行编程,在掉电时FPGA变成一个白片!

Altera 的 FPGA 的 AS、PS 和 JTAG 配置模式

FPGA 器件有三种配置下载方式:主动配置方式(AS)和被动配置方式(PS)和最常用的(JTAG)配置方式. AS 模式(Active Serial Configuration Mode): FPGA 器件每次上电时作为控制器,由 FPGA 器件引导配置操作过程,它控制着外部存储器和初始化过程,从配置器件 EPCS 主动发出读取数据信号,从而把 EPCS 的数据读入 FPGA 中,实现对 FPGA 的编程配置数据通过 DATA0 引脚送入 FPGA,配置数据被同步在 DCLK 输入上,1 个时钟

SRAM的读写操作

自己写的SRAM的程序,主要在于实用性,适应工作的工程需要.使用芯片为: 芯片时序图为: 代码: /********************************Copyright************************************** **----------------------------File information-------------------------- ** File name : ZF_SRAM.v ** CreateDate :2014.11

一位FPGA前辈的分享

我常年担任多个有关FPGA学习研讨的QQ群管理员,长期以来很多新入群的菜鸟们总是在重复的问一些非常简单但是又让新手困惑不解的问题.作为管理员经常要给这些菜鸟们普及基础知识,但是非常不幸的是很多菜鸟怀着一种浮躁的心态来学习FPGA,总是急于求成.再加上国内大量有关FPGA的垃圾教材的误导,所以很多菜鸟始终无法入门. 为什么大量的人会觉得FPGA难学?本管理员决心来详细讲一下菜鸟觉得FPGA难学的几大原因. 1.不熟悉FPGA的内部结构,不了解可编程逻辑器件的基本原理. FPGA为什么是可以编程的?

用FPGA设计LCD 转 VGA

这个东西其实是在上一个冬天就做完了,而且似乎已经产业化了,当时是为一位朋友做的,这个朋友再卖给产业化的人,就像流于俗套的故事一样,这个朋友拿到了钱,不过不像项目开始时说的那样与我有关.想想多年前一起吃喝拉撒的场景,叹了一口气抹去那些记忆,也只能算了.现在把这个设计写在博文博文中,一方面可以回忆回忆当时的设计思路,也希望可以为其他设计FPGA的兄弟姐妹们提供一点参考. 当时的写的ppt文档可在下列地址下载: http://blogimg.chinaunix.net/blog/upfile2/101