当前位置:   article > 正文

FPGA ADC转换器

fpga adc

FPGA实验报告



一、概述

1、目的及意义:

LTC2308 是亚德诺半导体公司( Analog Devices Inc,ADI) 的一款低噪声 12 位高精度逐次逼近型模 数转换芯片( Analog to Digital Converter,ADC) ,最多可拥有 8 个模拟输入通道,具有高达 500 kSPS 的采 样速率以及一个兼容串行外设接口( Serial Peripheral Interface,SPI) 。

2、主要功能:

将模拟信号转换成数字信号的电路,称为模数转换器(简称A/D转换器或ADC,Analog to Digital Converter),A/D转换的作用是将时间连续、幅值也连续的模拟信号转换为时间离散、幅值也离散的数字信号,因此,A/D转换一般要经过取样、保持、量化及编码4个过程。

二、原理及步骤

1、原理框图:

在这里插入图片描述

在这里插入图片描述

2、工作原理

原理是将输入电压变换成与其平均值成正比的时间间隔,再把时间间隔转换成数字量,属于间接转换。转换过程是:先将开关接通待转换的模拟量Vi,Vi采样输入到积分器,积分器从零开始固定时间T的正向积分,时间T到后,开关再接通与Vi极性相反的基准电压Vref,将Vref输入到积分器进行反向积分,直到输出位0V时停止积分。Vi越大,积分器输出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数值,就是模拟电压Vi所对应的数字量,实现了A/D转换。

3、功能模块简介

在这里插入图片描述

4、实验步骤

1、首先导入adc_ltc2308文件,阅读理解文件,根据要求修改时钟信号为25,运行程序,进行引脚配置。
2、设计实验,编程实现思路,配置引脚如图:
在这里插入图片描述

3、进行signaltap和simulation仿真。
4、调试完成之后然后烧写程序进行验证。
三、程序设计及描述
代码:

module adc_ltc2308(

	output [6:0] hex0,hex1,hex2,hex3,hex5,
	input   clk1,

	// start measure
	input		measure_start,//开始传输
	input		[2:0]	measure_ch,//通道选择
	output	reg	measure_done,//数据传输完毕标志
	
	output	ADC_CONVST,
	output	ADC_SCK,
	output	reg   ADC_SDI,
	input 	ADC_SDO//数据传输
);
//定义一些常量
`define DATA_BITS_NUM		12
`define CMD_BITS_NUM			6
`define CH_NUM					8
`define tWHCONV            3   
`define tCONV     			64 
`define tHCONVST           320 
`define tCONVST_HIGH_START	0 	
`define tCONVST_HIGH_END  	(`tCONVST_HIGH_START+`tWHCONV) 
`define tCONFIG_START		(`tCONVST_HIGH_END) 	
`define tCONFIG_END  		(`tCLK_START+`CMD_BITS_NUM - 1) 	
`define tCLK_START 			(`tCONVST_HIGH_START+`tCONV)
`define tCLK_END 	   		(`tCLK_START+`DATA_BITS_NUM)
`define tDONE 	   			(`tCLK_END+`tHCONVST)

reg	clk;//25mhz
wire	[11:0]	measure_dataread;//数字量显示

//25Mhz时钟
always @(posedge clk1)
begin
	clk <= !clk;
end

// create triggle message: reset_n
//设置复位信号
reg pre_measure_start;
always @ (posedge clk)	
begin
	pre_measure_start <= measure_start;
end

wire reset_n;
assign reset_n = (~pre_measure_start & measure_start)?1'b0:1'b1;

// tick
//时钟信号
reg [15:0] tick;	
always @ (posedge clk or negedge reset_n)	
begin
	if (~reset_n)
		tick <= 0;
	else if (tick < `tDONE)
		tick <= tick + 1;
end

// ADC_CONVST 
assign ADC_CONVST = (tick >= `tCONVST_HIGH_START && tick < `tCONVST_HIGH_END)?1'b1:1'b0;

// ADC_SCK 
reg clk_enable; // must sync to clk in clk low
always @ (negedge clk or negedge reset_n)	 
begin
	if (~reset_n)
		clk_enable <= 1'b0;
	else if ((tick >= `tCLK_START && tick < `tCLK_END))
		clk_enable <= 1'b1;
	else
		clk_enable <= 1'b0;
end

assign ADC_SCK = clk_enable?clk:1'b0;

// read data
//读取的数
reg [(`DATA_BITS_NUM-1):0] read_data;
reg [3:0] write_pos;

assign measure_dataread = read_data;

always @ (negedge clk or negedge reset_n)	
begin
	if (~reset_n)
	begin
		read_data <= 0;
		write_pos <= `DATA_BITS_NUM-1;
	end
	else if (clk_enable)
	begin
		read_data[write_pos] <= ADC_SDO;
		write_pos <= write_pos - 1;
	end
end

// measure done
wire read_ch_done;

assign read_ch_done = (tick == `tDONE)?1'b1:1'b0;

//数据接收完毕标志
always @ (posedge clk or negedge reset_n)	
begin
	if (~reset_n)
		measure_done <= 1'b0;
	else if (read_ch_done)
		measure_done <= 1'b1;
end

// adc channel config

// pre-build config command
reg [(`CMD_BITS_NUM-1):0] config_cmd;


`define UNI_MODE		1'b1   //1: Unipolar, 0:Bipolar
`define SLP_MODE		1'b0   //1: enable sleep

always @(negedge reset_n)
begin
	if (~reset_n)
	begin
		case (measure_ch)
			0 : config_cmd <= {4'h8, `UNI_MODE, `SLP_MODE}; 
			1 : config_cmd <= {4'hC, `UNI_MODE, `SLP_MODE}; 
			2 : config_cmd <= {4'h9, `UNI_MODE, `SLP_MODE}; 
			3 : config_cmd <= {4'hD, `UNI_MODE, `SLP_MODE}; 
			4 : config_cmd <= {4'hA, `UNI_MODE, `SLP_MODE}; 
			5 : config_cmd <= {4'hE, `UNI_MODE, `SLP_MODE}; 
			6 : config_cmd <= {4'hB, `UNI_MODE, `SLP_MODE}; 
			7 : config_cmd <= {4'hF, `UNI_MODE, `SLP_MODE}; 
			default : config_cmd <= {4'hF, 2'b00}; 
		endcase
	end
end

// serial config command to adc chip
wire config_init;
wire config_enable;
wire config_done;
reg [2:0] sdi_index;

assign config_init = (tick == `tCONFIG_START)?1'b1:1'b0;	
assign config_enable = (tick > `tCLK_START && tick <= `tCONFIG_END)?1'b1:1'b0;	// > because this is negative edge triggle
assign config_done = (tick > `tCONFIG_END)?1'b1:1'b0;	
always @(negedge clk)	
begin
	if (config_init)
	begin
		ADC_SDI <= config_cmd[`CMD_BITS_NUM-1];
		sdi_index <= `CMD_BITS_NUM-2;
	end
	else if (config_enable)
	begin
		ADC_SDI <= config_cmd[sdi_index];
		sdi_index <= sdi_index - 1;
	end
	else if (config_done)
		ADC_SDI <= 1'b0; //
end
	
	//数字量显示
	hex_7seg seg0(.hex(measure_dataread%10) ,.sseg(hex0));
	hex_7seg seg1(.hex(measure_dataread%100/10) ,.sseg(hex1));
	hex_7seg seg2(.hex(measure_dataread%1000/100) ,.sseg(hex2));
	hex_7seg seg3(.hex(measure_dataread/1000) ,.sseg(hex3));
	//通道显示
	hex_7seg seg4(.hex(measure_ch) ,.sseg(hex5));

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

四、仿真与综合测试
1、 仿真图
在这里插入图片描述
在这里插入图片描述

2、 实物图
拓展题:
这里显示的四位数就是模拟量, 在这里插入图片描述

A0=0 AM=4.095 N0=0,NM=4095,NX(实际显示量)如图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

五、总结
1、该实例可通过主机(FPGA)通过选择不同的通道与不同的从机进行数据交换,且可以通过拨码开关调整收发状态。
2、ADC 转换器及其控制电路作为联系模拟信号和数字系统必不可少的部分,其重要性已经不言而喻。利用硬件描述语言( Hardware Description Language,HDL) 来设计 ADC 的控制系统,不但可以更容易 了解 ADC 芯片的时序和控制方法,还能最大限度的发挥其性能,并方便于各种 FPGA 芯片上移植应用。 本文通过对 LTC2308 的具体时序特点进行分析,采用 Verilog HDL 基于行为描述设计其控制器,并进一 步以 Intel 的 Avalon 总线为例,封装成基于 Memory Mapped 的 IP 核,方便系统集成使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/459331
推荐阅读
相关标签
  

闽ICP备14008679号