从零开始利用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模块的输入时钟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 信号进行监控。

运行仿真查看结果:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发【实现页面路由跳转】接上一个微博页面

给顶部最左边的日历图标设置点击事件实现页面跳转 需要展示页面内容示例图&#xff1a; 6.1.1.设置页面头部内容 新建一个页面命名为MydailyPage &#xff0c;给整个页面设置背景属性 代码如下&#xff1a; Entry Componentstruct MydailyPage { build() { Column() { …

AI生成四季变化解决方案,四季之美,一图尽揽

随着AI技术已经渗透到我们生活的方方面面&#xff0c;在这个充满变化的时代&#xff0c;美摄科技以其前沿的AI生成技术&#xff0c;为企业带来了全新的视觉体验——AI生成四季变化解决方案。这一方案不仅能够让车辆实拍的照片焕发不同季节的风采&#xff0c;更能在不改变原图构…

SheetJS V0.17.5 导入 Excel 异常修复 Invalid HTML:could not find<table>

导入 Excel 提示错误&#xff1a;Invalid HTML:could not find<table> 检查源代码 发现 table 属性有回车符 Overview: https://docs.sheetjs.com/docs/ Source: https://git.sheetjs.com/sheetjs/sheetjs/issues The public-facing websites of SheetJS: sheetjs.com…

电脑msvcp140_atomic_wait.dll丢失的高效率解决方法,快速的一键修复

我们常常遇到各种不可预见的电脑故障问题&#xff0c;msvcp140_atomic_wait.dll丢失是一个常见的系统错误&#xff0c;它通常发生在Windows操作系统中&#xff0c;特别是当用户尝试运行依赖于Microsoft Visual C Redistributable的应用程序时。该问题可能导致程序崩溃或无法启动…

【C language】判断一个正整数是否是2^n

题解&#xff1a;判断一个正整数是否是2^n(位运算方法) 1.题目 判断一个正整数是否是2^n 2.位运算法 思路&#xff1a;干掉二进制最右边的1&#xff0c;看是否是0 int main() {int num 16;if ((num & (num - 1)) 0) printf("the num is a 2^n");else print…

老师如何对付挑事儿的家长?

身为老师&#xff0c;你有没有遇到过这样的家长&#xff1a;孩子在学校里闹点小矛盾&#xff0c;或者作业分数有点争议&#xff0c;他们就气势汹汹地来找你&#xff0c;说你偏心&#xff0c;甚至在其他家长面前说三道四&#xff1f;面对这种爱“挑事”的家长&#xff0c;老师们…

Axure RP软件汉化操作步骤

随着互联网产业的发展&#xff0c;设计师已经成为一个越来越受欢迎的职业&#xff0c;设计软件已经成为设计师必不可少的工具。说到设计软件&#xff0c;不得不说的是 Axure rp &#xff0c;越来越多的设计师使用它来设计产品原型&#xff0c;作为美国 Axure Software Solution…

2.10 mysql设置远程访问权限

2.10 mysql设置远程访问权限 目录1. 管理员运行mysql命令窗口2. 使用 root 用户重新登录 MySQL3. 修改用户权限4. 修改mysql安装目录下的my.ini 目录 说明&#xff1a; Mysql8.0 设置远程访问权限 一、Mysql8.0 设置远程访问权限 1. 管理员运行mysql命令窗口 2. 使用 root 用…

数据库学习笔记1-数据库实验1

文章目录 创建表格的时候出现的一些错误查询所有的表格实验一查询单个表格分块修改大学数据库表格创建大学数据库表格系课程教师课程段授课学生选课注意吐槽 修改大学数据库表格2&#xff08;英文版本&#xff09;abcde 自建项目-在线书店数据库 创建表格的时候出现的一些错误 …

如何在.htaccess文件创建一个自定义404页面

本周有一个客户&#xff0c;购买Hostease的虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何在.htaccess文件创建一个自定义404页面&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可…

uni-app解决表格uni-table样式问题

一、如何让表格文字只显示一行&#xff0c;超出部分用省略号表示 步骤 &#xff1a; 给table设置table-layout:fixed; 列宽由表格宽度和列宽度设定。&#xff08;默认是由单元格内容设定&#xff09;让表格元素继承父元素宽度固定table-layout: inherit;overflow: hidden;超过…

大模型对齐方法笔记二:基于Rank的对齐方法RRHF和PRO

文章目录 RRHFPRO将RLHF嫁接到PRO 参考资料 RRHF RRHF(Rank Responses to align Human Feedback)出自2023年4月的论文《RRHF: Rank Responses to Align Language Models with Human Feedback without tears》&#xff0c;是较早提出的不需要使用PPO来对齐人类偏好的方法。 设…

Linux网络编程: udp,tcp协议原理

Linux网络编程: udp,tcp协议原理 一.udp和tcp的介绍1.udp介绍1.udp的特点2.udp的适用场景3.udp效率分析 2.tcp介绍1.tcp的特点2.tcp的适用场景 二.udp协议原理1.udp协议段格式2.udp的缓冲区和全双工通信 三.tcp协议段1.tcp协议段格式2.发送接收缓冲区3.确认应答ACK机制,窗口大小…

解决Android studio 一直提示下载gradle-xxx-all.zip问题

今天用AndroidStdiod打开一个新工程的时候&#xff0c;发现项目一直卡在正在下载gradle-xxx-all.zip的任务上&#xff0c;网络出奇的慢&#xff0c;即使配了VPN也无济于事&#xff0c;于是按照以往经验&#xff1a;将gradle-xxx-all.zip下载到.gradle\gradle\wrapper\dists目录…

oracle数据回显时候递归实战

太简单的两篇递归循环 orcale 在项目里递归循环实战 先看资产表T_ATOM_ASSET结构 看业务类别表T_ATOM_BUSI_CATEGORY结构 问题出现 页面显示 实际对应的归属业务分类 涉及到oracle递归实战(这里不会如何直接在atomAsset的seelct里面处理递归回显) 直接在实现层看atomAs…

conda修改环境名称后,无法安装包,显示no such file

1问题描述 原本创建环境时设置的名字不太合适&#xff0c;但是因为重新创建环境很麻烦&#xff0c;安装很多包。。所以想直接对包名进行修改&#xff0c;本人采用的方式是直接找到conda环境的文件目录&#xff0c;然后修改文件名&#xff0c;简单粗暴。确实修改成功了&#xf…

外卖系统开发的技术栈和架构设计

开发一个功能完备且高效的外卖系统&#xff0c;需要选择合适的技术栈并设计良好的系统架构。本文将详细介绍外卖系统开发过程中常用的技术栈以及架构设计的关键要点&#xff0c;帮助开发者构建一个高性能、可扩展且易维护的外卖平台。 1. 技术栈选择 选择合适的技术栈是开发…

京东二面:为什么Netty要造FastThreadLocal?

FastThreadLocal 从字面意义上来看&#xff0c;它是“Fast”“ThreadLocal”的结合体&#xff0c;寓意为快速的 ThreadLocal。那么&#xff0c;问题来了&#xff0c;Netty 为什么要再造一个 FastThreadLocal&#xff1f;FastThreadLocal 运行快的原因是啥&#xff1f;除了快之外…

colmap在windows上编译好的程序直接可以运行支持cuda

1.colamp简介 COLMAP 是一种通用的运动结构 (SfM) 和多视图立体 (MVS) 管道&#xff0c;具有图形和命令行界面。它为有序和无序图像集合的重建提供了广泛的功能。 2.数据采集 手机或者相机 绕 物体拍一周&#xff0c;每张的角度不要超过30&#xff08;保证有overlap区域&#…

整合SSM框架笔记

整合SSM框架笔记 Spring5 Spring MVC MyBatis Druid MySQL Thymeleaf 感谢尚硅谷课程&#xff1a;B站课程 前言 单Spring框架时&#xff0c;是Java工程。 Spring与Spring MVC可以共用一个配置文件&#xff0c;也可以不共用一个&#xff0c;推荐不共用一个。 Spring与Sp…