• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

心电信号采集AD7606驱动Verilog代码Quartus仿真

08/07 08:04
1586
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-240Q91P941131.doc

共1个文件

名称:心电信号采集AD7606驱动Verilog代码Quartus仿真

软件:Quartus

语言:Verilog

代码功能:基于FPGA的心电信号采集AD7606驱动代码verilog

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

演示视频:

设计文档:

AD7606是ADI(Analog Devices Inc.)公司生产的一款16通道模数转换器,具有高性能和高速采样率的特点。它采用了低功耗的逐次逼近型模数转换技术,并支持SPI和并行两种数据传输模式。在FPGA项目中,AD7606通常用于采集来自外部传感器、信号源或其他外部设备的模拟信号

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 管脚分配

6. Signaltap抓取图(AD采样)

7. 部分代码

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Module Name:    ad7606

//////////////////////////////////////////////////////////////////////////////////

module ad7606(

input                clk,                //50mhz

input                rst_n,

input [15:0]         ad_data,            //ad7606 采样数据

input                ad_busy,            //ad7606 忙标志位

input                first_data,         //ad7606 第一个数据标志位

output [2:0]         ad_os,              //ad7606 过采样倍率选择

output reg           ad_cs,              //ad7606 AD cs

output reg           ad_rd,              //ad7606 AD data read

output reg           ad_reset,           //ad7606 AD reset

output reg           ad_convstab,         //ad7606 AD convert start

 

output reg [15:0] ad_ch1,              //AD第1通道的数据

output reg [15:0] ad_ch2,              //AD第2通道的数据

output reg [15:0] ad_ch3,              //AD第3通道的数据

output reg [15:0] ad_ch4,              //AD第4通道的数据

output reg [15:0] ad_ch5,              //AD第5通道的数据

output reg [15:0] ad_ch6,              //AD第6通道的数据

output reg [15:0] ad_ch7,              //AD第7通道的数据

output reg [15:0] ad_ch8               //AD第8通道的数据

 

);

 

 

 

reg [15:0]  cnt;

reg [15:0] i;

reg [3:0] state;

 

parameter IDLE=4'd0;

parameter AD_CONV=4'd1;

parameter Wait_1=4'd2;

parameter Wait_busy=4'd3;

parameter READ_CH1=4'd4;

parameter READ_CH2=4'd5;

parameter READ_CH3=4'd6;

parameter READ_CH4=4'd7;

parameter READ_CH5=4'd8;

parameter READ_CH6=4'd9;

parameter READ_CH7=4'd10;

parameter READ_CH8=4'd11;

parameter READ_DONE=4'd12;

 

assign ad_os=3'b000;

 

reg[15:0]  count;

reg        clk1;

always@(posedge clk or negedge rst_n )

if(!rst_n)

begin

count<=0;

clk1<=1'b0;

end

else if(count<=500)

count<=count+1'b1;

else

begin

count<=1'b0;

clk1<=~clk1;

end

 

//AD 复位电路

always@(posedge clk1)

begin

if(cnt<16'hffff) begin

cnt<=cnt+1;

ad_reset<=1'b1;

end

else

ad_reset<=1'b0;

end

 

always @(posedge clk1)

begin

if (ad_reset==1'b1) begin

state<=IDLE;

ad_ch1<=0;

ad_ch2<=0;

ad_ch3<=0;

ad_ch4<=0;

ad_ch5<=0;

ad_ch6<=0;

ad_ch7<=0;

ad_ch8<=0;

ad_cs<=1'b1;

ad_rd<=1'b1;

ad_convstab<=1'b1;

i<=0;

end

else begin

case(state)

IDLE: begin

ad_cs<=1'b1;

ad_rd<=1'b1;

ad_convstab<=1'b1;

if(i==20) begin

i<=0;

state<=AD_CONV;

end

else

i<=i+1'b1;

 

部分代码展示:

`timescale 1 ns / 100 ps //Use a timescale that is best for simulation.
module AD7606
//----------- Ports Declarations -----------------------------------------------
(
    //clock and reset signals
    input               fpga_clk_i,      //system clock
    input               reset_n_i,       //active low reset signal
    //ad7606 configure pin
    output      [2:0]   adc_os_o,       // ADC OVERSAMPLING signals
    output              adc_range_o,    // ADC RANGE signal
    output  reg         adc_reset_o,    // ADC RESET signal
    //state pin
    input               adc_busy_i,     // ADC BUSY signal
   
    //interface pin
    output  reg         adc_convst_o,    // ADC CONVST signal
    output  reg         adc_cs_n_o,     // ADC CS signal
    output ad7606_sclk,// serial clk
    input  ad7606_sda0,//serial data input A
    input  ad7606_sda1, //serial data input B
//test 
output [7:0]adc_state_o,
output SCLK_en_o,
output   reg [15:0]  rx_reg_A_o              // Register used for acquiring data
               // Register used for acquiring data
//output   reg  fifo_wr_en,
//output   reg  fifo_clk
);
//ADC states
parameter ADC_IDLE_STATE            = 8'b00000001; // Default state
parameter ADC_START_CONV_STATE      = 8'b00000010; // Togle conversion signal
parameter ADC_WAIT_BUSY_HIGH_STATE  = 8'b00000100; // Wait for the Busy signal to go High
parameter ADC_CS_RD_LOW_STATE       = 8'b00001000; // Wait for the Busy signal to go Low  
parameter ADC_WAIT_BUSY_LOW_STATE   = 8'b00010000; // Bring CS and RD signals Low     
parameter ADC_READDATA_STATE        = 8'b00100000; // Reads data from the ADC
parameter ADC_TRANSFER_DATA_STATE   = 8'b01000000; // Sends data to the upper module
parameter ADC_WAIT_END_STATE        = 8'b10000000; // Waits for the cycle time to end
//ADC timing
parameter real FPGA_CLOCK_FREQ      = 20/2;   // FPGA clock frequency [MHz]
parameter real ADC_CYCLE_TIME       = 40;    // minimum time between two ADC conversions (Tcyc) [us]
parameter [31:0] ADC_CYCLE_CNT_NO_OS= 390/2-1;//FPGA_CLOCK_FREQ * ADC_CYCLE_TIME-1;
parameter [31:0] ADC_CYCLE_CNT_OS2  = 2  * FPGA_CLOCK_FREQ * ADC_CYCLE_TIME-1;
parameter [31:0] ADC_CYCLE_CNT_OS4  = 4  * FPGA_CLOCK_FREQ * ADC_CYCLE_TIME-1;
parameter [31:0] ADC_CYCLE_CNT_OS8  = 8  * FPGA_CLOCK_FREQ * ADC_CYCLE_TIME-1;
parameter [31:0] ADC_CYCLE_CNT_OS16 = 16 * FPGA_CLOCK_FREQ * ADC_CYCLE_TIME-1;
parameter [31:0] ADC_CYCLE_CNT_OS32 = 32 * FPGA_CLOCK_FREQ * ADC_CYCLE_TIME-1;
parameter [31:0] ADC_CYCLE_CNT_OS64 = 64 * FPGA_CLOCK_FREQ * ADC_CYCLE_TIME-1;
reg [7:0]   adc_state = ADC_IDLE_STATE;              // current state for the ADC control state machine
reg [7:0]   adc_next_state;         // next state for the ADC control state machine
reg [15:0]  data_i_s =16'hE3;              // ADC write data;
reg [31:0]  cycle_cnt = ADC_CYCLE_CNT_NO_OS;              // cycle timescale
reg [31:0]  tmp_cycle_cnt = ADC_CYCLE_CNT_NO_OS;              // cycle timescale
reg         SCLK_en = 1'b0;                // Used to generate SCLK signal
reg [63:0]  rx_reg_A;               // Register used for acquiring data
reg [63:0]  rx_reg_B;
reg [15:0]  rx_reg_B_o  ;
assign adc_range_o  = data_i_s[0];//default 1'b1
//assign adc_stdby_o  = data_i_s[1];//default 1'b1
assign adc_os_o     = data_i_s[4:2];//3'b000
assign adc_state_o  = adc_state;
assign SCLK_en_o    = SCLK_en;
reg [ 7:0]  sclk_cnt;               // Register used for counting the clock signals sent
assign ad7606_sclk   = SCLK_en ? fpga_clk_i : 1'b0;   // clock is idle LOW
always @(negedge fpga_clk_i)   
begin
    if((reset_n_i == 0) || (ADC_START_CONV_STATE == adc_state))
    begin
     rx_reg_A <= 64'd0;
  rx_reg_B <= 64'd0;
 end
 else if(SCLK_en == 1'b1)
    begin
        rx_reg_A      <= { rx_reg_A[62:0], ad7606_sda0 };        // V1~V4
        rx_reg_B      <= { rx_reg_B[62:0], ad7606_sda1 };        // V5~V8
    end
end
//update the ADC timing counters count
always @(negedge fpga_clk_i)
begin
    if(reset_n_i == 0)
    begin
        tmp_cycle_cnt   <= ADC_CYCLE_CNT_NO_OS;
adc_convst_o    <= 1'b0;
    end
    else
    begin
    if(adc_state   == ADC_IDLE_STATE)
 begin
   case(adc_os_o)
3'h0:
begin
tmp_cycle_cnt   <= ADC_CYCLE_CNT_NO_OS;
end
3'h1:
begin
tmp_cycle_cnt   <= ADC_CYCLE_CNT_OS2;
end
3'h2:
begin
tmp_cycle_cnt   <= ADC_CYCLE_CNT_OS4;
end
3'h3:
begin
tmp_cycle_cnt   <= ADC_CYCLE_CNT_OS8;
end
3'h4:
begin
tmp_cycle_cnt   <= ADC_CYCLE_CNT_OS16;
end
3'h5:
begin
tmp_cycle_cnt   <= ADC_CYCLE_CNT_OS32;
end
3'h6:
begin
tmp_cycle_cnt   <= ADC_CYCLE_CNT_OS64;
end
default:
begin
tmp_cycle_cnt   <= ADC_CYCLE_CNT_NO_OS;
end
   endcase
      cycle_cnt <= tmp_cycle_cnt;
   end

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=907

  • 2-240Q91P941131.doc
    下载

相关推荐