基于FPGA的高速数据采集系统实现

news2025/7/22 22:14:34

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》

目录

一、理论基础

二、核心程序

2.1锁存器模块

2.2双口地址计数器模块

2.3双口RAM模块

2.4时钟分频模块

三、测试结果


一、理论基础

       高速数据采集在军用民用领域都有着广泛的应用。高速数据采集系统在自动控制、电气测量、地质物探、航空航天等工程实践中有着极为广泛的应用。如何对高速的信号进行实时采集、实时存储,保证信号不丢失,以满足工业现场的需要,一直是高速数据采集系统研究的一个重要方向。数据采集系统是信号与信息处理系统中不可缺少的重要组成部分,同时也是软件无线电系统中的核心模块。

      高速数据采集系统主要包括以下几个部分:模拟信号调理电路、模数转换器、数据处理器件、数据存储器件、时钟电路、触发电路、传输接口芯片和电源系统等,如图1所示。

图1 高速数据采集系统结构图

      其中,模拟信号调理电路是用来将模拟信号放大调整到ADC的采样量程之内,这样既能充分发挥ADC的性能,又能保证采样数据的完整性;ADC是高速数据采集系统的核心器件,模拟信号输入,数字信号输出;数据处理器件有很多种,可以根据实际的不同需要进行选择;数据存储器件主要用于存储数据,可以进行显示,回放和数据处理等操作;时钟电路是比较重要的,时钟的稳定性和精确性决定着数据采集的结果,所以一般的做法是单独设计稳定的时钟电路;触发电路实现外部对数据采集频率和次数的控制,传输接口用于将数据传输给计算机进行后处理。

           采用单路高速A/D转换器以及存储器构成串行采集系统系统框图如图2所示:

图2 单路高速数据采集框图

       采用单路高速AD转换器和高速存储电路来构成字串行采集系统,系统的采样就属于实时采样,适用于任何形式的信号波形,重复的或不重复的,单次的或连续的。又由于所有采样点是以时间为顺序,因而易于实现波形显示功能。但是采用单片高速A/D芯片和高速存储器件,会大大提高系统开发成本。同时系统的采样率就受到A/D转换器最高转换速率以及存储器写入速度的限制。因此,单通道数据采集系统的采集速度受器件自身参数的限制,很难再大幅度提高其转换速度。

二、核心程序

其整体结构如下所示:

2.1锁存器模块

        系统工作的时候要对数据进行锁存,然后进行传输,通常这样做可以使系统更加稳定的工作,其工作原理比较简单,实现代码如下所示:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity dlatch8 is

port(

   cp: in std_logic;

   d:  in std_logic_vector(7 downto 0);

   q:  out std_logic_vector(7 downto 0)

   );

end dlatch8;

architecture one of dlatch8 is

begin

   process(cp,d)

   begin

      if(cp='1') then

      q<=d;

      end if;

   end process;

end;

2.2双口地址计数器模块

       地址计数器用来给RAM存储器产生地址信号。由RAM的写入时钟来控制,每当时钟上升沿到来一次,地址计数器就自动加1,直到进行至RAM的底部,表示此时RAM已经写满。下面给出由VHDL语言实现的地址计数器部分源代码。

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

entity addrcount is

      port(

           clr:in std_logic;

           clk:in std_logic;

           eoc: out std_logic;

           q: buffer std_logic_vector(6 downto 0)

          );

        end;

architecture beha of addrcount is

begin

   process(clr,clk)

   begin

      if(clk'event and clk='1') then

              if clr='0'then

              q<="0000000";

          elsif(q="1111111")then

              q<="1111111";

          else

              q<=q+1;

          end if;

      end if;

   end process;

   process(q)

      begin

      if(q="1111111") then

      eoc<='0';

      else

      eoc<='1';

      end if;

   end process;

end beha;

2.3双口RAM模块

       对于高速数据接收,一般发送端和接收端的时钟是异步的,这就涉及到异步时钟域数据的传输的问题,此外在不同时钟控制的时钟域中传递数据时,了避免发生亚稳态和产生毛刺,应该做好异步时钟域之间的隔离处理。通常,可采用DPRAM以数据缓冲的形式来作为异步时钟域之间的隔离接口。

LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.all;
ENTITY lpm_ram_dp IS
	PORT
	(
		clock		: IN STD_LOGIC ;
		data		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
		rdaddress		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
		wraddress		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
		wren		: IN STD_LOGIC  := '1';
		q		: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
	);
END lpm_ram_dp;
ARCHITECTURE SYN OF lpm_ram_dp IS
	SIGNAL sub_wire0	: STD_LOGIC_VECTOR (7 DOWNTO 0);
	COMPONENT altsyncram
	GENERIC (
		address_aclr_a		: STRING;
		address_aclr_b		: STRING;
		address_reg_b		: STRING;
		indata_aclr_a		: STRING;
		intended_device_family		: STRING;
		lpm_type		: STRING;
		numwords_a		: NATURAL;
		numwords_b		: NATURAL;
		operation_mode		: STRING;
		outdata_aclr_b		: STRING;
		outdata_reg_b		: STRING;
		power_up_uninitialized		: STRING;
		read_during_write_mode_mixed_ports		: STRING;
		widthad_a		: NATURAL;
		widthad_b		: NATURAL;
		width_a		: NATURAL;
		width_b		: NATURAL;
		width_byteena_a		: NATURAL;
		wrcontrol_aclr_a		: STRING
	);
	PORT (
			wren_a	: IN STD_LOGIC ;
			clock0	: IN STD_LOGIC ;
			address_a	: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
			address_b	: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
			q_b	: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
			data_a	: IN STD_LOGIC_VECTOR (7 DOWNTO 0)
	);
	END COMPONENT;
BEGIN
	q    <= sub_wire0(7 DOWNTO 0);
	altsyncram_component : altsyncram
	GENERIC MAP (
		address_aclr_a => "NONE",
		address_aclr_b => "NONE",
		address_reg_b => "CLOCK0",
		indata_aclr_a => "NONE",
		intended_device_family => "Cyclone",
		lpm_type => "altsyncram",
		numwords_a => 256,
		numwords_b => 256,
		operation_mode => "DUAL_PORT",
		outdata_aclr_b => "NONE",
		outdata_reg_b => "CLOCK0",
		power_up_uninitialized => "FALSE",
		read_during_write_mode_mixed_ports => "DONT_CARE",
		widthad_a => 8,
		widthad_b => 8,
		width_a => 8,
		width_b => 8,
		width_byteena_a => 1,
		wrcontrol_aclr_a => "NONE"
	)
	PORT MAP (
		wren_a => wren,
		clock0 => clock,
		address_a => wraddress,
		address_b => rdaddress,
		data_a => data,
		q_b => sub_wire0	); END SYN;

2.4时钟分频模块

       一般在高速系统中,时钟的生产有两种方法实现,PLL锁相环法和计数器分频法。下面我们对两种方法做简单的介绍。

    计数器分频器的设计比较简单,其主要通过计数器来控制时钟发现跳板的周期,这里我们对其工作原理就不做介绍了。本系统由于使用的分频器比较简单,因此在这个系统中,我们将实用计数器分频器来设计时钟。

    其实现的VHDL代码如下所示:

LIBRARY IEEE;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity fredivid is

port(

     clkin:in std_logic;

     clkout: out std_logic

    );

end fredivid;

architecture one of fredivid is

             signal q:std_logic_vector(1 downto 0);

begin

     process(clkin)

     begin

         if(clkin'event and clkin='1')then

             if(q="11")then

             q<="00";

         else

             q<=q+1;

         end if;

     end if;

     end process;

     process(q)

     begin

         if(q(1)='1') then

         clkout<='1';

     else

         clkout<='0';

         end if;

     end process; end;

三、测试结果

     最后,对于设计完成的系统,我们得对其资源做分析。本系统其资源实用情况如所示:

图1 资源使用分析

本系统,我们共实用逻辑单元2048个。

图2 时序分析报表

     其中tsu,tco,tpd,th分别为7.098ns,14.272ns,9.109ns,0.227ns。后面的输入信号频率基本在200M左右,达到高速传输的要求。

A28-35

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

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

相关文章

了解计算机里非门组成的部分

计算机中有一块硬件不是完全由NAND门构成的。这并不是把电脑变成电脑的必要条件&#xff0c;但大多数电脑都有一些。它们被用来从模拟的东西变成数字的东西&#xff0c;或者从数字变成模拟的东西。 人类的眼睛和耳朵会对类似的事物做出反应。我们听到的东西可以是响亮的&#x…

LeetCode 513找树左下角的值 112路径总和113路径总和ii 106从中序与后序遍历序列构造二叉树

文章目录513找树左下角的值c 代码实现python 代码实现112路径总和c 代码实现python 代码实现113路径总和iic代码实现python 代码实现106从中序与后序遍历序列构造二叉树c代码实现python 代码实现513找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 …

Java 基础(继承、接口、抽象)

面试题继承继承的特点super关键字继承中变量访问特点继承中构造访问特点为什么子类中所有构造方法默认都会访问父类无参构造方法。如果父类中没有无参构造继承中成员方法访问特点重写概述应用注意事项方法重写和重载有什么区别&#xff1f;静态代码块、构造代码块&#xff0c;构…

安泰测试-安捷伦N5182A射频矢量信号发生器

产品简介&#xff1a; 安捷伦N5182A信号源技术支持Agilent N5182A MXG 射频矢量信号发生器 N5182A主要特性与技术指标 信号表征 100 kHz &#xff5e; 3 或 6 GH 使用高度可靠、快速切换的电子衰减器&#xff0c;在 3 GHz 时 >23 dBm W-CDMA 动态范围&#xff1a;≤-73…

指纹浏览器功能对比:AdsPower VS Multilogin

近期&#xff0c;Conversion Club 发起了“最佳指纹浏览器”提名评选活动&#xff0c;AdsPower、Dolphin 和Multilogin 并列入选&#xff0c;成为国际认可的专业指纹浏览器。上期&#xff0c;龙哥出了一篇有关AdsPower与Dolphin 的对比文章&#xff0c;后台收到私信问能不能也出…

7位世界著名的制图师及其相关的地图介绍

制图是地图制作的艺术和科学&#xff0c;而作为制图师需要注意很多的细节&#xff0c;包括可视化数据以及地理的全面知识等。地图在每个人的生活中都发挥着一定的影响力&#xff0c;尤其是对于一些著名的制图师。本文将介绍7位世界著名的制图师及其相关的地图&#xff0c;让我们…

鸽群优化算法(Pigeon-inspired Optimization algorithm, PIO)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【优雅至极】利用VSCode进行远程Linux服务器、容器开发,达到ide开发项目的效果

本文将介绍“局域网下远程ide式开发”、“公网下远程ide式开发”、“局域网下远程容器的ide式开发”、“公网下远程容器的ide式开发”这四种开发流程&#xff0c;让你无论在工位上还是在家中&#xff0c;都可以像打开本地ide那样进行远程的项目开发。 0 本地ide式开发 最方便…

自然排序与比较器排序的使用

1、自然排序&#xff1a;java.lang.Comparable Comparable 接口中只提供了一个方法&#xff1a; compareTo(Object obj) &#xff0c;该方法的返回值是 int 。如果返回值为正数&#xff0c;则表示当前对象(调用该方法的对象)比 obj 对象“大”&#xff1b;反之“小”&#xff…

前端实现克里金插值分析(二)

作者:yangjunlin 在上一篇文章中我们已经使用了像素法实现克里金插值的方式&#xff0c;但是问题也就随之抛了出来。1.第一点&#xff0c;在反距离权重插值的时候&#xff0c;因为处理的数据量大会直接导致主线程卡&#xff0c;导致用户体验不好&#xff0c;2.第二点&#xff0…

Apache开启SSL(https)访问网站配置

前言:问题稍微有点绕,整个配置过程,测试成功 服务器的80端口分配了Apache使用了(用phpstudy运行php网站),服务器上还有(IIS网站,站点使用81端口),需要用80转81(中转代理一下到IIS访问网站,iis无需重复配置ssl设置) 就实现了:一台服务器使用2种语言(php/asp.ne…

闭环控制(自动控制理论)

目录 闭环控制 开环控制和闭环控制优缺点 闭环控制 即有被控制量反馈的控制。从系统中信号流向看&#xff0c;系统的输出信号沿反馈通道又回到系统的输入端&#xff0c;构成闭合通道&#xff0c;故称作为闭环控制系统&#xff0c;又或者称为反馈控制系统 这种控制方式&#xf…

微服务环境搭建SpringCloud入门

目录 案例准备 技术选型 模块设计 微服务调用 创建父工程 创建基础模块 创建用户微服务 创建商品微服务 创建订单微服务 我们本次是使用的电商项目中的商品、订单、用户为案例进行讲解。 案例准备 技术选型 maven&#xff1a;3.5.4 数据库&#xff1a;MySQL 5.7 持…

【矩阵论】4. 矩阵运算——广义逆——广义逆的计算

4.3.2 AA^A 计算 a. 秩1公式 若A(aij)mn,r(A)1,则A1∑∣aij∣2AH1tr(AHA)AH\begin{matrix} 若A(a_{ij})_{m\times n},r(A)1,则A^\frac{1}{\sum \vert a_{ij}\vert^2}A^H\frac{1}{tr(A^HA)}A^H \end{matrix} 若A(aij​)mn​,r(A)1,则A∑∣aij​∣21​AHtr(AHA)1​AH​ AHAA^HAA…

Qt Quick 用cmake怎么玩子项目

以往在公司开发众多的项目中&#xff0c;都会出现要求本项目里部分功能模块代码需要具备保密性。如果需要对外输出demo工程&#xff0c;那么需要做到不会泄密。 举一下爪子&#xff0c;以前做雷达开发的时候&#xff0c;客户从公司那儿买了这些雷达模块&#xff0c;也会需要从…

信号量的使用

信号量 英文名字&#xff1a;semaphore 这里的进程信号量会为下列的信号量打基础 Ucos系统的信号量c线程的信号量java进程和线程的信号量 信号量作用 当多个进程/线程进行共享操作时&#xff0c;用于资源保护&#xff0c;以防止出现相互干扰的情况 信号量用于“资源的保护“ …

图论算法大合集【包括图的dfs和bfs遍历】【欧拉回路】【判断连通图】【Dijkstra算法】【floyd算法】【最小生成树prim算法】【拓扑排序】

图论算法大合集一. dfs和bfs 过程中要有visited数组标记已遍历过的节点6-1.1 邻接矩阵存储图的深度优先遍历6-1.2 邻接表存储图的广度优先遍历二、欧拉回路&#xff08;度为偶数&#xff0c;且为连通图&#xff09;6-1.3 哥尼斯堡的“七桥问题”三、判断连通图6-1.4 地下迷宫探…

进程调度的基本关系

文章目录1.什么是进程(process)2.进程的特性1.进程是非常重要的"软件资源"2.PCB(进程控制块)描述了哪些进程特征3.并行和并发4.进程的虚拟地址空间和进程间通信1.什么是进程(process) 简单来说就是:一个程序跑起来就是一个进程 一个应用没跑起来叫做程序,跑起来了就…

堆排序算法

一、大顶堆和小顶堆概念 堆排序是利用堆数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;其最坏&#xff0c;最好&#xff0c;平均时间复杂度均为O(nlogn)&#xff0c;同时也是不稳定排序。 堆是具有以下性质的完全二叉树&#xff1a;每个结点的值都…

Hive数据定义语言-DDL-建表高阶语法(内外部、分区、分桶、事务、视图、物化视图)

文章目录1. 内部表、外部表1.1 内部表1.2 外部表1.3 内、外部表差异1.4 Location关键字的作用2. 分区表-Partitioned Tables2.1 概念2.2 创建2.3 分区表数据加载2.3.1 静态分区2.3.2 动态分区2.4 注意事项3. 分桶表-Bucketed Tables3.1 概念3.2 规则3.3 语法3. 事务表-Transact…