求一些有利用fpga配置带有寄存器的ad转换芯片。有关于fpga如何对ad寄存器的地址操作进行spi传输的相关verilog代码及解释。
使用Spartan6控制AD9613进行采样,
module testmode_spi(
input clk_25,
input rst,
output reg csb,
output reg oeb,
output clk_spi,
output reg [7:0] state,
output write,
output reg [7:0] tr_delay,
//output reg [7:0] sdio_spi_id,
output reg fin_ad_reg,
inout sdio
);
reg rd_wr = 0; //璇诲啓
parameter phase = 2'b00; //w1鍜寃0
parameter spi_syn = {8'h3a,8'h01};
reg wr_valid;
reg [23:0] sdio_data1;
reg [23:0] sdio_data2;
reg sdio_out;
reg [15:0] sdio_rd;
// reg [7:0] sdio_spi_id;
// reg [7:0] state;
reg [7:0] id_cnt;
reg [3:0] num;
// reg [7:0] tr_delay;
reg write;
reg [15:0] cnt;
reg [23:0] sdio_data_te;
parameter st_idle = 4'd0;
parameter wr_cmd1 = 4'd1;
parameter waite = 4'd2;
// parameter wr_cmd3 = 4'd3;
// parameter wr_cmd4 = 4'd4;
// parameter wr_cmd5 = 4'd5;
parameter rd_delay = 4'd6;
parameter rd_cmd1 = 4'd7;
parameter rd_cmd2 = 4'd8;
parameter re_delay = 4'd9;
parameter w2r_delay = 5000;
assign sdio = write ? sdio_out:1'bz;
assign clk_spi = ~clk_25;
always @(posedge clk_25)
if(!rst)
wr_valid <= 0;
else if(state == wr_cmd1)
wr_valid <= 1;
else
wr_valid <= wr_valid;
always @(posedge clk_25)begin
if(!rst)begin
state <= st_idle;
sdio_data1 <= 0;
sdio_data2 <= 0;
sdio_rd <= 0;
waite : begin
state <= waite;
fin_ad_reg <= 1;
end
default :state <= st_idle;
endcase
end
end
always @(posedge clk_25)
if(!rst)
num <= 0;
else if(state == wr_cmd1)
num <= 1;
else if(state == waite)
num <= 2;
else
num <= num;
always @(posedge clk_25)
if(!rst)
tr_delay <= 0;
else if(num == 2 && tr_delay <= 30)
tr_delay <= tr_delay + 1;
else
tr_delay <= 0;
always @(posedge clk_25)
if(!rst)
csb <= 1;
else if(tr_delay > 2 && tr_delay <= 26 && num == 2 )
csb <= 0;
csb <= 1;
always @(posedge clk_25 )
if(!rst)
sdio_out <= 0;
else if(num == 2 && tr_delay > 2)
sdio_out <= sdio_data1['d26-tr_delay];
else
sdio_out <= 0;
always @(posedge clk_25)
if(!rst)
oeb <= 1;
else if(num >= 2)
oeb <= 0;
else
oeb <= 1;
endmodule
ADI官方也有例程,不难的。