IP核
AI summary
本文讨论了FPGA内部构建的多种存储器,包括ROM、SPRAM、DPRAM和FIFO,详细介绍了其设计要求、实现过程和工作原理。重点包括数据深度、宽度、读写操作、波形生成及频率调节等,强调了在不同应用场景下的设计策略和控制器实现。
Last edited time
Sep 24, 2024 03:06 PM
Last edited by
Tags
Fpga Design
Memory Architecture
Digital Logic
一:IP核介绍二:不同厂商提供IP核种类三:IP核例程1(Altera:Quartus II 13.1)四:IP核例程2(Altera:Quartus II 13.1)五:IP核例程3(Altera:Quartus II 13.1)六:IP核例程4(Altera:Quartus II 13.1)七:综合设计
一:IP核介绍
IP核:(Intellect Property Core:知识产权)。
IP:固IP,软IP和硬IP
软IP和硬IP以及固IP可以参考百度百科介绍。
FPGA利用可配置的逻辑单元完成电路功能,但是配置的电路只能完成数字逻辑功能,对于一些模拟电路功能无法实现。
FPGA实现时对于一些功能比较复杂/难以实现的电路,往往生产厂商/第三方会提供一些IP(将常用的ASIC直接放入在FPGA的内部);对于设计者而言,直接配置参数,就可以和ASIC进行通信。
对于一些复杂性设计,厂家也可以将电路封装成一些模块,提供给设计者使用(方便设计)。
二:不同厂商提供IP核种类
不同厂家提供不同类的IP核共设计者使用。(Altera/Xilinx)
以Altera为例:
- 运算类(+ - * / ** %...)
- 通信类(编码/解码/校验码)
- DSP类(滤波器:FIR/IIR…)
- 接口类(LVDS/单总线…)
- 存储器类(片内存储:ROM/RAM/FIFO/移位寄存器…)
- IO类(altpll…)
- 高速接口(DDR2/3…PCI/PCIE/以太网…)
- 调试类(ISSP/Signaltap II…)
…
高版本软件IP核一般会兼容低版本软件IP核。
三:IP核例程1(Altera:Quartus II 13.1)
时钟管理单元:PLL(Phase-Locked Loop:相位锁定的环路),也就是常说的锁相环。
PLL主要完成对输入时钟进行分频(比输入频率小)/倍频(比输入频率大)。
其次可以使得输出频率改变相位/占空比。
- 相位
- 占空比
高电平持续时间占整个周期比值。
- 通过PLL输出25MHZ和100MHZ(对其相位和占空比自行调节)。
测试结果:
根据芯片不同,输出频率范围有所差异。
EP4CE10F17C8N //LOW:几十K HIG:几百M
低于几十K下的频率,采用之前计数器实现分频器。
在PLL输出频率范围内,能使用PLL都采用IP核,对于设计时方便。
- 应用实例
- 设计要求:通过PLL输出4路时钟(c0,c1,c2);规定
- 设计架构
- 测试结果
c0=25MHZ,c1=75MHZ,c2=100MHZ。
以之前设计50MHZ------>2HZ(0.5s)完成LED的控制。
频率 | 间隔时间 | 计数器计数最大值 |
50MHZ | 0.5s | cnt_max=50_000_000HZ / 2HZ |
25MHZ | 1s | cnt_max = 25_000_000HZ / 2HZ |
75MHZ | 0.375s | cnt_max = 75_000_000HZ / 2HZ |
100MHZ | 0.25s | cnt_max = 100_000_000HZ / 2HZ |
练习:
- 完成上课内容(可以参考cyclone4-handbook.pdf),应用实例(其它LED状态)
- 在设计实例当中,更换PLL中输出时钟占空比和相位,看输出状态。
四:IP核例程2(Altera:Quartus II 13.1)
ROM(Read-Only Memory):只读存储器
ROM----->PROM---->EPROM----->EEPROM(24LC64)。
ROM属于非易失性存储器(Flash)。
FPGA内部并没有严格意义上的ROM,其实也就是通过RAM经过适当的配置,来实现的ROM。
EP4CE10F17C8N //Memory:423936bit
1M=1024K
1K=1024B
1B=8bit
423936bit/8/1024=51.75K
嵌入式内存结构由M9K内存块组成的,在FPGA内部按照列状排列。
M9K内存块特性:
- 每一个内存块大小为8192bit(包括校验位:就是9216bit)
- 独立的读写功能
- 端口可配置功能
- 支持单端口和双端口模式
- 在ROM/RAM模式下,支持初始化数据
Altera:(Quartus II:.Hex/.Mif文件)
Xilinx:(ISE/Vivado:.coe文件)
- 支持字节使能功能
- 支持时钟使能功能
ROM:只读存储器,这种存储器不支持写操作,只支持读操作。
构造该存储器时,只能将数据“刻录”进去(做成一个初始化文件,加载在存储器中)。
ROM利用FPGA片内存储块M9K构成的。
ROM工作原理:在时钟上升沿来时,采样到读使能为1时,将地址上的数据进行输出。
数据深度:能够存储数据的个数(256) //地址宽度:8
数据宽度:存储数据的宽度(8bit) //数据宽度:8
存储器存储空间大小:数据深度数据宽度
Memory=2568bit=2048bit
片外存储器:flash(M25P16)/eeprom(24LC64)
Eeprom:64Kbit=8K*8bit
Flash:16Mbit=2M*8bit
- 设计要求
在FPGA内部构建一个数据深度为256,宽度为8bit的ROM存储器。
- 设计实现
- 初始化文件(.Hex/.Mif文件)
- 构建ROM IP
- 读取ROM数据
文件格式如下:
注意:.Mif文件数据每一行以“;”结束。最后要加上end;
(1):直接对ROM IP核进行测试
(2):完成地址控制器读取ROM数据
DDS:Direct Digital Synthesizer(直接式数字频率合成器:信号发生器)。
主要目的:往往产生不同的波形(方波/正弦波/锯齿波/三角波/梯形波…)不同的相位/不同的频率的信号,用于调试硬件设备。
DDS结构:
DDS结构主要由累加器,波形存储器,D/A转换器和低通滤波器等四个大的结构组成的。
- 波形可调节(产生方波/正弦波/锯齿波/三角波/梯形波…)
只需要改变ROM中存储的数据即可(正弦波数据…)
通过Guagle_wave.exe产生所需波形。
- 相位可调节
调节相位其实就是更改地址的初始值。
- 频率可调节
- 计算
- 实测
- 改变正弦波频率的方式
- 改变系统时钟大小 //X
- 改变波形数据深度 //X
- 改变地址的步进值 //X
以正弦波基础频率:
T=256*20ns=5120ns
F=1/T=1/5120ns=195,312.5HZ=195.3125KHZ
最终设计:改变任意频率
实现过程:需要设置一个虚拟地址计数器(位宽:16/24/32),所有地址计数时采用虚拟地址计数器进行计数,虚拟地址计数器步进值(频率控制字:B),最终使得有效地址取虚拟地址计数器高8位。
虚拟地址16位:高8位
2^16-2^8=65,280 2^16=65536
65280/65536-1=-0.00390625
虚拟地址24位:高8位
2^24-2^16= 16,711,680 2^24= 16,777,216
16,711,680/16,777,216-1=-0.00390625
虚拟地址32位:高8位
2^32-2^24= 2^32=
(2^32-2^24)/ 2^32-1=-0.00390625
公式推导:
T=256*20ns=5120ns
F=1/T=1/5120ns=195,312.5HZ=195.3125KHZ
195.3125KHZ = 1/5120ns = 1/20ns*1/256=50MHZ/256=50MHZ/2^8 * 1
Fout = Fclk / 2 ^ N(N = 16/24/32) * B
Fout = Fclk / 2 ^ N * B
Fout(已知量) Fclk(已知量) N(已知量) B(未知量)
假设得到正弦波输出频率1KHZ:
当N=16时 1KHZ=50MHZ / 2 ^ 16 * B B = 1.31072 //误差最大
误差:763HZ/1KHZ-1=-0.237
当N=24时 1KHZ=50MHZ / 2 ^ 24 * B B = 335.54432 //误差比较小
误差:1.001HZ/1KHZ-1= 0.001
当N=32时 1KHZ=50MHZ / 2 ^ 32 * B B = 85,899.34592 //误差最小
假设得到正弦波输出频率1HZ:
当N=16时 1HZ=50MHZ / 2 ^ 16 * B B = 1.31072 / 1000 //没有数据
当N=24时 1HZ=50MHZ / 2 ^ 24 * B B = 0.33554432 //没有数据
当N=32时 1HZ=50MHZ / 2 ^ 32 * B B = 85.89934592 //标准1HZ
总结:虚拟地址计数器位宽越大,误差最小。
下板验证:
五:IP核例程3(Altera:Quartus II 13.1)
RAM:Random Access Memory(随机存取存储器)
随机存取存储器(Random Access Memory):又称为“随机存储器”,是与CPU直接交换数据的内部存储器,也叫做主存(内存)。它可以支持随时读写,而且速度很快,通常作为操作系统或其它正在运行中的程序的临时数据存储媒介。
这种存储器在断电时将丢失其存储内容,故主要用于存储短时间的程序。
按照存储单元的工作原理,随机存储器又分为静态随机存储器(Static RAM:SRAM)和动态随机存储器(Dynamic RAM:DRAM)。
RAM和ROM相比,两者最大的区别就是RAM在断电以后保存在上面的信息回自动消失,而ROM不会。
RAM:既可以写入数据,也可以读取数据操作;在构建存储器时,可以进行初始化数据,也可以不用初始化文件(写数据操作)。RAM支持初始化文件数据.Hex/.Mif文件。
RAM也是利用FPGA片内存储块M9K构成的。
RAM工作原理:
写操作:RAM在进行写数据时,在时钟上升沿来时,采样到写使能为1时,写地址同时可以进行写数据。
读操作:RAM在进行读数据时,在时钟上升沿来时,采样到读使能为1时,读数据。
RAM在构建时,可以分为单端口RAM(single-port RAM)和双端口RAM(dual-port RAM)。
SPRAM:单端口RAM DPRAM:双端口RAM
- SPRAM端口
- 设计要求
在FPGA内部构建一个数据深度为256,宽度为8bit的SPRAM存储器。
- 设计实现
- 直接对SPRAM的IP核进行测试
- 完成对SPRAM的控制,实现RAM的读写
(1):随机写5和100地址数据,读取5和100地址数据
(2):往RAM中写256个地址和256个数据,读取256个数据
(3):循环读写
(4):写入数据超出数据深度,读取数据问题
对于SPRAM控制器,先写入地址和数据,然后对写入的数据进行读取。
采用FSM完成SPRAM的读写控制。
- DPRAM端口
- 端口描述
信号 | 描述 | 端口流向 | 说明 |
wr_clk | 写时钟:具体设计具体对待 | 输入 | |
wr_addr | 写地址:有一定深度 | 输入 | |
wren | 写使能:高电平有效 | 输入 | |
wrdata | 写数据:常见为8bit | 输入 | |
rd_clk | 读时钟:具体设计具体对待 | 输入 | |
rden | 读使能:高电平有效 | 输入 | |
rd_addr | 写地址:有一定深度 | 输入 | |
rd_data | 读数据:和写数据一致 | 输出 |
- DPRAM工作原理
写操作:在写时钟上升沿来时,采样到写使能为1时,写地址同时可以进行写数据;一旦数据写完,关闭写使能,不再写数据。
读操作:在读时钟上升沿来时,采样到读使能为1时,进行读地址(读地址上的数据);一旦数据读完,关闭读使能,不再读数据。
- 设计要求
在FPGA内部构建一个数据深度为256,宽度为8bit的DPRAM存储器。
- DPRAM
- 读写同时钟DPRAM测试(直接测试IP)
- 读写不同时钟DPRAM测试(直接测试IP:先写后读)
- 读写不同时钟DPRAM测试(完成读写控制器:边写边读)
写时钟:100MHZ 读时钟:10MHZ(快写慢读)
写时钟:10MHZ 读时钟:100MHZ(慢写快读)
六:IP核例程4(Altera:Quartus II 13.1)
FIFO:First Input First Output(先进先出缓冲器)。
FPGA/ASIC中常用的FIFO一般指的是对数据的存储具有先进先出特性的存储器;常用于数据的缓存或者高速异步数据的交互。
UART:通用异步收发器
UART接收器:RXD(对数据一位一位进行接收(串行数据),缓存的数据多位(并行数据))。
UART发送器:待发送数据(写FIFO多位数据:并行数据),通过TXD将数据一位一位发送出去(串行数据)。
- FIFO结构
FIFO从大情况来分,有两种结构:单时钟FIFO(SCFIFO:Single-Clock FIFO)和双时钟FIFO(DCFIFO:Dual-Clock FIFO)。
单时钟FIFO(SCFIFO):单时钟FIFO具有一个独立的时钟端口Clock,所有的输入信号的读取都是在时钟Clock的上升沿进行的;所有的输出信号也都是在时钟Clock上升沿的控制下进行的,即单时钟FIFO的所有的输入和输出信号都是同步于Clock。单时钟FIFO常用于片内数据交互。
- SCFIFO端口
信号 | 描述 | 端口流向 | 说明 |
clock | 读写同步时钟 | 输入 | |
wreq | 写请求(高有效) | 输入 | |
wrdata | 写数据(由宽度决定) | 输入 | |
rdreq | 读请求(高有效) | 输入 | |
aclr/sclr | 清零端(复位) | 输入 | |
empty | 空信号标志 | 输出 | |
full | 满信号标志 | 输出 | |
usedw | FIFO中数据的余量 | 输出 | |
almost_empty | 空信号的提前标志(设置阈值) | 输出 | |
almost_full | 满信号的提前标志(设置阈值) | 输出 | |
rddata | 读数据(和写数据一致) | 输出 |
- SCFIFO端口描述
empty:当FIFO没有数据时,空信号为真;
full:当FIFO被填充满时,满信号为真;
almost_empty:当usedw小于设置阈值时,该信号为真,是empty的提前提示信号。
almost_full:当usedw大于等于设置阈值时,该信号为真,是full的提前提示信号。
- SCFIFO工作原理
写操作:在时钟上升沿来时,打开写请求,进行写数据,一旦写满,关闭写请求,不再写数据。
读操作:在时钟上升沿来时,打开读请求,进行读数据,一旦读空,关闭读请求,不再读数据。
提示:满足FIFO满了不能写,空了不能读。
- 设计要求
在FPGA内部构建一个数据深度为256,宽度为8的SCFIFO存储器。
- 设计实现
- 直接对SCFIFO IP核测试
- SCFIFO读写控制器
采用FSM实现:
- 双时钟FIFO(DCFIFO)
- DCFIFO端口
wrempty(写空信号):当FIFO没有数据时,写空信号为真。
wrfull(写满信号):当FIFO被填充满时,写满信号为真。
rdempty(读空信号):当FIFO所有数据被读出时,读空信号为真。
rdfull(读满信号):当FIFO没有任何数据读出时,读满信号为真。
空满都表明FIFO的状态。
wrusedw(写余量):写数据时,写入FIFO数据个数。
rdusedw(读余量):读数据时,每读出一个数据读余量会减少一个。
余量都监测FIFO中数据的个数。
- DCFIFO工作原理
写操作:在写时钟上升沿来时,打开写请求,进行写数据,一旦写满,关闭写请求,不再写数据。
读操作:在读时钟上升沿来时,打开读请求,进行读数据,一旦读空,关闭读请求,不再读数据。
提示:满足FIFO满了不能写,空了不能读。
- 设计要求
在FPGA内部构建一个数据深度为256,宽度为8的DCFIFO存储器。
- 设计实现
- 直接对SCFIFO IP核测试
- 读写DCFIFO控制器实现
读写控制器采用FSM实现:
写控制器:先判断空,再考虑满。
读控制器:先判断满,再判断空。
练习:
- 完成上课内容
(3):循环读写
(4):写入数据超出数据深度,读取数据问题
- 了解乒乓操作思想(SPRAM/DPRAM应用实例)
主要掌握理论。
乒乓操作(利用休息时间完成)
- 完成采用DPRAM(不同时钟)实现的乒乓操作(设计思想)。
- 完成DCFIFO读控制器部分,保证读写数据一致(先写数据先读出来)
- DPRAM和DCFIFO关系
解决跨时钟域三种方式:双端口RAM/异步FIFO/同步寄存器链
七:综合设计
跨时钟域FIFO控制器。
- 设计要求
采用外部设备(矩阵键盘产生输入数据/数据生成模块:自行产生一组数据)作为写数据,首先将数据写入到RAM中(SPRAM/DPRAM),读取后对DCFIFO进行写数据,一旦DCFIFO数据填充满,将数据立刻读取后显示在数码管上。可以采用LED表明当前DCFIFO的空满状态。
- 设计分析1
DCFIFO读写时钟:写时钟(10MHZ) 读时钟(2HZ)。
- 设计架构
- 设计分析2
- 设计分析2
Loading...