AD0804模数转换实验报告

  • 格式:docx
  • 大小:1.53 MB
  • 文档页数:13

FPGA实验报告题目:ADC0804并行A/D实验班级:20110821*名:***学号:**********指导教师:***日期:2014.04.25ADC0804实验报告一.实验原理1.1 输入模拟量转数字量实验原理本实验要求利用ADC0804实现输入模拟量到数字量的转换,并将转换结果在数码管上输出。

由已知电路得ADC0804的输入模拟电压用一个滑动变阻器对电源分压得到,它的8位输出AD0~AD7与FPGA的8个管脚相连,即input [7:0] data。

而data就是数码管的动态显示数据。

通过循环扫描,使数码管正确的显示出data的十进制数形式。

以下为实验箱内ADC0804与FPGA的连接关系,图2.ADC0804与FPGA连接图二.实验应用的器件分析2.1 ADC0804原理ADC0804是8位全MOS中速逐次逼近式A/D转换器,片内有三态数据输出锁存器,可以和单片机直接接口。

单通道输入,转换时间大约100us。

ADC0804转换时序是:当CS=0许可进行A/D转换。

WR由低到高时,A/D开始转换,一次转换共需要66-73个时钟周期。

CS与WR同时有效时启动A/D转换,转换结束产生INTR信号(低电平有效),可供查询或者中断信号。

在CS和RD的控制下可以读取数据结果。

ADC0804 为一只具有20引脚8位CMOS 连续近似的A/D 转换器,其规格如下:(1) 高阻抗状态输出(2) 分辨率:8 位(0~255)(3) 存取时间:135 ms(4) 转换时间:100 ms(5) 总误差:-1~+1LSB(6) 工作温度:ADC0804C为0度~70度;ADC0804L为-40 度~85 度(7) 模拟输入电压范围:0V~5V(8) 参考电压:2.5V(9) 工作电压:5V(10) 输出为三态结构1. 接脚说明见图1:2. PIN1 (CS ):Chip Select,与RD、WR 接脚的输入电压高低一起判断读取或写入与否,当其为低位准(low) 时会active。

3. PIN2 ( RD ):Read。

当CS 、RD 皆为低位准(low) 时,ADC0804 会将转换后的数字讯号经由DB7 ~ DB0 输出至其它处理单元。

4. PIN3 (WR ):启动转换的控制讯号。

当CS 、WR 皆为低位准(low) 时ADC0804 做清除的动作,系统重置。

当WR 由0→1且CS =0 时,ADC0804会开始转换信号,此时INTR 设定为高位准(high)。

5. PIN4、PIN19 (CLK IN、CLKR):频率输入/输出。

频率输入可连接处理单元的讯号频率范围为100 kHz 至800 kHz。

而频率输出频率最大值无法大于640KHz,一般可选用外部或内部来提供频率。

若在CLK R 及CLK IN 加上电阻及电容,则可产生ADC 工作所需的时序,其频率约为:6. PIN5 ( INTR ):中断请求。

转换期间为高位准(high),等到转换完毕时INTR 会变为低位准(low)告知其它的处理单元已转换完成,可读取数字数据。

7. PIN6、PIN7 (VIN(+)、VIN(-)):差动模拟讯号的输入端。

输入电压VIN=VIN(+)-VIN(-),通常使用单端输入,而将VIN(-)接地。

8. PIN8 (A GND):模拟电压的接地端。

9. PIN9 (VREF∕2)∶模拟参考电压输入端。

VREF 为模拟输入电压VIN 的上限值。

若PIN9空接,则VIN 的上限值即为VCC。

10. PIN10 (D GND)∶数字电压的接地端。

11. PIN11 ~ PIN18 (DB7 ~ DB0)∶转换后之数字数据输出端。

12. PIN20 (Vcc)∶驱动电压输入端。

图1.ADC0804引脚图图2.ADC0804典型应用电路其中,图3.ADC0804基本电路图4.ADC0804内部构造图5.ADC0804时序图如下为时序分析:1. 首先CS片选端拉低AD0804时能。

2. 第三引脚(WR)来一个下降沿脉冲,开始进行模拟/数字信号转换。

3. 转换完毕后AD0804中断输出引脚INTR将高电位将至低电位。

4. 装换完成后在CS低电平期间AD0804第二引脚来一个下降沿脉冲读取AD转换结果。

三.实验任务AD0804 是A/D 转换器。

从ADC0804的通道IN输入0~5V之间的模拟量,转换成数字量在数码管上以十进制显示出来。

任务1:将数码管中的显示数字对应单位“V”的位置加上小数点,使原来以“mV”为单位的输出转变为以“V”为单位。

任务2:四.实验程序4.1任务1程序要想在数码管上从右往左数第4位显示小数点,可以用变量“jishu”的状态作为判断条件,当seg_com选中第4位时,jishu=3'b100,所以我在程序中增加了下面一段用来显示小数点:if(jishu==3'b100)begincase(shuju)4'b0000:seg_data=8'b01000000;//0.4'b0001:seg_data=8'b01111001;//1.4'b0010:seg_data=8'b00100100;//2.4'b0011:seg_data=8'b00110000;//3.4'b0100:seg_data=8'b00011001;//4.4'b0101:seg_data=8'b00010010;//5.4'b0110:seg_data=8'b00000010;//6.4'b0111:seg_data=8'b01111000;//7.4'b1000:seg_data=8'b00000000;//8.4'b1001:seg_data=8'b00010000;//9.default: seg_data=8'b01111111;endcase4.2任务2程序五.管脚分配任务2管脚(任务1的管脚包括在任务2中)图4.ADC0804管脚分配图六.实验结果6.1任务1结果顺时针旋转滑动变阻器旋钮,数码管显示由4.980变换到0.000。

逆时针旋转则逐渐由小变大。

6.2任务2 结果当数码管显示的输出值为0.000时,点阵中左上方第一列全暗,随着数码管显示值的增加,点阵的那列从上到下依次表示ADC0804的输出AD0~AD7,所以点阵上半部分变化比较灵敏。

当码管显示值为4.980时,点阵全亮。

之所以数码管不能显示5.000,是因为公式(vo=5*data_led*1000/256)中data_led最大值只能是255。

七.实验心得通过本次实验,加深了对分频模块的理解与应用.在实验中,分频的作用是非常大的,只有稳定的频率,才能够使得各个芯片和期间正常工作,只有真正的了解分频的原理和方法,才可以独立展开程序的读和写.此外我还学习到了8位数码管的动态显示方法。

本次实验中,通过上课加小数点的练习,加深了我对动态显示的理解和灵活应用。

通过实验,在课下准备与课上练习中,我的编程和逻辑能力进一步得到了锻炼和提高。

八.参考文献[1] 王金明. 《数字系统设计与Verilog HDL》第3版、第2版, 电子工业出版社, 2009、2005. TP271/W24.[2] 夏宇闻. 《Verilog数字系统设计教程》, 北京航空航天大学出版社, 第1、2版, 2008. TP312VH/X31.[3] 蒋璇,臧春华. 《数字系统设计与PLD应用技术》, 电子工业出版社, TP271/J63.附录1任务2程序:module jia0804(clkin,data,seg_com,seg_data,adcs,rd,wr,,SEL,X,LL);//add.......+dianzhen programinput clkin; //时钟输入50MHZinput [7:0] data;output reg[7:0] seg_com; //位选output reg[7:0] seg_data; //段选output reg rd,wr;output wire adcs;output [2:0] SEL;output [7:0] X;output [5:1] LL;parameter CLK_FREQ = 'D50_000_000; //系统时钟50MHZparameter CLK_out_FREQ = 'D5000; //输出时钟'D500_000;parameter CLK_out_FREQ2 = 'D50000; //输出时钟$$$ gaiyaparameter state_pre = 0;parameter state_pre2 = 1;parameter state_start = 2;parameter state_conv = 3;parameter state_wait = 4;parameter state_readpre = 5;parameter state_read = 6;reg [7:0] data_led; //LED显示数据reg [31:0] DCLK_DIV;reg[31:0] DCLK_DIV2;reg clkout; //becom zhongjian variable reg clkout2; //提供显示数据时钟reg [3:0] state = state_pre;reg[7:0] jishu;reg[3:0] shuju;reg[31:0] vo;//******分频always @(posedge clkin)beginif(DCLK_DIV < (CLK_FREQ / CLK_out_FREQ))DCLK_DIV <= DCLK_DIV+1'b1;elsebeginDCLK_DIV <= 0;clkout <= ~clkout;endendalways @(posedge clkin)beginif(DCLK_DIV2 < (CLK_FREQ / CLK_out_FREQ2))DCLK_DIV2 <= DCLK_DIV2+1'b1;elsebeginif(clkout2==1)beginif(jishu<7)jishu=jishu+1;else jishu=0;endDCLK_DIV2 <= 0;clkout2 <= ~clkout2;endend//*******数码管显示always @(posedge clkout2)beginvo=5*data_led*1000/256;case(jishu)3'b100:shuju=(vo)/1000;3'b101:shuju=((vo)%1000)/100;3'b110:shuju=(((vo)%1000)%100)/10;3'b111:shuju=(((vo)%1000)%100)%10;default:shuju=4'b0000;endcasecase(jishu)3'b000: seg_com=8'b00000001;3'b001: seg_com=8'b00000010;3'b010: seg_com=8'b00000100;3'b011: seg_com=8'b00001000;3'b100: seg_com=8'b00010000;3'b101: seg_com=8'b00100000;3'b110: seg_com=8'b01000000;3'b111: seg_com=8'b10000000;//default: out=6'b00000;endcaseif(jishu==3'b100)//if gaowei,add a pointbegincase(shuju)4'b0000:seg_data=8'b01000000;//0.4'b0001:seg_data=8'b01111001;//1.4'b0010:seg_data=8'b00100100;//2.4'b0011:seg_data=8'b00110000;//3.4'b0100:seg_data=8'b00011001;//4.4'b0101:seg_data=8'b00010010;//5.4'b0110:seg_data=8'b00000010;//6.4'b0111:seg_data=8'b01111000;//7.4'b1000:seg_data=8'b00000000;//8.4'b1001:seg_data=8'b00010000;//9.default: seg_data=8'b01111111;endcaseendelsebegincase(shuju)4'b0000:seg_data=8'b11000000;//04'b0001:seg_data=8'b11111001;//14'b0010:seg_data=8'b10100100;//24'b0011:seg_data=8'b10110000;//34'b0100:seg_data=8'b10011001;//44'b0101:seg_data=8'b10010010;//54'b0110:seg_data=8'b10000010;//64'b0111:seg_data=8'b11111000;//74'b1000:seg_data=8'b10000000;//84'b1001:seg_data=8'b10010000;//9default: seg_data=8'b11111111;endcaseendend//********led zhenassign X=data_led; //********ADC0804时序assign adcs=0;always @ (negedge clkout)begincase (state)state_pre : //0beginwr<=0;rd<=1;state <=state_pre2;endstate_pre2 : //1beginwr<=1;rd<=1;state <=state_start;endstate_start ://2beginwr<=1;rd<=0;state <=state_conv;endstate_conv : //3begindata_led = data; //开始读数据state <=state_wait;endstate_wait : //4beginwr<=1;rd<=1;state <= state_pre; //重新回到状态1 进行下一次AD转换endendcaseend//*******fuyongassign SEL[0]=0;assign SEL[1]=1;assign SEL[2]=0;assign LL=0;endmodule附录2实验结果照片:旋动滑动变阻器模拟电压显示值从0.000V开始,逐次递增。