从零开始利用MATLAB进行FPGA设计(六)用ADC采集信号教程1

黑金的教程做的实在太拉闸了,于是自己摸索信号采集模块的使用方法。

ADC模块:AN9238

FPGA开发板:AX7020;Xilinx 公司的 Zynq7000 系列的芯片XC7Z020-2CLG400I,400引脚 FBGA 封装。

往期回顾:

从零开始利用MATLAB进行FPGA设计(五)详解双口RAM从零开始利用MATLAB进行FPGA设计(四)生成优化HDL代码

目录

1.顶层模块设计

顶层模块接口

时钟生成

AD采样模块

FIFO缓冲区

ILA实例化

2.PLL

IP核设置

IP实例化

3.FIFO

4.ILA

5.testbench仿真


1.顶层模块设计

信号采集程序的顶层模块主要包括时钟生成、AD采样、FIFO缓冲区管理和逻辑分析仪ILA四个部分。通过PLL生成两个时钟信号,通过AD模块将模拟信号转为数字信号,通过FIFO缓冲区对采样数据进行缓存,最后通过FIFO缓冲区对采样数据进行缓存。

顶层模块接口

module top(input clk50m, // 系统时钟input reset_n,output wire [0:0] clk65m_1, // FPGA输出的时钟信号1,作为AD模块的输入时钟1output wire [0:0] clk70m_1, // FPGA输出的时钟信号2,作为AD模块的输入时钟2input wire [11:0] ad1_in,   // 离散数据输入到FPGAinput wire [11:0] ad2_in    
);

这个模块有以下输入和输出端口:

  • clk50m: 50MHz系统时钟输入。

  • reset_n: 复位信号,低电平有效。

  • clk65m_1clk70m_1: 由FPGA输出的两个时钟信号,分别用于AD模块的输入时钟。

  • ad1_inad2_in: 12位宽的模拟数据输入信号。

时钟生成

wire clk65m; 
wire clk70m;
assign clk65m_1 = clk65m;
assign clk70m_1 = clk70m;pll pll_inst (// Clock out ports.clk_out1(clk65m),        // output clk_out1.clk_out2(clk70m),        // output clk_out2// Status and control signals.reset(~reset_n),         // input reset.locked(),                // output locked// Clock in ports.clk_in1(clk50m)          // input clk_in1
);

通过PLL模块生成两个时钟信号 clk65mclk70m,并将它们分别分配给 clk65m_1clk70m_1

AD采样模块

wire [11:0] ad_ch1;
wire [11:0] ad_ch2;v_ad v_ad_inst (.ad1_clk(clk65m_1),  // 65M.ad2_clk(clk65m_1),  // 65M.ad1_in(ad1_in),     // 模拟数据输入到AD模块.ad2_in(ad2_in),.ad_ch1(ad_ch1),     // AD模块输出数字数据.ad_ch2(ad_ch2)
);

这个模块实例化了一个名为 v_ad 的AD采样模块,将两个模拟输入信号 ad1_inad2_in 转换为数字信号 ad_ch1ad_ch2

FIFO缓冲区

wire wr_en = 1;       // 写使能
wire rd_en = 1;       // 读使能
wire [11:0] dout;     // 读数据
wire full;            // 写满信号
wire empty;           // 读空信号
wire [9:0] rd_data_count; // 可读数据数量
wire [9:0] wr_data_count; // 已写入的数据数量fifo_generator_0 fifo_wr_inst (.rst(~reset_n),                  // input wire rst.wr_clk(clk65m),                 // input wire wr_clk.rd_clk(clk70m),                 // input wire rd_clk.din(ad1_in),                    // input wire [11:0] din.wr_en(wr_en),                   // input wire wr_en.rd_en(rd_en),                   // input wire rd_en.dout(dout),                     // output wire [11:0] dout.full(full),                     // output wire full.empty(empty),                   // output wire empty.rd_data_count(rd_data_count),   // output wire [9:0] rd_data_count.wr_data_count(wr_data_count)    // output wire [9:0] wr_data_count
);

例化了一个FIFO缓冲区,用于缓存AD采样的数据。FIFO的写时钟是 clk65m,读时钟是 clk70m

ILA实例化

ila_0 ila_0_inst (.clk(clk50m),            // input wire clk.probe0(ad1_in),         // input wire [11:0]  probe0.probe1(ad2_in),         // input wire [11:0]  probe1.probe2(ad_ch1),         // input wire [11:0]  probe2.probe3(ad_ch2),         // input wire [11:0]  probe3.probe4(ad1_in),         // input wire [11:0]  probe4.probe5(dout),           // input wire [11:0]  probe5.probe6(rd_data_count),  // input wire [9:0]   probe6.probe7(wr_data_count),  // input wire [9:0]   probe7.probe8(clk65m),         // input wire [0:0]   probe8.probe9(clk70m)          // input wire [0:0]   probe9
);

接下来对各个模块进行具体分析:

2.PLL

IP核设置

PLL锁相环,是FPGA中的重要资源。一个复杂的FPGA系统往往需要多个不同频率、相位的时钟信号。7 系列的 FPGA 使用了专用的全局(Global)和区域(Regional)IO 和时钟资源来管理设计中各种时钟需求。Clock Management Tiles(CMT)提供了时钟合成(Clock frequency synthesis),倾斜矫正 (deskew),过滤抖动(jitter filtering)功能。

每个CMTs包含一个MMCM(混合模式始终管理器)和一个PLL,输出需要接到BUFG(全局时钟缓存)或者BUFH(水平时钟缓存器)后使用。

PLL主要用于频率综合,使用一个PLL从一个输入时钟信号生成多个时钟信号。

在Project Manager下选择IP catalog,搜索Clocking后选择Clocking Wizard,进行配置如下:

PLL的输入信号必须来自于普通单端时钟信号!否则在进行编译过程中会出现报错:

报错:[DRC REQP-1712] Input clock driver: Unsupported PLLE2_ADV connectivity. The signal pll_inst/inst/clk_in1 on the pll_inst/inst/plle2_adv_inst/CLKIN1 pin of pll_inst/inst/plle2_adv_inst with COMPENSATION mode ZHOLD must be driven by a clock capable IO.

PLLclk_in1source参数修改为Global buffer即可。

各引脚定义与顶层模块中保持一致。

IP实例化

IP Sources界面找到pll.veo文件,文件中是IP的例化模板。

3.FIFO

FIFO:First in, First out代表先进的数据先出,后进的数据后出。FIFO本质上是一种RAM,增加了许多功能,但没有地址线,不能进行随即地址读写(但在FIFO内部还是有地址操作)。

可以把 FIFO 想象成一个水池,写通道即为加水,读通道即为放水,假如不间断的加水和放水,如果加水速度比放水速度快,那么 FIFO 就会有满的时候,如果满了还继续加水就会溢出 overflow,如果放水速度比加水速度快,那么 FIFO 就会有空的时候。

根据读写时钟,可以分为同步 FIFO(读写时钟相同)和异步 FIFO(读写时钟不同)。本例采用异步 FIFO的控制,其中读时钟为65MHz,写时钟为70MHz。

FIFO配置如下所示:

在时钟与及资源类型中选择independent(读写不同)。

读模式中:

  • standard mode:仅在执行读操作时从FIFO获取数据
  • first word fall through:在不执行读操作时提前从FIFO获取下一个数据,当数据在FIFO中可用时第一个数据自动出现在总线上

4.ILA

ILA是vivado内嵌的在线调试逻辑分析仪。

probe的数量取决于要采样的信号,Sample Data Depth 指的是采样深度,设置的越高,采集的信号越多,同样消耗的资源也会越多。

probe的宽度取决于采集信号的宽度。

5.testbench仿真

编写仿真程序:

module tb_top;// Input signalsreg clk50m;reg reset_n;reg [11:0] ad1_in;reg [11:0] ad2_in;// Signals to connect with DUT (Device Under Test)wire [0:0] clk65m_1;wire [0:0] clk70m_1;wire [11:0] ad_ch1;wire [11:0] ad_ch2;wire [11:0] dout;// Instantiate the top moduletop top_inst(.clk50m(clk50m),.reset_n(reset_n),.clk65m_1(clk65m_1),.clk70m_1(clk70m_1),.ad1_in(ad1_in),.ad2_in(ad2_in));// Simulate input signalsinitial begin// Initialize inputsclk50m = 0;reset_n = 0;ad1_in = 12'd0;ad2_in = 12'd0;// Apply reset#1000;reset_n = 1;end// Generate clock signalalways #10 clk50m = ~clk50m;// Generate 1kHz triangle wave for ad1_inreg [31:0] counter = 0;always @(posedge clk50m or negedge reset_n) beginif (!reset_n) beginad1_in <= 12'd0;counter <= 32'd0;end else beginif (counter < 1000) beginad1_in <= ad1_in + (12'd1);end else if (counter < 2000) beginad1_in <= ad1_in - (12'd1);end else begincounter <= 32'd0;endcounter <= counter + 1;endend// Simulate ad2_in as a simple ramp signal for varietyalways @(posedge clk50m or negedge reset_n) beginif (!reset_n) beginad2_in <= 12'd0;end else beginad2_in <= ad2_in + 12'd2;endend// Extract fifo_din and fifo_dout from internal signalswire [11:0] fifo_din = ad1_in; // Connecting directly to ad1_in for monitoringwire [11:0] fifo_dout = top_inst.fifo_wr_inst.dout; // Accessing the internal signal dout// Monitor fifo signalsinitial begin$monitor("At time %t, fifo_din = %d, fifo_dout = %d", $time, fifo_din, fifo_dout);endendmodule

仿真的核心在于通过计数器counter控制生成1kHz的信号,分成上升沿和下降沿两个部分,每个部分500us。

通过 $monitor 系统任务,实时显示 fifo_dinfifo_dout 信号的值。

fifo_din 直接连接到 ad1_infifo_dout 通过实例化顶层模块并访问 fifo_wr_instdout 信号进行监控。

运行仿真查看结果:

如果希望看到模拟信号则需要更改信号类型:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/844653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试驱动编程(4)模拟消除依赖

文章目录 测试驱动编程(4)模拟消除依赖模拟框架Mockito什么要模拟名词解释Mockito常用注解Mockito常用静态方法Mockito测试流程三部曲基础用法可变返回结果验证verfily对象监视spy 示例实战升级版井字游戏需求一需求二需求三 总结 测试驱动编程(4)模拟消除依赖 模拟框架Mockit…

YOLOv8架构详解

&#x1f4cc;YOLOv8架构详解 YOLOv8 架构图YOLOv8 Backbone部分YOLOv8 Head部分Neck和Head结构 在视觉深度学习中&#xff0c;通常将模型分为 2~3 个组成部分&#xff1a;backbone、neck&#xff08;可选&#xff09; 和 head。 Backbone&#xff08;主干网络&#xff09;负责…

NTLite深度Windows系统镜像文件修改定制

计算机爱好者和技术宅的圈子里,NTLite是一个广受欢迎的名字,一款强大的Windows系统定制工具,允许用户对Windows安装镜像进行深度修改,从而打造出一个更加个性化、高效且精简的操作系统。无论是为了优化系统性能、移除不必要的组件,还是集成最新的更新和驱动,NTLite都能成…

java后端框架-MyBatis

一、概述 1、起源 MyBatis本是Apache下的开源项目&#xff0c;名为iBatis,2010年转投谷歌,从iBatis3.x开始更名为MyBatis 2、优点 (1)优秀的数据持久层框架&#xff08;对jdbc做了轻量级封装&#xff09; 3、特点 (1)对jdbc中接口进行封装的同时还提供了一些自己的类实现…

samba_ubuntu_share_vmbox_vmware

_____ Ubuntu 利用 samba 与 win 直接共享文件夹 _____ samba Samba - 维基百科&#xff0c;自由的百科全书 (wikipedia.org) 用于 win 和 unix 直接访问资源 samba 为选定的 unix 目录建立网络共享&#xff0c; 使得 win 用户可以像访问普通 win 下的文件夹那样来通过网络来…

npm : 无法加载文件 D:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本

安装npm时出现如下提示&#xff1a; 出现这个错误信息&#xff0c;是系统禁止执行PowerShell的脚本。 出现的原因是&#xff0c;系统默认的执行策略是Restricted&#xff08;默认设置&#xff09;&#xff0c;限制执行&#xff0c;所以会出现如上提示。 解决方法&#xff1a;…

Linux服务器配置ssh证书登录

1、ssh证书登录介绍 Linux服务器ssh登录有密码登录和证书登录两种。如果使用密码登录&#xff0c;容易遭受密码泄露或者暴力破解&#xff0c;我们可以使用ssh证书登录并禁止使用密码登录&#xff0c;ssh证书登录通过公钥和私钥来完成整个连接过程&#xff0c;公钥保存在服务器…

高维数组到向量的转换:两种方法的深度解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;高维数组的挑战与需求 二、方法一&#xff1a;使用NumPy库进行展平 示…

如何将md文件精确的转换成docx文件

如何将md文件转换成docx&#xff1f; 文章目录 如何将md文件转换成docx&#xff1f;一、如何将MD文件比较完美的转换成word呢&#xff1f;二、方法3 步骤1、下载一个可用的MarkDown编辑器2、下载Pandoc安装 三、来进行转化了 一、如何将MD文件比较完美的转换成word呢&#xff1…

从零开始学Vue3--根据目录结构自动生成路由

我们在测试或者小项目中经常遇到一个问题&#xff0c;就是加一个页面&#xff0c;就要在router.js中加一个路由&#xff0c;相当的麻烦&#xff0c;有没有办法可以根据目录结构自动生成路由呢&#xff1f; 想要自动生成路由&#xff0c;最重要的是能够获取指定目录下vue的路径…

开源代码分享(31)-计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

参考文献&#xff1a; [1]孙惠娟,刘昀,彭春华,等.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度[J].电网技术,2021,45(09):3534-3545.DOI:10.13335/j.1000-3673.pst.2020.1720. 1.摘要 为了促进多能源互补及能源低碳化&#xff0c;提出了计及电转气协同的含碳捕集与垃…

canfd与can2.0关系

canfd是can2.0的升级版&#xff0c; 支持canfd的设备就支持can2.0&#xff0c;但can2.0的设备不支持canfd 参考 是选CAN接口卡还是CANFD接口卡_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Hh411K7Zn/?spm_id_from333.999.0.0 哪些STM32有CANFD外设 STM32G0, STM…

使用OrangePi KunPeng Pro部署AI模型

目录 一、OrangePi Kunpeng Pro简介二、环境搭建三、模型运行环境搭建(1)下载Ollama用于启动并运行大型语言模型(2)配置ollama系统服务(3)启动ollama服务(4)启动ollama(5)查看ollama运行状态四、模型部署(1)部署1.8b的qwen(2)部署2b的gemma(3)部署3.8的phi3(4)部署4b的qwen(5)部…

工作中有哪些超级好用的C/C++程序库?

视频和讲义发布在这里&#xff1a; B站链接

Android Ktor 网络请求框架

Ktor 是一个由 JetBrains 开发的用于 Kotlin 编程语言的应用框架&#xff0c;旨在创建高性能的异步服务器和客户端应用程序。由于完全基于 Kotlin 语言&#xff0c;Ktor 能够让开发者编写出简洁、可读性强且功能强大的代码&#xff0c;特别适合那些已经熟悉 Kotlin 的开发人员。…

调试记录-U盘枚举失败之LPM影响

现象 板子接部分U盘出现枚举失败&#xff0c;看log像是硬件信号问题&#xff0c;如&#xff1a; [ 29.186464] usb usb3-port1: Cannot enable. Maybe the USB cable is bad? [ 30.079624] usb usb3-port1: Cannot enable. Maybe the USB cable is bad? [ 30.080200]…

【高校科研前沿】南科大姜丽光课题组在地球物理学领域TOP期刊Geophys. Res. Lett.发表极端气候频发下水库蓄水状态的相关研究成果

文章简介 论文名称&#xff1a;Reservoir Filling Up Problems in a Changing Climate:Insights From CryoSat‐2 Altimetry 第一作者及单位&#xff1a;汪志伟&#xff08;硕士研究生 南方科技大学环境学院&#xff09; 通讯作者及单位&#xff1a;姜丽光&#xff08;助理教…

JAVA:多线程常见的面试题和答案

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、并发编程三要素&#xff1f; 原 子 性 原子性指的是一个或者多个操作&#xff0c;要么全部执行并且在执行的过程中不被其他操作打断&#xff0c;要么就全部都不执行。可 见 性 可见性指多…

电脑录屏怎么录?7个电脑录屏软件免费版强势来袭,赶快收藏!

电脑录屏怎么录&#xff1f;相信很多小伙伴们都不知道怎么在Windows电脑上录屏吧&#xff1f;在当今社会&#xff0c;随着互联网的快速发展&#xff0c;越来越多的小伙伴们开始通过制作视频内容来分享知识、展示技能或者记录生活。电脑录屏成为了一种简单高效的方式&#xff0c…

MarkDown语法使用手册

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…