FPGA-Based AD7705 Driver Design Verilog Code Simulation

Name: FPGA-Based AD7705 Driver Design Verilog Code Simulation

Software: Quartus

Language: Verilog

Code Function: AD7705 Driver Design

1. Project Files

FPGA-Based AD7705 Driver Design Verilog Code Simulation

2. Program Files

FPGA-Based AD7705 Driver Design Verilog Code Simulation

3. Program Compilation

FPGA-Based AD7705 Driver Design Verilog Code Simulation

4. Simulation Diagram

Testbench

FPGA-Based AD7705 Driver Design Verilog Code Simulation

Simulation Diagram

Overall Simulation

FPGA-Based AD7705 Driver Design Verilog Code Simulation

Reset, continuously write 32 high levels

FPGA-Based AD7705 Driver Design Verilog Code Simulation

Sequentially write 8’h20, 8’h03, 8’h10, 8’h40

FPGA-Based AD7705 Driver Design Verilog Code Simulation

Write 8’h38, and read data

FPGA-Based AD7705 Driver Design Verilog Code Simulation

Partial code display:

module AD7705_driver(
input clk_50M,
input reset_n,//System reset signal, active low
output [15:0] AD_data_out,//Output AD data
//AD7705
input AD_DRDY_n,
input AD_dout,
output AD_CS,
output AD_clk,
output AD_din
);
assign AD_CS=0;//CS remains low
parameter s_reset=3'd0;//FFFF
parameter s_communicate_clkreg=3'd1;//8'h20
parameter s_clk_reg=3'd2;//8'h03
parameter s_communicate_setreg=3'd3;//8'h10
parameter s_set_reg=3'd4;//8'h40
parameter s_communicate_datareg=3'd5;//8'h38, read channel 1
parameter s_read_data=3'd6;//Read 16bit data
parameter s_wait_DRDY=3'd7;//Wait for DRDY==0
//Define registers
reg [7:0] communicate_clkreg=8'h20;
reg [7:0] clk_reg=8'h03;
reg [7:0] communicate_setreg=8'h10;
reg [7:0] set_reg=8'h40;
reg [7:0] communicate_datareg=8'h38;
reg [2:0] state=3'd0;
//AD_clk maximum 5M, read/write on rising edge
reg [7:0] cycle_cnt=8'd0;
reg AD_clk_reg=0;//Using 5M clock, 50/5=10;
reg [7:0] AD_clk_reg_cnt=8'd0;
always@(posedge clk_50M)
if(~reset_n) 
AD_clk_reg_cnt<=8'd0;
else
if(AD_clk_reg_cnt==8'd9)
AD_clk_reg_cnt<=8'd0;
else
AD_clk_reg_cnt<=AD_clk_reg_cnt+8'd1;
//50M divided to 5MHz
always@(posedge clk_50M)
if(AD_clk_reg_cnt>=8'd5)
AD_clk_reg<=1;
else
AD_clk_reg<=0;
reg clk_en=0;//SPI work enable
assign AD_clk=AD_clk_reg & clk_en;//5M
reg AD_din_reg=0;
assign AD_din=AD_din_reg & clk_en;
reg AD_clk_reg_buf=0;
always@(posedge clk_50M)
AD_clk_reg_buf<=AD_clk_reg;
wire AD_clk_reg_down;//Falling edge of AD_clk_reg
wire AD_clk_reg_rise;//Rising edge of AD_clk_reg
assign AD_clk_reg_down=~AD_clk_reg & AD_clk_reg_buf;//Falling edge of AD_clk_reg
assign AD_clk_reg_rise=AD_clk_reg & ~AD_clk_reg_buf;//Rising edge of AD_clk_reg
//Initialization and reading AD value state machine
reg [15:0] AD_data=16'd0;
always@(posedge clk_50M)
if(~reset_n)begin
state<=s_reset;
cycle_cnt<=8'd0;
clk_en<=0;
communicate_clkreg<=8'h20;
clk_reg<=8'h03;
communicate_setreg<=8'h10;
set_reg<=8'h40;
communicate_datareg<=8'h38;
end
else
case(state)
s_reset:begin//Reset, continuously write 32 high levels
if(AD_clk_reg_down==1)
if(cycle_cnt>8'd31)begin
cycle_cnt<=8'd0;
state<=s_communicate_clkreg;
clk_en<=0;
end
else begin
cycle_cnt<=cycle_cnt+8'd1;
AD_din_reg<=1;
state<=s_reset;

FPGA-Based AD7705 Driver Design Verilog Code Simulation

Leave a Comment