ADC的配置和一种新的ADC配置架构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxs13551803230/article/details/78836066


always @(posedge clk_100M)
begin
sdi <= sdi_reg; //sdi_reg就是要配置给adc的数据
sclk <= (~sclk_en) && spi_clk;//我们要在csb低电平使能sclk就用这句话,其中spi_clk就是50M
csb <= sclk_en;
config_done <= done ;
end

基于上图的时基和adc的需求来看有如下可行架构
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2017/05/02 14:03:04
// Design Name:
// Module Name: AD9265_SPIconfig
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////


module AD9265_SPIconfig( input clk_100M,
input spi_clk, //50M 数据手册上给出最小40M
input spi_conf_en,
input rstn,
output reg sclk,
output reg sdi,
output reg csb,
output reg config_done //配置完成 为高电平

);
parameter addr_width = 12,
data_width = 8;
wire [16+data_width:0]spi_data;
assign spi_data = {4'b0000,trans_data}; //一次发送的数据
reg[addr_width+data_width-1:0] trans_data; //13位地址,8位数据
reg [3:0]config_index; //配置时的计数器
always @(posedge clk_100M )
begin
case (config_index)
4'd0 : trans_data <= {12'h000,8'h18}; // spi端口控制,MSB在前
4'd1 : trans_data <= {12'h0FF,8'h01}; // 向ff寄存器写入1才能正常向别的寄存器写入数据
4'd2 : trans_data <= {12'h008,8'h80}; // 默认配置,PWDN有效时,器件为掉电模式
4'd3 : trans_data <= {12'h009,8'h01}; // 默认打开时钟duty的稳定模式
//
4'd4 : trans_data <= {12'h00B,8'h00}; // 默认不分频
4'd5 : trans_data <= {12'h00D,8'h00}; // 默认不进行自测
4'd6 : trans_data <= {12'h00E,8'h04}; // 不使能自测
4'd7 : trans_data <= {12'h014,8'h40}; // ANSI LVDS输出模式
//
4'd8 : trans_data <= {12'h016,8'h00}; // 无输出反转和延迟
4'd9 : trans_data <= {12'h017,8'h00}; // 无延迟
4'd10 : trans_data <= {12'h018,8'h00}; // 默认
4'd11 : trans_data <= {12'h030,8'h00}; // 默认
//
4'd12 : trans_data <= {12'h100,8'h00}; // 默认
endcase
end
reg [5:0] cnt;
reg sclk_en; //spi配置时钟输出使能
reg spi_clk_reg; // 对输入的5oM的spi时钟进行缓存
reg sdi_reg;
reg spi_conf_en_reg ; //对使能信号进行寄存
always @(posedge clk_100M or negedge rstn)
begin
if(!rstn) begin
spi_conf_en_reg <= 1'b0;
spi_clk_reg <= 1'b0;
end
else begin
spi_conf_en_reg <= spi_conf_en;
spi_clk_reg <= spi_clk;
end
end
wire spi_clk_negedge;
assign spi_clk_negedge = spi_clk_reg &&(~spi_clk) ;//对50M的下降沿进行标定
reg done;
always @(posedge clk_100M or negedge rstn)
begin
if(!rstn) begin
done <= 1'b0;
sclk_en <=1'b1;
config_index <=4'd0;
cnt <=6'd0;
end
else begin
if(spi_conf_en_reg == 1'b0) begin
done <= 1'b0;
sclk_en <=1'b1;
config_index <=4'd0;
cnt <=6'd0;
end
else if(spi_conf_en_reg == 1'b1) begin
if(config_index < 4'd13) begin
if(cnt<24) begin
sclk_en <= 1'b0; //低有效
sdi_reg <=trans_data[23-cnt];
cnt <= cnt+1'd1;
end
else if(cnt<30)
begin
sclk_en <= 1'b1;
cnt <= cnt+1'd1;
end
else
begin
cnt <= 6'd0;
config_index <= config_index+1'b1;
end
end
else begin
sclk_en <= 1'b1;
done <= 1'b1;
end
end
end
end
always @(posedge clk_100M)
begin
sdi <= sdi_reg;
sclk <= (~sclk_en) && spi_clk;
csb <= sclk_en;
config_done <= done ;
end
endmodule
该上模块的顶层调用例化为:
AD9265_SPIconfig u_conf (
.clk_100M(clk_100M),
.spi_clk(clk_50M), //50M 数据手册上给出最小40M
.spi_conf_en(spi_conf_en),
.rstn(rstn),

.sclk(AD_SCLK),
.sdi(AD_SDIO),
.csb(csb),
.config_done(conf_done) //配置完成 为高电平
);
其中的使能spi_conf_en由
always @(posedge clk_100M or negedge rstn)
begin
if(!rstn)
begin
spi_conf_en <= 1'b0;
cnt <= 4'd0;
end
else
begin
if(cnt1 < 8)
begin
spi_conf_en <= 1'b1;
cnt1 <= cnt1+1'b1;
end
else
begin
spi_conf_en <= 1'b1;
cnt1 <= cnt1;
end
end
end
这样一来该模块就可以例化使用了!

猜你喜欢

转载自blog.csdn.net/hxs13551803230/article/details/78836066
ADC