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

news2024/11/16 23:47:56

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

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模块的输入时钟1
    output wire [0:0] clk70m_1, // FPGA输出的时钟信号2,作为AD模块的输入时钟2
                     
    input wire [11:0] ad1_in,   // 离散数据输入到FPGA
    input 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 signals
    reg 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 module
    top 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 signals
    initial begin
        // Initialize inputs
        clk50m = 0;
        reset_n = 0;
        ad1_in = 12'd0;
        ad2_in = 12'd0;
        
        // Apply reset
        #1000;
        reset_n = 1;
    end
    
    // Generate clock signal
    always #10 clk50m = ~clk50m;

    // Generate 1kHz triangle wave for ad1_in
    reg [31:0] counter = 0;
    always @(posedge clk50m or negedge reset_n) begin
        if (!reset_n) begin
            ad1_in <= 12'd0;
            counter <= 32'd0;
        end else begin
            if (counter < 1000) begin
                ad1_in <= ad1_in + (12'd1);
            end else if (counter < 2000) begin
                ad1_in <= ad1_in - (12'd1);
            end else begin
                counter <= 32'd0;
            end
            counter <= counter + 1;
        end
    end

    // Simulate ad2_in as a simple ramp signal for variety
    always @(posedge clk50m or negedge reset_n) begin
        if (!reset_n) begin
            ad2_in <= 12'd0;
        end else begin
            ad2_in <= ad2_in + 12'd2;
        end
    end

    // Extract fifo_din and fifo_dout from internal signals
    wire [11:0] fifo_din = ad1_in; // Connecting directly to ad1_in for monitoring
    wire [11:0] fifo_dout = top_inst.fifo_wr_inst.dout; // Accessing the internal signal dout

    // Monitor fifo signals
    initial begin
        $monitor("At time %t, fifo_din = %d, fifo_dout = %d", $time, fifo_din, fifo_dout);
    end

endmodule

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

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

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

运行仿真查看结果:

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

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

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

相关文章

Vue项目运行页面禁止缩放【移动端和PC端都禁止缩放】解决方案

Vue项目运行页面禁止缩放【移动端和PC端都禁止缩放】解决方案&#xff0c;有的人手很J,总喜欢放大缩小&#xff0c;从而会导致页面错乱&#xff0c;以下是解决方案&#xff0c;简单有效 效果图PC&#xff1a;滚轮缩放和其他缩放都会禁止 移动端效果图&#xff1a;各种手机平板…

Python数据处理,使用 tkinter 模块点击获取文件目录

Python数据处理&#xff0c;使用 tkinter 模块点击获取文件目录 正文 正文 当我们进行数据处理读取文件内数据的时候&#xff0c;通常&#xff0c;我们需要设定好一个存放当前文件所在目录的变量。比如如下目录&#xff1a; file_path rC:\Users\xxx\Desktop\DataSet\Data.c…

20240528解决飞凌的OK3588-C的核心板的TYPE-C1接口识别问题

20240528解决飞凌的OK3588-C的核心板的TYPE-C1接口识别问题 2024/5/28 16:46 缘起&#xff1a; 现阶段碰到的USB相关的问题&#xff1a;&#xff08;LINUX R4版本&#xff09; 1、USB3.0插USB摄像头 lsusb找不到设备 2、刷机口只接了3根线&#xff0c;GND/D/D-&#xff0c;可以…

vue3 + ts 实现IP地址及Mac地址输入框功能

1、组件完成代码 <template><div class"ip-input"><div v-for"(item, index) in ipArr" :key"index" class"ip-input__item-wrap"><input ref"ipInput" v-model"ipArr[index]" type"t…

Python装饰器的应用

Python 中的装饰器是一种语法糖&#xff0c;可以在运行时&#xff0c;动态的给函数或类添加功能。装饰器本质上是一个函数&#xff0c;使用 函数名就是可实现绑定给函数的第二个功能 。它的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能。 …

清华大学提出IFT对齐算法,打破SFT与RLHF局限性

监督微调&#xff08;Supervised Fine-Tuning, SFT&#xff09;和基于人类反馈的强化学习&#xff08;Reinforcement Learning from Human Feedback, RLHF&#xff09;是预训练后提升语言模型能力的两大基础流程&#xff0c;其目标是使模型更贴近人类的偏好和需求。 考虑到监督…

奥利奥罚单背后的启示:企业合规与反垄断的边界

在全球化的经济环境中&#xff0c;企业面临着激烈的市场竞争。为了在竞争中脱颖而出&#xff0c;一些企业可能会采取不正当的竞争手段&#xff0c;如垄断、价格歧视等。然而&#xff0c;这些行为往往会触犯反垄断法规&#xff0c;给企业带来严重的法律风险。最近&#xff0c;奥…

jsp音乐网站的设计与实现

需求收集 经过与客户探讨后 得到初步的活动图,此活动图叙述了游客、会员、管理员在网站的活动得到初步的类图得到网站功能包图得到用例图 ●活动图 ●初步的类图 注&#xff1a;为得到良好的安全性&#xff0c;登入管理员的时候&#xff0c;应该再输入管理员密码.所以在admin…

AI联想扩图解决方案,智能联想,无需人工干预

对于众多企业而言&#xff0c;无论是广告宣传、产品展示还是客户体验&#xff0c;高质量、宽广视野的图像都是不可或缺的。受限于车载摄像头等设备的物理限制&#xff0c;我们往往难以捕捉到完整、宽广的视觉场景。针对这一挑战&#xff0c;美摄科技凭借其前沿的AI联想扩图解决…

Vue3实战笔记(50)—Vue 3+ECharts还能看股票?附源码

文章目录 前言一、改进之前的封装echarts组件二、封装股票k线图总结 前言 今天封装股票k线图组件 前几天学的几个知识点都有用到&#xff0c;都是在封装k线图的时候遇到的问题&#xff0c;又啃了一遍基础。 一、改进之前的封装echarts组件 使用ref对象方式封装useEChartsRef.t…

git 学习随笔

git 学习随笔 基本概念 git 对待数据类似快照流的形式而不是类似 cvs 那样的纪录文件随时间逐步积累的差异 git 中所有数据在存储钱都会计算校验和&#xff08;hash) 三种状态&#xff1a;已提交(committed)&#xff0c;已修改(modified)&#xff0c;已暂存(staged)。 add…

计算机图形学入门03:二维变换

变换(Transformation)可分为模型(Model)变换和视图(Viewing)变换。在3D虚拟场景中相机的移动和旋转&#xff0c;角色人物动画都需要变换&#xff0c;用来描述物体运动。将三维世界投影变换到2D屏幕上成像出来&#xff0c;也需要变换。 1.缩放变换 缩放(Scale)变换&#xff1a; …

电脑提示:“找不到vcruntime140_1.dll无法执行”该怎么恢复?一键修复vcruntime140_1.dll丢失

vcruntime140_1.dll是一个关键的系统文件&#xff0c;它在电脑运行过程中被调用。如果该文件丢失或找不到&#xff0c;将会导致弹出"找不到vcruntime140_1.dll无法执行"的错误提示。缺失vcruntime140_1.dll文件将导致软件或游戏无法正常打开或运行。 一键修复vcrunti…

沃飞长空总部落地成都高新,为蓉低空经济发展助力!

5月25日&#xff0c;吉利科技集团与成都高新区签署合作协议&#xff0c;吉利科技集团旗下沃飞长空全球总部落地成都高新区。 根据协议&#xff0c;沃飞长空全球总部项目落地成都未来科技城&#xff0c;将布局总部办公、研发和生产制造低空出行航空器等业务。双方将积极发挥各自…

微信图片识别文字怎么弄?介绍三个识别方法

微信图片识别文字怎么弄&#xff1f;在信息爆炸的时代&#xff0c;我们每天都会接触到大量的图片信息&#xff0c;其中包含的文字内容往往是我们获取信息的重要途径。然而&#xff0c;手动输入图片中的文字既费时又费力&#xff0c;这时&#xff0c;一款能够准确识别微信图片中…

量化交易入门:如何在QMT中配置Python环境,安装第三方依赖包

哈喽,大家好,我是木头左! 引言 QMT,作为量化交易系统中的佼佼者,以其强大的功能和灵活的操作性,受到了广大投资者的青睐。但是,对于很多新手来说,如何在QMT中配置Python环境,安装第三方依赖包,却是一个让人头疼的问题。本文将从零开始,手把手教你如何在QMT中配置Py…

【NumPy】全面解析subtract函数:高效数组减法指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

游戏联运平台如何助力游戏行业飞速发展?

随着科技的进步和互联网的普及&#xff0c;游戏行业正以前所未有的速度飞速发展。在这个过程中&#xff0c;游戏联运平台凭借其独特的优势和功能&#xff0c;成为了推动游戏行业腾飞的关键力量。本文将探讨游戏联运平台如何助力游戏行业实现飞速发展。 一、游戏联运平台的定义与…

idea工具配置隐藏文件及文件夹

目录 引言配置步骤实例 引言 我们在使用idea工具编写代码的时候&#xff0c;有些文件和文件夹我们至始至终都不会查看和修改它们&#xff0c;那它们显示在那里就没有任何意义&#xff0c;反而使得项目文件看起来杂乱&#xff0c;一点也不够清爽。这些对我们写代码没有任何作用…

深入了解多维数组索引:以二维数组为例

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、二维数组的基础概念与重要性 二、二维数组的索引访问 1. 索引访问的基本方法 2. 切片…