赞
踩
FPGA实验报告
LTC2308 是亚德诺半导体公司( Analog Devices Inc,ADI) 的一款低噪声 12 位高精度逐次逼近型模 数转换芯片( Analog to Digital Converter,ADC) ,最多可拥有 8 个模拟输入通道,具有高达 500 kSPS 的采 样速率以及一个兼容串行外设接口( Serial Peripheral Interface,SPI) 。
将模拟信号转换成数字信号的电路,称为模数转换器(简称A/D转换器或ADC,Analog to Digital Converter),A/D转换的作用是将时间连续、幅值也连续的模拟信号转换为时间离散、幅值也离散的数字信号,因此,A/D转换一般要经过取样、保持、量化及编码4个过程。
原理是将输入电压变换成与其平均值成正比的时间间隔,再把时间间隔转换成数字量,属于间接转换。转换过程是:先将开关接通待转换的模拟量Vi,Vi采样输入到积分器,积分器从零开始固定时间T的正向积分,时间T到后,开关再接通与Vi极性相反的基准电压Vref,将Vref输入到积分器进行反向积分,直到输出位0V时停止积分。Vi越大,积分器输出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数值,就是模拟电压Vi所对应的数字量,实现了A/D转换。
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、 实物图
拓展题:
这里显示的四位数就是模拟量,
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 核,方便系统集成使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。