file-type

AD7606数据采集系统在Vivado中的Verilog实现及串口通信

下载需积分: 5 | 1.14MB | 更新于2024-09-28 | 50 浏览量 | 1 下载量 举报 收藏
download 立即下载
本资源摘要旨在详细解读关于AD7606在Vivado环境下开发的Verilog语言工程,该工程涉及到八通道数据的采集与串行输出,并通过串口通信进行数据传输。以下是本摘要的详细内容: 1. AD7606介绍: AD7606是一款由Analog Devices公司生产的8通道数据采集芯片,具有双极性模拟输入范围,能够提供16位分辨率的A/D转换功能。在本工程中,AD7606被用于实现多通道数据采集。 2. Vivado工程与Verilog语言: Vivado是Xilinx公司推出的一款用于设计FPGA和SOC的综合工具,支持高层次综合(HLS)和硬件描述语言(HDL)如Verilog和VHDL。在本资源中,工程使用Verilog语言编写,Verilog是一种硬件描述语言,广泛应用于数字电路设计和FPGA设计中。 3. 八通道数据采集: 在本工程中,AD7606的八通道功能被充分利用,实现了同步采样。在数字信号处理领域,能够同时从多个通道采集数据是常见的需求,这在处理多维数据、声音或图像信号时尤为重要。 4. 串行输出: 串行输出指的是数据在输出时,不是一次性将所有数据位并行地输出,而是通过序列的方式一位接一位地传输。在本工程中,由于连接线比较少,使用串行输出可以有效减少所需I/O口的数量,简化了硬件设计。 5. 串口通信: 串口通信是计算机与外设之间进行通信的一种传统方法,它通过RS-232、RS-485等串行通信协议实现数据的传输。在本工程中,串口通信用于将AD7606采集的数据发送到PC端,通过串口调试助手显示出来。 6. 稳定运行: 稳定运行是本工程的一个重要特点。由于工程要求AD7606能够以1kHz的频率进行采样并稳定输出数据,因此在设计时需要充分考虑时序控制、数据缓冲等问题,以确保数据的准确性和系统的稳定性。 7. 采样频率: 采样频率即采样速率,是指在单位时间内对模拟信号进行采样的次数,单位是赫兹(Hz)。在本工程中,采样频率为1kHz,意味着每秒对模拟信号进行1000次采样。根据奈奎斯特采样定律,为了能够准确重构原始信号,采样频率应至少是信号最高频率的两倍。 8. 串口调试助手: 串口调试助手是一种常用的软件工具,用于调试和测试串口通信。它可以显示接收到的数据,并提供发送数据的功能,极大地方便了开发者对于串口通信的调试过程。 9. 网络编程: 标签中出现的“网络”可能是指本工程虽然主要涉及到硬件设计和串口通信,但在更广泛的系统设计中,可能需要考虑网络传输,即将采集的数据通过网络发送到其他设备或服务器上。这可能涉及到嵌入式系统与网络的接口设计。 综上所述,本资源摘要详细介绍了AD7606在Vivado环境下开发的Verilog语言工程的相关知识点,包括硬件采集芯片的特性、Vivado工具及Verilog语言的应用、多通道数据采集、串行数据传输、以及工程的稳定性和采样频率要求。同时,也涉及了串口通信和网络编程的基本概念。这些内容对于理解和应用该工程具有重要的参考价值。

相关推荐

filetype

`timescale 1ns / 1ps module AD7606_spi( input I_sysclk, //系统时钟输入 input I_ad_busy, //ad7606 忙标志位 output O_ad_cs, //ad7606 CS信号输出,低电平SPI数据线输出AD7606寄存器数据 output reg O_ad_sclk, //ad7606 SCLK时钟输出 output O_ad_rst, //ad7606 复位输出 output O_ad_convsta, //ad7606 A组通道转换 output O_ad_convstb, //ad7606 B组通道转换 output O_ad_range, //ad7606 模拟输入范围,设置1范围:±10V,设置0范围±5V input I_ad_out_a, //串行A组通道采集输入,V1,V2,V3,V4 input I_ad_out_b //串行B组通道采集输入, V5,V6,V7,V8 ); wire clk100M,locked; clk_wiz_0 clk_7606_inst( .clk_out1(clk100M), .locked(locked), .clk_in1(I_sysclk)); //ad7606 ip相关信号 wire ad_clk_i,ad_rst_i; reg [63:0] ad_out_a,ad_out_b; assign ad_clk_i = clk100M; //ADC时钟 assign ad_rst_i = !locked; //ADC IP内部代码复位 localparam CLK_FREQ = 100000000 ; localparam SET_5US = 5 ; //5us周期 localparam T5US_DIV = CLK_FREQ*SET_5US/1000000 -1 ; //计算5us 分频系数 localparam SPI_DIV = CLK_FREQ/16666666 -1 ; //产生SPI时钟,设置最高16.666667MHZ assign O_ad_range = 1'b1; //±10V真直流输入范围 //ad复位时间高电平,复位时间最少50ns reg [23: 0] rst_cnt; assign O_ad_rst = !rst_cnt[23]; always@(posedge ad_clk_i or posedge ad_rst_i)begin if(ad_rst_i) begin rst_cnt <= 24'd0; end else if(!rst_cnt[23]) begin rst_cnt <= rst_cnt + 1'b1; end end //设置采样频率,AD7606为8通道可以工作于200Kbps采样率,因此采样周期为5us 1KSPS=1KHz,1MSPS=1MHz reg [9:0] tcnt5us; wire cycle_end = (tcnt5us == T5US_DIV); always@ (posedge ad_clk_i)begin if(O_ad_rst) begin tcnt5us <= 10'd0; end else if(tcnt5us < T5US_DIV) begin tcnt5us <= tcnt5us + 1'b1; end else begin tcnt5us <= 10'd0; end end localparam [9:0] SPI_DIV1 = SPI_DIV/2; //半周期分频 reg [9:0] clk_div = 10'd0;//分频计数器 //SPI 时钟分频,对于200K采样,设置20M时钟 always@(posedge ad_clk_i)begin if(clk_div < SPI_DIV) begin clk_div <= clk_div + 1'b1; end else begin clk_div <= 10'd0; end end //产生SPI时钟 wire clk_en1 = (clk_div == SPI_DIV1); // 半周期使能,控制输出0 wire clk_en2 = (clk_div == SPI_DIV); // 半周期使能,控制输出1 always@(posedge ad_clk_i)begin if(clk_en2) begin O_ad_sclk <= 1'b1; //输出高电平 end else if(clk_en1) begin O_ad_sclk <= 1'b0; //输出高低平 end end //AD转换状态机 reg [1:0] AD_S; reg ad_convst; //ADC转换控制信号,A组通道和B组通道采用同一通道 //ADC工作于SPI模式,以及边读边转换模式,本次数据转换的同时,可以读出前一次转换的结果 assign O_ad_cs = ~((AD_S == 2'd3)&&I_ad_busy);//当AD7606工作在串行模式,cs=0代表输出通过SPI数据总线,输出之前的采样数据 assign O_ad_convsta = ad_convst; //ADC转换控制信号,A组通道和B组通道采用同一通道 assign O_ad_convstb = ad_convst; //ADC转换控制信号,A组通道和B组通道采用同一通道 always @(posedge ad_clk_i) begin if(O_ad_rst||ad_rst_i)begin ad_convst <= 1'b1; AD_S <= 2'd0; end else begin case(AD_S) 2'd0:if(clk_en2)begin //clk_en2,控制SCLK输出1,因此这里相当于SCLK上升沿 ad_convst <= 1'b0; //设置ad_convst=0 AD_S <= 2'd1;//下一状态 end 2'd1:if(clk_en2)begin //延迟50ns,ad_convst低电平至少25ns,对于SCLK时钟是20MHZ,所以这里ad_convst低电平是50ns ad_convst <= 1'b1;//ad_convst 低电平50ns后拉高为高电平 AD_S <= 2'd2;//下一状态 end 2'd2:if(clk_en2&&I_ad_busy)begin//延迟50ns,并且等待busy高,只要ADC正常工作,busy必然为高,说明ADC处于采样转换下 AD_S <= 2'd3; end 2'd3:if(cycle_end)begin//ADC转换时间最大4.2us,5us周期结束,代表本次8通道完全采集结束 AD_S <= 2'd0; //回到初始状态,进行下一次采样 end endcase end end //SPI采样 reg [7 : 0] nbits; // bits计数器,用于计数完成了从AD7606 SPI总线读出的bits数 wire ad_cap_en_r1 = (nbits==8'd64); //数据同步输出使能 reg ad_cap_en_r2 = 1'b0; //数据同步输出使能寄存一次 wire O_ad_cap_en ; assign O_ad_cap_en = ({ad_cap_en_r1,ad_cap_en_r2}==2'b10);//高电平输出系统时钟的一个周期 always@(posedge ad_clk_i) begin //寄存一次ad_cap_en_r1 ad_cap_en_r2 <= ad_cap_en_r1; end //当CS信号为低电平,每个SCL的下降沿输出采样数据,每组通道采样64bits wire cap_en = (!O_ad_cs)&&clk_en1&&(nbits<8'd64); //ADC 串并转换模块 always@(posedge ad_clk_i) begin if(O_ad_rst) begin //ADC复位期间重置相关寄存器 ad_out_a <= 64'd0; ad_out_b <= 64'd0; nbits <= 8'd0; end else if(O_ad_cs)begin //高电平,重置 nbits nbits <= 8'd0; end else if(cap_en)begin//当CS信号为低电平,每个SCL的下降沿采样数据,每组通道采样64bits nbits <= nbits + 1'b1; // ad_out_a <= {ad_out_a[62:0],I_ad_out_a};//保存A组通道数据,V1~V4,每个通道16bits ad_out_b <= {ad_out_b[62:0],I_ad_out_b};//保存B组通道数据,V5~V8,每个通道16bits end end wire [15:0] ad_ch1 = ad_out_a[63:48];//ADC 通道1 wire [15:0] ad_ch2 = ad_out_a[47:32];//ADC 通道2 wire [15:0] ad_ch3 = ad_out_a[31:16];//ADC 通道3 wire [15:0] ad_ch4 = ad_out_a[15: 0];//ADC 通道4 wire [15:0] ad_ch5 = ad_out_b[63:48];//ADC 通道5 wire [15:0] ad_ch6 = ad_out_b[47:32];//ADC 通道6 wire [15:0] ad_ch7 = ad_out_b[31:16];//ADC 通道7 wire [15:0] ad_ch8 = ad_out_b[15: 0];//ADC 通道8 endmodule 根据以上程序,生成一段完整的仿真文件,要求: 1、符合verilog语法规范,能在vivado里进行仿真 2、I_ad_out_a = 000100010001000100020002000200020003000300030003以此类推下去 I_ad_out_b = 000100010001000100020002000200020003000300030003以此类推下去

冠头咸鱼
  • 粉丝: 99
上传资源 快速赚钱