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核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...
随机推荐
- Django CSRF cookie not set.
错误原因 由于django框架的settings.py配置了中间件,为了防止跨站请求伪造,form表单POST方式会导致出现报错 解决办法: 将'django.middleware.csrf.Csrf ...
- Burnside 定理
Burnside 定理 问题: 给定一个 \(n\) 个点,\(n\) 条边的环,有 \(m\) 种颜色,给每个顶点染色,问有多少种本质不同的染色方案,答案对 \(10^9+7\) 取模 注意本题的本 ...
- DXP TreeList 目录树
DXP TreeList 目录树 1.需求背景 需要一个支持勾选,拖动节点,保存各节点顺序的目录树. 2.创建目录树 在treeList控件中添加两个colunm 用来显示绑定数据和显示值. 接下来对 ...
- servlet系列:简介和基本使用以及工作流程
目录 一.简介 二.Servlet实现 三.基本使用 1.引入pom依赖 2.实现Servlet规范,重写service方法 3.配置web.xml 4.配置Tomcat 6.运行 四.Servlet ...
- nlp入门(五)隐马尔科夫模型
源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com) 一.马尔科夫模型概念 1.1 马尔科夫模型:具有马尔可夫性质并以随机过程为基础的模型 1.2 马尔科夫性质:过去 ...
- Linux 网络发包流程
哈喽大家好,我是咸鱼 之前咸鱼在<Linux 网络收包流程>一文中介绍了 Linux 是如何实现网络接收数据包的 简单回顾一下: 数据到达网卡之后,网卡通过 DMA 将数据放到内存分配好的 ...
- 老问题了:idea中使用maven archetype新建项目时卡住
背景 作为一个后端Java打工人,idea就是最重要的打饭工具.创建项目,熟悉吧,但是,这么多年下来,因为idea换了版本,电脑换了等等,我还是时不时遇到根据maven archetype新建mave ...
- 使用 SQL 的方式查询消息队列数据以及踩坑指南
背景 为了让业务团队可以更好的跟踪自己消息的生产和消费状态,需要一个类似于表格视图的消息列表,用户可以直观的看到发送的消息:同时点击详情后也能查到消息的整个轨迹. 消息列表 点击详情后查看轨迹 原理介 ...
- 细谈商品详情API接口设计
一.引言 随着互联网技术的发展,商品详情信息的展示和交互变得越来越重要.为了提供更好的用户体验,我们需要设计一套高效.稳定且易于扩展的商品详情API接口.本文将详细探讨商品详情API接口的设计,包括接 ...
- 多层前馈神经网络及BP算法
一.多层前馈神经网络 首先说下多层前馈神经网络,BP算法,BP神经网络之间的关系.多层前馈[multilayer feed-forward]神经网络由一个输入层.一个或多个隐藏层和一个输出层组成,后向 ...