实验十二 DA及DDS 12.1 R-2R DA输出实验

一、实验设计目标

编写程序,使用FPGA驱动R-2R电路,输出正弦波。

二、实验设计思路

任意复杂的数字电路都可以使用FPGA实现,但当关联上模拟信号时,就需要AD、DA芯片作为转换器件。AD是把模拟信号转变成数字信号,再送给FPGA做数字算法处理;DA则是将FPGA处理过后的数字信号转变成模拟信号。

本实验由FPGA的8个管脚输出的二进制数值,经过R-2R电路转换后输出相应的模拟值,改变输入的数字值便可得到幅度变化的模拟信号输出。R-2R DAC的实物位置和电路原理图如图2.1所示。

img

img

2.1 R-2R DAC****电路

输出电压与DAC_D0-DAC_D7的码值关系为:DAC_VOUT = 3.3V * 码值/256

本实验使用FPGA驱动R-2R电路,由按键KEY0控制R-2R DAC的输入码值是来自拨动开关SW0-7,还是来自计数器产生的循环递增信号。

三、功能模块图与输入输出引脚说明

下面介绍一下顶层模块各引脚的功能:

(1)CLK:50MHz的时钟信号输入。

(2)DAC_Data:输送到R-2R电路的数字值,共有八位,引脚与LED复用。

(3)row:矩阵按键的行信号;这里固定输出4’b0111;

(4)col:矩阵按键的列信号;配合行线输出的4’b0111来判断KEY0和KEY1是否按下。其中col[0]/KEY0用来选通DAC输入数据来源,col[1]/KEY1用来实现低电平有效的全局复位。

(5)SW_In:拨动开关输入;

四、程序设计

img

21-31:从50MHz分频产生100KHz的时钟

35-43:使用100KHz时钟产生0-255的循环计数

46:使用按键KEY0选择送给DAC的码值是来自拨动开关还是计数器输出

五、FPGA管脚配置

set_pin_assignment { CLK } { LOCATION = R7; IOSTANDARD = LVCMOS33; }

set_pin_assignment { div_clk } { LOCATION = T4; IOSTANDARD = LVCMOS33; }

set_pin_assignment { col[0] } { LOCATION = E11; IOSTANDARD = LVCMOS33; }

set_pin_assignment { col[1] } { LOCATION = D11; IOSTANDARD = LVCMOS33; }

set_pin_assignment { DAC_Data[0] } { LOCATION = B14; IOSTANDARD = LVCMOS33; }

set_pin_assignment { DAC_Data[1] } { LOCATION = B15; IOSTANDARD = LVCMOS33; }

set_pin_assignment { DAC_Data[2] } { LOCATION = B16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { DAC_Data[3] } { LOCATION = C15; IOSTANDARD = LVCMOS33; }

set_pin_assignment { DAC_Data[4] } { LOCATION = C16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { DAC_Data[5] } { LOCATION = E13; IOSTANDARD = LVCMOS33; }

set_pin_assignment { DAC_Data[6] } { LOCATION = E16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { DAC_Data[7]} { LOCATION = F16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { row[0] } { LOCATION = D9; IOSTANDARD = LVCMOS33; }

set_pin_assignment { row[1] } { LOCATION = F9; IOSTANDARD = LVCMOS33; }

set_pin_assignment { row[2] } { LOCATION = C10; IOSTANDARD = LVCMOS33; }

set_pin_assignment { row[3] } { LOCATION = E10; IOSTANDARD = LVCMOS33; }

set_pin_assignment { SW_In[0] } { LOCATION = A9; IOSTANDARD = LVCMOS33; }

set_pin_assignment { SW_In[1] } { LOCATION = A10; IOSTANDARD = LVCMOS33; }

set_pin_assignment { SW_In[2] } { LOCATION = B10; IOSTANDARD = LVCMOS33; }

set_pin_assignment { SW_In[3] } { LOCATION = A11; IOSTANDARD = LVCMOS33; }

set_pin_assignment { SW_In[4] } { LOCATION = A12; IOSTANDARD = LVCMOS33; }

set_pin_assignment { SW_In[5] } { LOCATION = B12; IOSTANDARD = LVCMOS33; }

set_pin_assignment { SW_In[6] } { LOCATION = A13; IOSTANDARD = LVCMOS33; }

set_pin_assignment { SW_In[7] } { LOCATION = A14; IOSTANDARD = LVCMOS33; }

六、实验结果

当KEY0未按下时,DAC输出为SW_In的数字码值转换为的模拟电压。例如当SW_In=8’b00111111时,示波器采到DAC输出为815mV,与计算得到的3.3V*63/256 = 812mV是吻合的。其他码值与电压的关系可以自行验证。

img

当KEY0按下时,DAC输出dac_cnt的计数值,该计数值从0-255循环,输出的模拟波形如下图所采集,锯齿波的频率为100KHz/256 = 390Hz,峰峰值3.3V。

img

2.6 R-2R DAC输出的锯齿波