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

2024-05-29 17:44

本文主要是介绍从零开始利用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 信号进行监控。

运行仿真查看结果:

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

这篇关于从零开始利用MATLAB进行FPGA设计(六)用ADC采集信号教程1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014212

相关文章

在线装修管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修队管理,用户管理,装修管理,基础数据管理,论坛管理 前台账户功能包括:系统首页,个人中心,公告信息,论坛,装修,装修队 开发系统:Windows 架构模式:B/S JDK版本:Java JDK1.8 开发工具:IDEA(推荐) 数据库版本: mysql5.7 数据库可视化工具: navicat 服务器:SpringBoot自带 ap

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

比较学习难度:Adobe Illustrator、Photoshop和新兴在线设计平台

从入门设计开始,几乎没有人不知道 Adobe 公司两大设计软件:Adobe Illustrator和 Photoshop。虽然AI和PS很有名,有一定设计经验的设计师可以在早期探索和使用后大致了解AI和PS的区别,但似乎很少有人会系统地比较AI和PS。目前,设计软件功能多样,轻量级和网页设计软件已成为许多设计师的需求。对于初学者来说,一篇有针对性的AI和PS比较总结文章具有非常重要的指导意义。毕竟

X-AnyLabeling使用教程

1.AI 模型自动分割标注使用教程 2.AI 模型自动目标检测标注使用教程