FPGA初学者(5)

数字电路实用篇

第二章 RAM简介

RAM 是存储器分类的一个分支,属于静态存储器,RAM 是逻辑设计中非常重要的一个特性,RAM 一般包括单端口 RAM,伪双端口 RAM ,真双端口 RAM 。单端口 RAM只有一个读写口,同一个时刻只能发起读或写,伪双端口 RAM 设计一个端口只能读,一个端口只能写,真双端口 RAM 设计每个端口都可以进行读或者写操作,特点是容量相对不是很大,速度非常高,掉电数据丢失。
在这里插入图片描述

单端口 RAM 设计

单端口 RAM 指的是只有一个读写口,就是只有一组数据线和地址线,就是读和写都是通过这个口来访问 RAM,但是同一个时刻只能访问一个,要么是读,要么是写。
在这里插入图片描述
单端口 RAM 的端口都是比较类似的,主要的端口都是写使能、总使能、写数据、写地址和读数据。
ena :读或写使能 输入读或写使能信号,一般高电平有效,读或者写使能的前提是 ENA 有 效,ENA 为 1 且 WEA 为 1 表示写有效,ENA 为 1 且 WEA 为 0 表示读有效;
dina :写数据输入写数据端口,一般是由多 bit 构成;
douta :读数据输出读数据端口,一般是由多 bit 构成,一般和 DINA 写数据位宽相同;
clka :时钟信号 输入 RAM 的时钟信号,由外部输入时钟;
addra: 地址信号 输入RAM 的地址信号,由外部输入,地址位宽决定RAM 的最大深度;

RAM 有一个重要的特性是 读延迟,通常延迟一拍,如果 RAM 输出再因为改善时序寄存一拍,那么 RAM 的读就延迟两拍。如下所示,在读有效且地址有效的情况下(wea为 0,ena为 1),下一拍 douta即为读到的数据,通常情况下,读使能和读地址不会变化,douta不会发生变化。
在这里插入图片描述
另外 RAM 读数据我们建议只使用 RAM 读有效时的读数据,没有发起读的时候,读数据一般不建议使用,因此此时的读数据依赖于 RAM 模型的特性,有可能是不确定的值。
在这里插入图片描述

单端RAM程序设计

实际工程中RAM使用比较简单,都是直接调用IP核就行了:
`timescale 1ns / 1ps
//
// Company:
// Engineer:

module RAM
(
input clk , //时钟信号
input rst //复位信号,低有效

);

wire ena ; //ram 总使能
wire wea ; //ram 读使能
reg [12:0] rw_cnt ; //读写控制计数器
reg [12:0] addra ; //ram 读写地址
reg [31:0] din_data; //ram 写数据

//rw_cnt 计数范围在 0~31,ram_wr_en 为高电平;32~63 时,ram_wr_en 为低电平
assign ram_wr_en = ((rw_cnt >= 12’d0) && (rw_cnt <= 12’d63)) ? 1’b1 : 1’b0;
//rw_cnt 计数范围在 32~63,ram_rd_en 为高电平;0~31 时,ram_rd_en 为低电平
assign ram_rd_en = ((rw_cnt >=12’d63) && (rw_cnt <= 12’d127)) ? 1’b1 : 1’b0;

//读写控制计数器,计数器范围 0~127
always @(posedge clk or negedge rst) begin
if(rst == 1’b0)
rw_cnt <= 13’d0;
else if(rw_cnt == 13’d127)
rw_cnt <= 6’d0;
else
rw_cnt <= rw_cnt + 6’d1;
end

//读写控制器计数范围:0~31 产生 ram 写使能信号和写数据信号
always @(posedge clk or negedge rst) begin
if(rst == 1’b0)
din_data <= 8’d0;
else if(rw_cnt >= 6’d0 && rw_cnt <= 6’d31)
din_data <= din_data + 8’d1;
else
din_data <= 8’d0;
end

//读写地址信号 范围:0~127
always @(posedge clk or negedge rst) begin
if(rst == 1’b0)
addra <= 12’d0;
else if(addra == 12’d127)
addra <= 12’d0;
else
addra <= addra + 1’b1;
end

assign ena = ram_wr_en | ram_rd_en ;

blk_mem_gen_0 RAM_upload (
.clka (clka), // input wire clka
.ena (ena), // input wire ena
.wea (wea), // input wire [0 : 0] wea
.addra (addra), // input wire [12 : 0] addra
.dina (din_data), // input wire [31 : 0] dina
.doutb (doutb) // output doutb
);
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值