当前位置:   article > 正文

AD7606时序分析与verilog HDL实现_ad7606 verilog

ad7606 verilog

AD7606是16位,8/6/4通道同步采样模数转换芯片,各器件内置模拟输入钳位保护,二阶抗混叠滤波器,跟踪保持放大器,16位电荷再分配逐次逼近式模数转换器。
在这里插入图片描述
其中:
CONVST:启动转换信号
busy:转换完成信号
cs:片选信号
reset:复位信号
读取AD数据时序如下:
在这里插入图片描述
AD采样流程如下:
1、拉低CONVST信号启动转换
2、读取busy信号,当busy信号为低时,说明转换完成,可以读取采样数据,然后触发中断去读取数据
3、读取数据时,先使能CS信号,然后变换RD信号读取数据(注意:每读取一个通道的数据,RD使能到禁止使能一次,AD7606CS保持使能,不能喝RD同步变化,这点在有的AD上面有所不同如MAX125,本人在更换AD芯片时没有注意这点时序变化,导致查了两天时间)
4、8个通道数据读取完成后禁止使能CS,等待下次读取。
当AD独享数据总线时刻采用RD和CS并联的结构,如下图:
在这里插入图片描述
其时序如下图所示:
在这里插入图片描述

多句嘴,这个时序如果用FPGA实现的话,效率会很高,更能满足采样率要求高的设计。

verilog HDL设计实现如下所示:

//*******************************************************//
//               采样模块模块    6片7606AD                 //
//*******************************************************//
module AD7606_6(
		input rst_n,/*系统复位*/
		input clk_50m,/*时钟*/
		input [31:0]sampleCnt,/*采样时钟计数*/
		input [7:0]inS_data,/*AD数据总线*/
		input [5:0]buzy,/*AD忙信号*/
		output reg rst,/*AD复位总信号*/
		output reg convst,/*AD数据装换总信号*/
		output reg [5:0]cs_n,/*AD片选信号*/
		output reg rd_n,/*AD读信号*/
		output reg IsDataReady, /*一点数据完成读取*/
		output reg [7:0]DataOut/*AD数据*/
		);
		
parameter   [13:0]    AD_RESET_P    = 14'b00_0000_0000_0000;
parameter   [13:0]    AD_RESET_N   	= 14'b00_0000_0000_0001;
parameter   [13:0]    AD_START_SP		= 14'b00_0000_0000_0010;
parameter   [13:0]    AD_CONVST_P  	= 14'b00_0000_0000_0100;
parameter   [13:0]    AD_BUSY_P   	= 14'b00_0000_0000_1000;
parameter   [13:0]    AD_BUSY_N   	= 14'b00_0000_0001_0000;
parameter   [13:0]    AD_CS_N      	= 14'b00_0000_0010_0000; 
parameter   [13:0]    AD_RD_N      	= 14'b00_0000_1000_0000; 
parameter   [13:0]    AD_GET_DATA  	= 14'b00_0001_0000_0000; 
parameter   [13:0]    AD_RD_P 			= 14'b00_0100_0000_0000;
parameter   [13:0]    AD_RD_P1			= 14'b00_1000_0000_0000;
parameter   [13:0]    AD_CS_P 			= 14'b01_0000_0000_0000;
parameter   [13:0]    AD_CS_P1 			= 14'b10_0000_0000_0000;

//当前ad采样序号
reg[3:0] ad_index;//当前AD序号
reg[4:0] ad_data_index;//当前AD数据序号
//
		
parameter AD_NUM = 6;		//

reg clk_ad;
reg ad_start_sp_neg_tri;
reg[31:0] clk_ad_cnt;

always @(posedge clk_50m or negedge rst_n)
begin
	if(!rst_n)begin
		clk_ad <= 1'b0;
		clk_ad_cnt <= 32'd0;
	end
	else if(clk_ad_cnt>=sampleCnt)begin//
		clk_ad <= ~clk_ad;
		clk_ad_cnt <= 32'd0;
	end
	else begin
		clk_ad_cnt <= clk_ad_cnt +1'b1;
	end

end

/*AD采样状态转换*/
reg[13:0] current_state;//当前状态
reg ad_count_ena;//计数器使能
reg[23:0] ad_count;//计数器
//
/*AD采样状态转换*/
always @(posedge clk_50m or negedge rst_n)
begin
	if(!rst_n)begin
		current_state <= AD_RESET_P;
		ad_count_ena <= 1'b0;
		ad_count <= 24'd0;
		rst <= 1'b0;
		convst <= 1'b0;
		rd_n <= 1'b1;
		cs_n <= {AD_NUM{1'b1}};
		IsDataReady <= 1'b0;
	end
	else if(ad_count_ena) begin
	if(ad_count<=24'd1)
			ad_count_ena <= 1'b0;
		else
			ad_count <= ad_count-1'b1;
	end
	else begin
		case(current_state)
			AD_RESET_P:begin
				current_state <= AD_RESET_N;
				ad_count_ena <= 1'b1;
				ad_count <= 24'd3;
				
				rst <= 1'b1;
				convst <= 1'b0;
				rd_n <= 1'b1;
				cs_n <= {AD_NUM{1'b1}};
			end
			AD_RESET_N:begin
				current_state <= AD_START_SP;
				ad_count_ena <= 1'b1;
				ad_count <= 24'd2;
				
				rst <= 1'b0;
				convst <= 1'b0;
				rd_n <= 1'b1;
				cs_n <= {AD_NUM{1'b1}};
			end
			AD_START_SP:begin
				if(ad_start_sp_neg_tri!=clk_ad)begin
					current_state <= AD_CONVST_P;
					ad_count_ena <= 1'b1;
					ad_count <= 24'd3;//等待buzy信号
					ad_start_sp_neg_tri<=clk_ad;
					
					convst <= 1'b1;//AD转换开始
					rd_n <= 1'b1;
					cs_n <= {AD_NUM{1'b1}};
				end
				else begin
					current_state <= AD_START_SP;//等待。。。
					ad_count_ena <= 1'b0;
					ad_count <= 24'd0;
					
					convst <= 1'b0;
					rd_n <= 1'b1;
					cs_n <= {AD_NUM{1'b1}};
				end
			end
			AD_CONVST_P:begin
				if(buzy == {AD_NUM{1'd1}})begin
					current_state <= AD_BUSY_P;
					ad_count_ena <= 1'b1;
					ad_count <= 24'd230;
				end
				else begin
					current_state <= AD_RESET_P;
					ad_count_ena <= 1'b1;
					ad_count <= 24'd6;
					rst <= 1'b1;
				end
				
				rd_n <= 1'b1;
				cs_n <= {AD_NUM{1'b1}};
			end
			AD_BUSY_P:begin
				
				
				if(buzy == {AD_NUM{1'd0}})begin
					current_state <= AD_BUSY_N;
					ad_count_ena <= 1'b1;
					ad_count <= 24'd1;
					
					ad_index <=4'd0;//AD序号清零
				end
				else begin
					current_state <= AD_BUSY_P;
					ad_count_ena <= 1'b1;
					ad_count <= 24'd6;
				end
			end
			AD_BUSY_N:begin
				current_state <= AD_CS_N;
				ad_count_ena <= 1'b0;
				ad_count <= 24'd0;
			end
			AD_CS_N:begin
				current_state <= AD_RD_N;
				ad_count_ena <= 1'b1;
				ad_count <= 24'd2;
				
				ad_data_index <=5'd0;
				cs_n <= {AD_NUM{1'b1}} & (~({6'b000001}<<ad_index));
			end
			AD_RD_N:begin
				current_state <= AD_GET_DATA;
				ad_count_ena <= 1'b1;
				ad_count <= 24'd2;
				
				rd_n <= 1'b0;//AD读使能	
			end
			AD_GET_DATA:begin
				current_state <= AD_RD_P;
				ad_count_ena <= 1'b0;
				ad_count <= 24'd0;
				DataOut <= inS_data;//取AD数据	
				IsDataReady <= 1'b1;
			end
			AD_RD_P:begin
				current_state <= AD_RD_P1;
				ad_count_ena <= 1'b1;
				ad_count <= 24'd2;
				
				IsDataReady <= 1'b0;
				ad_data_index <= ad_data_index +1'b1;
				rd_n <= 1'b1;//AD读禁能
			end
			AD_RD_P1:begin
				if(ad_data_index==5'd16)begin
					current_state <= AD_CS_P;	
					ad_count_ena <= 1'b1;
					ad_count <= 24'd1;				
				end
				else begin
					current_state <= AD_RD_N;
					ad_count_ena <= 1'b0;
					ad_count <= 24'd0;
				end
			end
			AD_CS_P:begin
				current_state <= AD_CS_P1;
				ad_count_ena <= 1'b1;
				ad_count <= 24'd2;
				
				ad_index <= ad_index +1'b1;
				cs_n <= {AD_NUM{1'b1}};//片选结束
			end
			AD_CS_P1:begin
				if(ad_index==AD_NUM)begin
					current_state <= AD_START_SP;
					convst <= 1'b0;//AD转换停止
				end
				else begin
					current_state <= AD_CS_N;
				end
			end
		endcase
	end
end

endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/829453
推荐阅读
相关标签
  

闽ICP备14008679号