FPGA自学——存储器模型
文章目录
一、IP核
一)概念:是指芯片中具有独立功能的电路模块的成熟设计
二)常见IP核:
1.逻辑运算:与、或、非、异或等基本逻辑运算单元和复用器、循环位移器、三态缓存器和解码器等相对复杂的逻辑运算模块
2.数学运算:分为整数运算和浮点运算
整数运算:加法器、减法器、乘法器、除法器、比较器、计数器和绝对值计算器
浮点运算:浮点数加法器、浮点数减法器、浮点数乘法器、浮点数除法器、浮点数平方根计算器、浮点数指数计算器
3.存储器IP:移位寄存器、触发器、锁存器的简单的存储器IP核和较为复杂ROM、RAM、FIFO和Flash存储器等模块
4.输入/输出IP核:时钟控制器、锁相环(PLL),低电压差分信号(LVDS)、收发器、双数据速率(DDR)I/O、访问外部存储器的DQ-DQS I/O,I/O缓存器
5.数字信号处理IP核:有限冲激响应滤波(FIR)编译器,级联积分梳状(CIC)滤波器编译器、数控振荡器(NCO)编译器以及快速傅里叶交换(FFT)等IP核,用于数字信号系统设计
6.数字通信IP核:RS码编通器、循环冗余校验(CRC)编译器、8B/10B编/译码器、SONET/SDH物理层IP核
7.图像处理IP核:2D FIR滤波器、2D中值滤波器、α混合器、视频监视器、色度重采样器、图像裁剪器、视频输入和输出模块、测试模板生成器、视频跟踪系统模块
8.芯片接口IP核:数字视频广播(DVB)的异步串行接口(AS1)、10/100/1000Mbps以太网接口、DDR和DDR2 SDRAM控制器、存储器物理层访问接口、PCI/PCI Expresso编译器、Rapidlo和用于数字电视信号传输的串行数字接口(SDI)
9.设计调试IP核:ILA逻辑分析仪、串行和并行Flash加载器、系统内的源和探测模块、虚拟JTAG
10.其他
三)应用示例
情况1: 某芯片,有500个寄存器,需要在上电的时候由FPGA向这些寄存器中写入初始值,初始值通过相应的文档给出来了具体值,这些值都是已知的
特点: 数据量较多; 数值已知固定;上电工作(一次);只需要读取
功能选用: ROM:只读存储器
情况2: 信号源(ADC)以1微妙一个的速率产生12位的数据现要求获得连续1毫秒内的数据,通过串口以115200的波特率发送到电脑
特点: 数据量1000(总数有限); 数据内容未知;数据的使用速度低于数据的产生速度(速率不匹配);需要重复利用(位宽不同)
速度计算: 串口——以两次六位的方式进行传输,每次传输的bit数((起始位+停止位)+6)bit = 8bit
每个bit传输的时间为1000_000_000ns/115200 ≈ 8680ns ,一组数据传输8680ns*8 = 69440ns = 69.4微妙
数据源——1微妙产生两组数据,一组数据的产生 = 0.5微妙
存在问题: 数据生产(12)和消耗(6)的位宽不同——需要重复利用
功能选用: RAM:可读可写
二、ROM(read only memory)
定义:只读存储器
特点:非易失性,断电后数据不会丢失
应用:嵌入电脑主板或者做移动存储介质,体积够小,提供的容量可以比光盘核软盘的大,速度也不慢
延展:
EPROM | Erasable Program ROM (可擦除编程ROM) | 紫外线光擦除 |
---|---|---|
EEPROM | Electric Erasable Program ROM (电可擦除编程ROM) | 一次擦除一个字节 |
FLASH | 按块擦除 |
三、ROM的IP核调用
1.新建一个rom_test的工程文件
2.选择对应的IP核,选择块存储器生存器
3.配置相关参数
4.生成并加载rom的初始化文件
在【原创】Mif精灵/mif(coe)文件生成器 - 芯路恒资料与技术支持专区 - 芯路恒电子技术论坛 - Powered by Discuz!下载Mif_Make_V2.4_exe.zip文件,并压缩打开使用
5.查看总结
6.生成
7.查看IP核相关的代码
找到例化代码
8.编写测试文件
`timescale 1ns / 1ps
module rom_tb();
reg clka;
reg [9:0] addra;
wire [9:0] douta;
rom rom_inst0 (
.clka(clka), // input wire clka
.addra(addra), // input wire [9 : 0] addra
.douta(douta) // output wire [9 : 0] douta
);
//产生时钟,以50MHz为准
initial clka = 1;
always #10 clka = ~clka;//也可以写为clka = !clka;
initial begin
addra = 100;
#201;
repeat(30000) begin //repeat循环
addra = addra + 1'b1;
#20;
end
#2000;
$stop;
end
endmodule
9.查看波形
数字波形,修改为十进制进行查看
模拟波形
四、RAM(random access memory)
一)介绍
定义:随机存储器,它可以随时把数据写入到任何一指定地址的存储单元,也可以随时从任一指定地址读出数据,其读写速度由时钟频率决定,主要用来存放程序以及程序执行过程中产生的数据,运算结果等
种类:
五、RAM的IP核调用
1.创建一个ram_test的项目工程文件
2.选用block ram的IP核
3.设计数据流向模块图
4.根据数据流向模块图选择配置
5.点击生成即可
三)仿真测试
1.跟上面rom的步骤基本一致
2.仿真代码实现
`timescale 1ns / 1ns
module ram_tb();
reg clka ;
reg ena ;
reg wea ;
reg [15 : 0] addra ;
reg [15 : 0] dina ;
reg clkb ;
reg enb ;
reg [15 : 0] addrb ;
wire [15 : 0] doutb ;
ram ram_inst0 (
.clka (clka), // input wire clka
.ena (ena), // input wire ena
.wea (wea), // input wire [0 : 0] wea
.addra (addra), // input wire [15 : 0] addra
.dina (dina), // input wire [15 : 0] dina
.clkb (clkb), // input wire clkb
.enb (enb), // input wire enb
.addrb (addrb), // input wire [15 : 0] addrb
.doutb (doutb) // output wire [15 : 0] doutb
);
initial clka = 1;
always #10 clka = ~clka;
initial clkb = 1;
always #15 clkb = ~clkb;
initial begin
//初始化
ena = 0 ;
wea = 0 ;
addra = 0 ;
dina = 0 ;
enb = 0 ;
addrb = 0 ;
//写入
#201
repeat(65536) begin
ena = 1;
wea = 1;
#20;
addra = addra + 1'b1;
dina = dina + 1'b1;
end
ena = 0;
wea = 0;
#2000;
//读出
addrb = 65536;
#300
repeat (65535) begin
enb = 1;
#30
addrb = addrb - 1'b1;
end
#2000
$stop;
end
endmodule
3.仿真结果
总结
1.不同波形的使用的存储器
2.块与分布式的选择
区别 | distributed(分布式) | block(块式) |
---|---|---|
资源 | LUT(查找表——本质是很小的ram) | Block Memory(嵌入式的硬件RAM) |
调用方式 | 需要多少拿多少 | 成块拿取 |
用户需求 | 需求小,选用分布式 | 需求大,选用块式 |
3.FPGA与模块的容量资源计算
以TFT屏幕为例:
**计算FPGA的最大容量:**RGB565 -> 需要16位宽 -> 选取的配置为16K×2 -> xc7z015-2(blocl ram有95)-> 计算最大容量:16K×95 = 190K
**TFT模块:**RGB565 -> 需要16位宽 -> 屏幕大小800×480 =384K -> 需要容量 = 384K × 16 =
**资源不足时解决方法:**选择部分屏幕进行显示
4.控制写入的ena和wea的区别
区别 | ena | wea |
---|---|---|
名称 | Enable的缩写 | Write Enable A的缩写 |
作用 | 控制RAM块是否激活或工作 | 控制数据是否写入到指定地址的RAM中 |
wea使用时要注意位宽给限定字节大小的整数倍,wea的位宽位数就是倍数
手册wea的使用案例
5.下载手册资源的方式
1.使用vivado自带功能进行下载
2.查看文件
3.如果无法成功下载,或下载后的文件打不开,使用自动打开的官网入口
4.根据关键字进行搜索