FPGA常用IP核
前言:
芯片行业中的IP,一般称为IP(Intellectual Property)核,是具有知识产权核的集成电路芯核的总称。说白了就是厂家实现的具有特定功能工具,然后我们可以直接调用,就相当于是函数库吧,如果要定制IP核的化是需要氪金的,对于学习来说,免费的就够用啦。
在FPGA里,我用的是zynq-7000系列,有一个时钟管理器,包括MMCM与PLL,两者功能类似,PLL可以看作是MMCM的的子集,网上说MMCM相对于PLL的优势就是相位可以动态调整。
这篇随笔就写一些最基本的IP的功能用法吧,省得以后自己忘了,高级功能可以看官网文档学习。
一、PLL锁相环
作用:产生高质量,低抖动的时钟信号,可以调频,调相,调占空比的功能。
具体原理不写了先,等以后再看,是一个反馈电路
使用方法:
1 选择IP Catalog,找到自己想要使用的IP核,然后双击需要的IP核,进行配置即可。

2 配置界面。
(1)基本设置

(2)配置输出

其他的没有配置,暂时用不到。
3 生成IP核。
配置好后点击OK,generate即可,生成后的IP在源文件目录中的样子如下:

点击源文件下的IP Sources,找到例化模板。

然后复制模板就行例化即可。

4 使用IP核。
在需要的位置直接例化IP核即可。
module pll(
input sys_clk,
output clk_100m,
output clk_25m,
output clk_s_90,
output clk_d_20,
output locked
);
pll_ip pll_ip_inst
(
// Clock out ports
.clk_100m(clk_100m), // output clk_100m
.clk_25m(clk_25m), // output clk_25m
.clk_s_90(clk_s_90), // output clk_s_90
.clk_d_20(clk_d_20), // output clk_d_20
// Status and control signals
.locked(locked), // output locked
// Clock in ports
.pll_clk(sys_clk)
); // input pll_clk
endmodule
5 测试IP核。
Testbench代码如下:
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2023/08/13 09:19:14
// Design Name:
// Module Name: tb_pll
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module tb_pll();
reg sys_clk;
wire clk_100m;
wire clk_25m;
wire clk_s_90;
wire clk_d_20;
wire locked;
initial sys_clk = 1'b1;
always #10 sys_clk = ~sys_clk;
pll pll_inst(
.sys_clk (sys_clk ),
.clk_100m (clk_100m),
.clk_25m (clk_25m ),
.clk_s_90 (clk_s_90),
.clk_d_20 (clk_d_20),
.locked (locked )
);
endmodule
5 结果。

从locked置1开始,就说明时钟信号稳定了,其他四路信号经过测试结果也正确。
二、ROM
作用:只读存储器,存储的信息在制造时由厂家一次写入。只可以读取不可以写入,断电后也不会丢失信息。在这里我们就是厂家,我们可以规定存储的信息。
简单的原理在这
使用方法:
1 选择IP Catalog,搜索block,双击Block Memory Generator,进行配置即可。
2 配置界面

其中ECC Options是纠错类型的选择,这里用不到。
(1) 配置端口

(2) 初始化ROM,最初的数据。

这个coe文件可以用python来写,python代码如下:
file_name = "data.coe"
with open(file_name, 'w') as f:
f.write('memory_initialization_radix = 10;\n')
f.write('memory_initialization_vector = \n')
for i in range(256):
if i != 255:
f.write('{},\n'.format(i))
else:
f.write('{};'.format(i))
生成的文件内容格式:

生成好后放到 工程文件/工程名.srcs/sources_1/ip/rom_8x256,也就是生成的ip核目录下就行,然后在配置界面选择这个文件就ok,选择好后工程目录是这样的,出现了这个东西。

3 使用IP核
代码:
module rom
(
input wire sys_clk,
input wire [7:0]addr,
output wire [7:0]dout
);
rom_8x256 rom_8x256_inst (
.clka (sys_clk), // input wire clka
.addra(addr), // input wire [7 : 0] addra
.douta(dout) // output wire [7 : 0] douta
);
endmodule
4 测试IP核。
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2023/08/15 09:59:28
// Design Name:
// Module Name: tb_rom
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module tb_rom(
);
reg sys_clk;
reg sys_rst_n;
reg [7:0]addr;
wire [7:0]dout;
initial begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
#20
sys_rst_n <= 1'b1;
end
always #10 sys_clk = ~sys_clk;
always @ (posedge sys_clk, negedge sys_rst_n)
if (sys_rst_n == 1'b0)
addr <= 8'd0;
else if (addr == 8'd255)
addr <= 8'd0;
else
addr <= addr + 1'b1;
rom rom_inst
(
.sys_clk(sys_clk),
.addr(addr),
.dout(dout)
);
endmodule
5 波形

读取结果与输入地址差一个周期,没有问题。
三、FFT
折腾了好久的东西,今天终于差不多搞明白了。博客参考:
教程
教程代码
上面是博客参考。
因为要注意的东西过于多,不是三言两语能写清楚的,直接看视频,我愿称之为神的视频教程:
Vivado快速傅里叶变换FFT端口篇;
Vivado快速傅里叶变换FFT端配置篇;
Vivado快速傅里叶变换FFT端细节篇。
视频挺长,按顺序耐心看完,收获一定会非常多。
几个比较重要地方,这些都是网上很多教程中忽视的点:
(1)一定要把Output Ordering改为Natural Order,这样输出顺序就是matlab中计算后输出的顺序。
(2)Optional Output Fields一定要把OVFLO打勾,这样使用的时候就会出现一个event_fft_overflow信号,能够监控你的fft ip运算过程是否发生了溢出,如果溢出就要一定要设置s_axis_config_tdata,对运算进行缩放,直到不发生溢出为止,然后输出结果乘相应的缩放倍数就是正确的结果。
(3)不要只关注输入输出,那几个event_...信号,也非常重要,上面视频里也都有讲各个信号的意义,用于监测异常的,可以帮助你快速锁定bug。
四、RAM
作用:随机存储器。
配置:


代码
示例代码就略了,很简单。
五、加法器Adder、乘法器Multiplier
这两个IP的用法很简单,甚至不用看教程。


主要的,乘法器的Pipeline Stages设置,加法器的Latency设置,就是延迟多少个时钟输出,一般根据需要设置即可。
代码
tb_adder.v
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2023/09/20 22:07:17
// Design Name:
// Module Name: tb_adder
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module tb_adder();
reg [31:0] a;
reg [31:0] b;
reg sys_clk;
reg reset;
wire [31:0] out;
initial begin
reset = 1'b1;
#20
a = 31'd6;
b = 31'd0;
sys_clk = 1'b0;
reset = 1'b0;
end
always #10 sys_clk = ~sys_clk;
always @ (posedge sys_clk, posedge reset) begin
if (reset == 1'b1)
b <= 31'd0;
else
b <= b + 31'd1;
end
adder adder_inst (
.A(a), // input wire [31 : 0] A
.B(b), // input wire [31 : 0] B
.CLK(sys_clk), // input wire CLK
.SCLR(reset), // input wire SCLR
.S(out) // output wire [31 : 0] S
);
endmodule
tb_multiplier.v
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2023/09/20 21:49:42
// Design Name:
// Module Name: tb_multiplier
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module tb_multiplier();
reg [15:0] a;
reg [15:0] b;
reg sys_clk;
reg reset;
wire [15:0] out;
initial begin
reset = 1'b1;
#20
a = 15'd6;
b = 15'd0;
sys_clk = 1'b0;
reset = 1'b0;
end
always #10 sys_clk = ~sys_clk;
always @ (posedge sys_clk, posedge reset) begin
if (reset == 1'b1)
b <= 15'd0;
else
b <= b + 15'd1;
end
multiplier multiplier_inst (
.CLK(sys_clk), // input wire CLK
.A(a), // input wire [15 : 0] A
.B(b), // input wire [15 : 0] B
.SCLR(reset), // input wire SCLR
.P(out) // output wire [31 : 0] P
);
endmodule
FPGA常用IP核的更多相关文章
- 基于AXI4总线卷积FPGA加速IP核的尝试
本文先总结不同AXI IP核的实现的方法,性能的对比,性能差异的分析,可能改进的方面.使用的硬件平台是Zedboard. 不同的AXI总线卷积加速模块的概况 这次实现并逐渐优化了三个版本的卷积加速模块 ...
- FPGA内部IP核DDS
项目当中需要正弦信号与余弦信号,首先想到了DDS芯片,例如AD9833.AD9834.由于还需要用FPGA 做一些数据处理,后来干脆直接用FPGA 内部的DDSIP核,同时根据IP核内部的相位累加 ...
- 常用IP核
前言 记录自己用到的模块,随时补充. 主要分类: 一.常用模块 1-FIFO FIFO分为两种,一是输入输出时钟相同(Common clock)的 fifo ;二是输入输出时钟不相同(Independ ...
- FPGA基础学习(1) -- FFT IP核(Quartus)
为了突出重点,仅对I/O数据流为steaming的情况作简要说明,以便快速上手,有关FFT ip核模型及每种设置详细介绍请参考官方手册FFT MegaCore Function User Guide. ...
- FPGA基础学习(2) -- FIFO IP核(Quartus)
ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).FIFO主要应用在需要数据 ...
- FPGA VGA+PLL+IP核笔记
1.实现了预定功能!整个工程,没有使用例程的25MHZ,全部统一使用50MHZ.2.分辨率使用了800*600@72HZ.3.实现了只显示白色部分,黑色部分RGB == 0,要显示背景色.VGA图形基 ...
- IP核之初——FIFO添加以太网MAC头部
本文设计思路源自明德扬至简设计法.在之前的几篇博文中,由于设计比较简单,所有的功能都是用verilogHDL代码编写实现的.我们要学会站在巨人的肩膀上,这时候就该IP核登场了! 说白了,IP核就是别人 ...
- 从Xilinx FFT IP核到OFDM
笔者在校的科研任务,需要用FPGA搭建OFDM通信系统,而OFDM的核心即是IFFT和FFT运算,因此本文通过Xilinx FFT IP核的使用总结给大家开个头,详细内容可查看官方文档PG109.关于 ...
- 如何用ModelsimSE仿真IP核-以PLL为例
我们之前介绍了如何使用Modelsim SE进行仿真和利用do文件的仿真方法,但是其中待仿真的模块是我们自己编写的Verilog模块,但是在实际工作中,我们的设计中会经常用到FPGA厂商给我们提供的现 ...
- FIFO IP核
转载: 说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...
随机推荐
- openpyxl 统一表格样式
# 统一表格样式 rows = ws.max_row columns = ws.max_column # print(rows) # print(columns) for row in range(1 ...
- JS标识符
什么是标识符? 变量名 函数名 属性名都称为标识符. 定义标识符规范如下 1) 标识符只能由字母 数字 下划线 $组成. 2) 标识符不能以数字开头,例如: 1name. 3) 标识符不能实JS中的关 ...
- [ABC212E] Safety Journey
2023-01-08 题目 题目传送门 翻译 翻译 难度&重要性(1~10):2 题目来源 AtCoder 题目算法 dp 解题思路 首先就想到暴力 dp,用三个循环枚举:\(1.\) 时间, ...
- 《Kali渗透基础》04. 主动信息收集(一)
@ 目录 1:主动信息收集 2:发现 3:二层发现 3.1:arping 3.2:nmap 3.3:netdiscover 3.4:Scapy 4:三层发现 4.1:ping 4.2:Scapy 4. ...
- 数据可视化【原创】vue+arcgis+threejs 实现海量建筑物房屋渲染,性能优化
本文适合对vue,arcgis4.x,threejs,ES6较熟悉的人群食用. 先报备一下版本号 "vue": "^2.6.11" "@arcgis/ ...
- 文心一言 VS 讯飞星火 VS chatgpt (89)-- 算法导论8.3 2题
二.用go语言,下面的排序算法中哪些是稳定的:插入排序.归并排序.堆排序和快速排序?给出一个能使任何排序算法都稳定的方法.你所给出的方法带来的额外时间和空间开销是多少? 文心一言: 在Go语言中,以下 ...
- tree-test
#include <iostream> #include <stack> using namespace std; typedef struct BiTNode{ char d ...
- SpringBoot使用@Async注解8大坑点
前言 SpringBoot中,@Async注解可以实现异步线程调用,用法简单,体验舒适. 但是你一定碰到过异步调用不生效的情况,今天,我就列出90%的人都可能会遇到的8大坑点. 正文 1.未启用异步支 ...
- 解决CentOS 7出现docker-compose: command not found
解决CentOS 7出现docker-compose: command not found 1. 安装docker-compose 既然使用了docker-compose那自然得安装了 在GitHub ...
- WPF中以MVVM方式,实现RTSP视频播放
前言视频播放在上位机开发中经常会遇到,基本上是两种常见的解决方案 1.采用厂家提供的sdk和前端控件进行展示,常见的海康/大华都提供了相关sdk及文档 2.开启相机onvif协议,捅过rtsp视频流进 ...