0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA设计的sysGen算法系统设计

电子设计 来源:CSDN 博主 作者: 没落骑士 2020-12-30 12:59 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、前言

利用FPGA设计算法一直以来都是热点,同样也是难点。将复杂的数学公式 模型通过硬件系统来搭建,在低延时 高并行性等优势背后极大提高了设计难度和开发周期。Xilinx公司的sysGen(system generator)工具扩展了MATLABsimulink,提供很多IP Catalog中没有的基础模块和针对DSP应用的硬件模型。工程师利用丰富的模块和MATLAB强大的数据处理及可视化能力能够更快速完成设计与仿真验证工作。

二、sysGen算法系统设计

本文以个最简单的例子讲述利用sysGen搭建算法IP核,并集成到IP Integrator中作为ZYNQ PS端CPU的“定制外设”。仅用于测试目的。设计需求:在sysGen中搭建系统,将输入定点整数数据*2后输出,输入位宽为8bit。

pIYBAF9uKDmAGlS-AACLMgeqkdk369.png

在System Generator token中设定仿真步长为1sec。点击需要观测的信号连线,右击选择Xilinx add to viewer。启动仿真并启动Xilinx waveform viewer:

本质上就是调用Vivado的XSim工具进行行为仿真。仿真结果可见完成预期目标,现双击System Generator token ,选择Compiliation类型为IP Catalog并勾选Create testbench,按下Generate生成IP核。

三、仿真测试

根据User Guide介绍sysGen是“周期和比特精准的”,我们还是在Vivado环境下再次验证下。netlist文件夹内子文件夹ip_catalog中为IP核示例工程,由于自动生成了testbench,打开后直接进行行为仿真。sysGen在创建testbench时会将经过gatein和gateout的数据储存到文件中,testbench进行的工作为:将gatein数据作为测试激励送入到相应设计输入端口,之后把设计输出得到结果与gateout文件数据进行逐一比较从而验证设计是否与sysGen环境下仿真结果一致。

发现个比较有意思的现象,自动生成的testbench中clock生成并约束的50MHz,而是认为进行了拓展。

仿真波形如图:

将clock处改动为50MHz后,经过测试发现如果系统一开始就输入数据,前几个数据没有被真正处理,输出错误。可能是软件BUG吧,不过这种情况也非常少见,实际系统中输入数据大多情况会启动一段时间后才输入。这里等待100ns后再启动clock翻转:

改动后仿真波形:

四、AXI-Stream总线形式IP

到此算法IP的设计与验证结束。如果想将这个IP核导入到IP Integrator中作为CPU的外设,其接口必须满足AXI总线标准,因此回到sysGen中更改端口名称和位宽。端口要符合AXI-Stream标准信号名称,位宽为8bit整数倍。

o4YBAF9uKEiAVeSPAARNJArcqqo731.png

生成IP核后,打开新的工程,导入该IP核到repository。

五、Block Design系统搭建

系统结构与上一篇该系列博文类似,均是以AXI DMA为核心的Loop系统,只是将AXI-Stream Data FIFO改成了自定义IP核。由于IP核slave和master接口只包含tdata和tvalid信号,因此需要添加接口衔接的一些简单逻辑。tready信号和tkeep信号直接连接constant使用常数驱动,DMA的s_axis_s2mm接口的tlast由wrapper内计数器逻辑驱动,将system中FCLK_CLK0 peripheral_aresetn m_axis_tvalid和s_axis_s2mm_tlast信号引出到wrapper中。

有一点比较坑:自定义IP通过AXI总线与DMA互联时,总线下相应的接口不一定会正确对应,所以需要分别将两端的每个接口相连。可以通过打开综合后的设计来确认连线无误。

自动生成wrapper后改动添加代码如下:
`timescale 1 ps / 1 ps

module user_wrapper
(DC,
DDR_addr,
DDR_ba,
DDR_cas_n,
DDR_ck_n,
DDR_ck_p,
DDR_cke,
DDR_cs_n,
DDR_dm,
DDR_dq,
DDR_dqs_n,
DDR_dqs_p,
DDR_odt,
DDR_ras_n,
DDR_reset_n,
DDR_we_n,
//FCLK_CLK0,
FIXED_IO_ddr_vrn,
FIXED_IO_ddr_vrp,
FIXED_IO_mio,
FIXED_IO_ps_clk,
FIXED_IO_ps_porb,
FIXED_IO_ps_srstb,
RES,
SCLK,
SDIN,
VBAT,
VDD
//m_axis_tvalid,
//peripheral_aresetn,
//s_axis_s2mm_tlast
);
output DC;
inout [14:0]DDR_addr;
inout [2:0]DDR_ba;
inout DDR_cas_n;
inout DDR_ck_n;
inout DDR_ck_p;
inout DDR_cke;
inout DDR_cs_n;
inout [3:0]DDR_dm;
inout [31:0]DDR_dq;
inout [3:0]DDR_dqs_n;
inout [3:0]DDR_dqs_p;
inout DDR_odt;
inout DDR_ras_n;
inout DDR_reset_n;
inout DDR_we_n;
//output FCLK_CLK0;
inout FIXED_IO_ddr_vrn;
inout FIXED_IO_ddr_vrp;
inout [53:0]FIXED_IO_mio;
inout FIXED_IO_ps_clk;
inout FIXED_IO_ps_porb;
inout FIXED_IO_ps_srstb;
output RES;
output SCLK;
output SDIN;
output VBAT;
output VDD;
//output [0:0]m_axis_tvalid;
//output [0:0]peripheral_aresetn;
//input s_axis_s2mm_tlast;

localparam DATA_NUM = 256;

wire DC;
wire [14:0]DDR_addr;
wire [2:0]DDR_ba;
wire DDR_cas_n;
wire DDR_ck_n;
wire DDR_ck_p;
wire DDR_cke;
wire DDR_cs_n;
wire [3:0]DDR_dm;
wire [31:0]DDR_dq;
wire [3:0]DDR_dqs_n;
wire [3:0]DDR_dqs_p;
wire DDR_odt;
wire DDR_ras_n;
wire DDR_reset_n;
wire DDR_we_n;
wire FCLK_CLK0;
wire FIXED_IO_ddr_vrn;
wire FIXED_IO_ddr_vrp;
wire [53:0]FIXED_IO_mio;
wire FIXED_IO_ps_clk;
wire FIXED_IO_ps_porb;
wire FIXED_IO_ps_srstb;
wire RES;
wire SCLK;
wire SDIN;
wire VBAT;
wire VDD;
wire [0:0]m_axis_tvalid;
wire [0:0]peripheral_aresetn;
wire s_axis_s2mm_tlast;

reg [8-1:0] cnt;
wire add_cnt;
wire end_cnt;

system system_i
(.DC(DC),
.DDR_addr(DDR_addr),
.DDR_ba(DDR_ba),
.DDR_cas_n(DDR_cas_n),
.DDR_ck_n(DDR_ck_n),
.DDR_ck_p(DDR_ck_p),
.DDR_cke(DDR_cke),
.DDR_cs_n(DDR_cs_n),
.DDR_dm(DDR_dm),
.DDR_dq(DDR_dq),
.DDR_dqs_n(DDR_dqs_n),
.DDR_dqs_p(DDR_dqs_p),
.DDR_odt(DDR_odt),
.DDR_ras_n(DDR_ras_n),
.DDR_reset_n(DDR_reset_n),
.DDR_we_n(DDR_we_n),
.FCLK_CLK0(FCLK_CLK0),
.FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
.FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
.FIXED_IO_mio(FIXED_IO_mio),
.FIXED_IO_ps_clk(FIXED_IO_ps_clk),
.FIXED_IO_ps_porb(FIXED_IO_ps_porb),
.FIXED_IO_ps_srstb(FIXED_IO_ps_srstb),
.RES(RES),
.SCLK(SCLK),
.SDIN(SDIN),
.VBAT(VBAT),
.VDD(VDD),
.m_axis_tvalid(m_axis_tvalid),
.peripheral_aresetn(peripheral_aresetn),
.s_axis_s2mm_tlast(s_axis_s2mm_tlast));

always @(posedge FCLK_CLK0)begin
if(!peripheral_aresetn)begin
cnt end
else if(add_cnt)begin
if(end_cnt)
cnt else
cnt end
end

assign add_cnt = m_axis_tvalid;
assign end_cnt = add_cnt && cnt== DATA_NUM-1;

assign s_axis_s2mm_tlast = end_cnt;

endmodule

user_wrapper

当自定义IP核输出256个数据时,拉高tlast信号结束传输。打开综合后的设计,添加调试探针,抓取DMA与自定义IP之间的接口信号,set up debug后完成接下来的流程。

六、软硬件联调

在硬件系统中定义数据帧长度为256个,数据位宽为16bit,因此C代码中DMA启动传输函数中数据长度参数为512byte。测试数据生成与检测代码非常简单:

我们直接查看ILA抓取AXI S总线波形:


看到CPU产生数据从1到4重复递增,IP核输出结果从2到8重复递增,输出为输入的2倍。

传输完成后进入DMA发送和接收中断,软件检测结果正确。在Memory窗口能够直接查看内存绝对地址里的数据,选定DDR接收缓存区起始地址,其中的数据与AXI总线传回数据一致,证明系统联调成功。之后任意算法模块均可采用本文方式进行设计和集成,可以说一劳永逸!

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于DSP与FPGA异构架构的高性能伺服控制系统设计

    DSP+FPGA架构在伺服控制模块中的应用,成功解决了高性能伺服系统对实时性、精度和复杂度的多重需求。通过合理的功能划分,DSP专注于复杂算法和上层控制,FPGA处理高速硬件任务,两者
    的头像 发表于 12-04 15:38 59次阅读
    基于DSP与<b class='flag-5'>FPGA</b>异构架构的高性能伺服控制<b class='flag-5'>系统</b>设计

    嵌入式与FPGA的区别

    ,一是嵌入式软件开发,主要与嵌入式cao作系统、应用软件等有关。第二是嵌入式硬件开发,需要掌握硬件设计、模拟仿真、 PCB设计等技能。 ✅2、FPGA:它是在PAL、GAL、CPLD等可编程
    发表于 11-20 07:12

    嵌入式和FPGA的区别

    FPGA凭借硬件并行处理能力,能够实现纳秒级响应,远优于微秒级的嵌入式系统。 功耗效率上,嵌入式系统针对特定应用优化后能效比很高,而FPGA由于可编程特性通常功耗较大,但在特定
    发表于 11-19 06:55

    复杂的软件算法硬件IP核的实现

    Compiler)将算法编译转化为可综合的 Verilog 文本,进而通过 FPGA 在硬件上实现算法。 1.C to Hardware 技术简介 AltiumDesigner
    发表于 10-30 07:02

    PathFinder在FPGA中的角色与缺陷

    自 1990 年代末以来,PathFinder 一直是 FPGA 布线(routing)阶段的主力算法,为设计工具提供“能连通又不重叠”的路径规划方案。
    的头像 发表于 10-15 10:44 293次阅读
    PathFinder在<b class='flag-5'>FPGA</b>中的角色与缺陷

    基于FPGA的CLAHE图像增强算法设计

    CLAHE图像增强算法又称为对比度有限的自适应直方图均衡算法,其算法原理是通过有限的调整图像局部对比度来增强有效信号和抑制噪声信号。
    的头像 发表于 10-15 10:14 384次阅读
    基于<b class='flag-5'>FPGA</b>的CLAHE图像增强<b class='flag-5'>算法</b>设计

    25年11月上海FPGA算法实现与应用技术高级研修分享

    设计仿真能力。   深入学习数据流,不仅是算法FPGA&DSP设计者的需求,对于从事接口设计工作、软件配置工作、系统测试工作,项目管理工作的同事,也同样有非常重要的意义。在实际工作中,对于
    发表于 10-11 11:55

    基于FPGA实现FOC算法之PWM模块设计

    哈喽,大家好,从今天开始正式带领大家从零到一,在FPGA平台上实现FOC算法,整个算法的框架如下图所示,如果大家对算法的原理不是特别清楚的话,可以先去百度上学习一下,本教程着重介绍实现
    的头像 发表于 07-17 15:21 3120次阅读
    基于<b class='flag-5'>FPGA</b>实现FOC<b class='flag-5'>算法</b>之PWM模块设计

    基于Matlab与FPGA的双边滤波算法实现

    前面发过中值、均值、高斯滤波的文章,这些只考虑了位置,并没有考虑相似度。那么双边滤波来了,既考虑了位置,有考虑了相似度,对边缘的保持比前几个好很多,当然实现上也是复杂很多。本文将从原理入手,采用Matlab与FPGA设计实现双边滤波算法
    的头像 发表于 07-10 11:28 4073次阅读
    基于Matlab与<b class='flag-5'>FPGA</b>的双边滤波<b class='flag-5'>算法</b>实现

    基于FPGA的压缩算法加速实现

    本设计中,计划实现对文件的压缩及解压,同时优化压缩中所涉及的信号处理和计算密集型功能,实现对其的加速处理。本设计的最终目标是证明在充分并行化的硬件体系结构 FPGA 上实现该算法时,可以大大提高该算法
    的头像 发表于 07-10 11:09 2073次阅读
    基于<b class='flag-5'>FPGA</b>的压缩<b class='flag-5'>算法</b>加速实现

    自动兵力生成算法系统有哪些

    行业芯事行业资讯
    北京华盛恒辉科技
    发布于 :2025年06月11日 11:16:12

    进群免费领FPGA学习资料!数字信号处理、傅里叶变换与FPGA开发等

    ~ 01、数字信号处理的FPGA实现 旨在讲解前端数字信号处理算法的高效实现。首先概述了当前的FPGA技术、器件以及用于设计最先进DSP系统的工具。阐述了计算机
    发表于 04-07 16:41

    FPGA开发任务

    我想请人帮我开发一款基于FPGA的产品,把我写好MATLAB代码固化在FPGA中,实现算法加速和加密功能。有兴趣的联系我
    发表于 03-15 10:19

    当我问DeepSeek AI爆发时代的FPGA是否重要?答案是......

    的安全性。例如,在数据溯源系统中,FPGA可以实时标记和加密数据,确保数据的完整性和可靠性。 • 适应未来加密需求:随着量子计算的发展,传统的加密算法面临威胁。FPGA的灵活性使其能够
    发表于 02-19 13:55

    FPGA的多通道数据采集传输系统

    一、系统总体方案设计 为了满足油田增压站对数据采集的需求,我们设计了一套基于FPGA的多通道数据采集与传输系统系统FPGA作为主控制器,
    的头像 发表于 12-09 10:45 1199次阅读
    <b class='flag-5'>FPGA</b>的多通道数据采集传输<b class='flag-5'>系统</b>