文章灵感来源于MATLAB官方免费教程:HDL Coder Self-Guided Tutorial
考虑到MATLAB官网的英文看着慢,再加上视频讲解老印浓浓的咖喱味,我决定记录利用MATLAB&Simulink&SystemGenerator进行FPGA数字信号处理的学习过程。
往期回顾:
从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型1
从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型2
1.HDLSETUP
在MATLAB命令行中将上一期中制作好的Simulink文件执行:
open hdlsetup('文件名')
这个命令用来设置用于生成HDL代码的模型参数。
其中一个参数是SampleTimeColoes,即用不同颜色表示不同的采样时间,对应FPGA中的时钟速度。
在本例中,所有位置的采样速度相同,所以显示为相同颜色。
2.插入pipiline
FPGA的流水线设计(pipline design)是FPGA设计中的关键,流水线设计就是将组合逻辑系统地分割,并在各个部分之间插入寄存器,暂存中间数据的方法,目的是将一个大操作分解成若干小操作,各小操作并行执行,提高效率,总的来说是一种以面积换取时间的方法。
2.1转置结构的FIR滤波器
首先将滤波器结构改为direct form transposed(转置结构):
转置结构的FIR滤波器于直接型相比,最大的不同是滤波器系数的顺序是相反的,在转置形式中,输入同时到达所有乘法器,而直接型输入在不同周期到达乘法器:
将pipeline添加到直接型FIR会导致输入到输出的延迟,而转置结构不会;但转置结构同时将输入广播到所有乘法器,在输入存在大量抽头是,必须考虑输入的扇出。考虑到寄存器的数量和延迟,转置结构是首选的实现方式。
2.2编辑块属性
在编辑块属性中添加输入/输出pipeline寄存器:
将AdaptivePipelining设为on可以自动为某些运算插入pipeline寄存器:
2.3流水线设计仿真
通过减少pipeline之间的逻辑运算可以提高时钟速度。在生成HDL代码时,可以查看插入到各个模块中的寄存器,寄存器会影响模型的整体仿真效果。可以通过手动插入延迟达到这样的效果。
为滤波器、积分器和峰值提取定位模块建立一个定成子系统:
在Simulink模型中添加数据有效性检查:
size(RxSignal)
返回的是 RxSignal
的大小(即维度),然后 true(size(RxSignal))
会创建一个与 RxSignal
相同大小的逻辑数组,其中每个元素都为 true,
创建一个与 RxSignal
同样大小的逻辑掩码。
Run Pulse detector test bench (step 2),可以看到结果与黄金参考相匹配: