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核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...
随机推荐
- pandas: dataframe转字典,并设置key
解决方案 res = df_by_monthly.set_index('recruit_resign_month').T.to_dict('list') print(res) 上述代码是转为列表形式 ...
- Ubuntu新建Django工程错误:ModuleNotFoundError: No module named 'distutils.core'
ubuntu18.04 默认没有安装 pip ,需要安装 python3-pip,即可解决 1 sudo apt-get install python3-pip 在shell脚本中输入以下命令: 1 ...
- 使用$test$plusargs提高RTL验收速度
0 前言 这段时间在整合一个小ip,因为要验证每个feature是否可行,需要用testbench + C语言的方式进行仿真验证,由于每种feature不仅要在C语言中修改寄存器配置,还要再testb ...
- [prometheus]基于influxdb2实现远端存储
前言 Prometheus自带的时序数据库胜在使用方便,缺点在于难以维护,如果数据有问题,可能需要删除存储目录.重建目录再重启Prometheus,才能恢复正常.而且Prometheus自带的时序数据 ...
- Amiya 前端UI
最近在使用一个基于Ant Design 二次封装的组件 Git文档地址 Index - Amiya (gitee.io)
- 如何找到docker容器中的网卡外联的veth pair的另一张网卡
1.概述 在Docker容器中,每个容器都有一个或多个网络接口(网卡),用于连接容器内部与宿主机或其他容器进行通信.这些网络接口中的一些可能是veth pair,也就是虚拟以太网对,它们以成对的方式存 ...
- 基于bert-base-chinese训练bert模型(最后附上整体代码)
目录: 一.bert-base-chinese模型下载 二.数据集的介绍 三.完成类的代码 四.写训练方法 五.总源码及源码参考出处 一.bert-base-chinese模型下载 对于已经预训练好的 ...
- 聊一聊使用Spring事物时不生效的场景
前言 今天介绍一下Spring事物不生效的场景,事物是我们在项目中经常使用的,如果是Java的话,基本上都使用Spring的事物,不过Spring的事物如果使用不当,那么就会导致事物失效或者不回滚,最 ...
- 基于三菱Q系列cc-Link的卧式自动燃煤蒸汽锅炉控制系统
系统说明: 方案选用: 本系统最终采用三菱Q系列+FX3U系列方案 工艺流程: 触摸屏设计: 程序设计: 本文章为原创作品,未经允许,请勿转载,否则将会追究法律责任.
- Python 列表操作指南1
Python 列表 mylist = ["apple", "banana", "cherry"] 列表用于在单个变量中存储多个项目.列表是 ...