当前位置:文档之家› 数电课程设计报告

数电课程设计报告

1 数电课程设计报告 姓名:李鹏鹏 学号:04113063 指导老师:董瑞军 2

目 录 1.概述 ---------------------------------------------------3 2.原理图 --------------------------------------------------3 3.FPGA与ADC0809VHDL控制程序 ------------------------------3 4.FPGA中储存模块 -----------------------------------------7 5.储存器控制模块 ----------------------------------------8 6.FPGA与DAC0832的连接和控制 ------------------------------11 7.分频模块 ---------------------------------------14 8.顶层模块设计 ----------------------------------------15 9.RTL视图 ----------------------------------------------18 10.研究体会 -----------------------------------------------19 3

一.概述 课题要求通过FPGA对A/D和D/A转换的控制,使得FPGA的输入量和输出量一致,根据原理设计出如下框架图。本报告主要内容从A/D转换器(ADC0809)前端的测温电路开始,经过取样保持电路,详细介绍了A/D转换器与FPGA芯片VHDL控制程序,以及FPGA的对数据的储存和控制模块,之后说明D/A转换器(DAC0832)控制程序和转换器后端的电路图,并完成顶层模块设计以各模块,主要过程在计算机上进行仿真,报告中附以详尽说明的仿真波形和统计报告。

二.原理图

若模拟信号变化速度较快,需要在A/D之前加入采样保持电路,以保证转换精度。在这里选择LF398(LF398是一个专用的采样保持芯片,它具有很高的直流精度和较高的采样速率,器件的动态性能和保持性能可以通过合适的外接保持电容达到最佳。)模拟输入量U0(t)从IP进入,采样输出量从OP口输出至ADC0809

的IN口(IN0-IN7的选择由ADDA-ADDC决定),逻辑输入控制端与START连接。ADC0809和FPGA的连接和FPGA和DAC0832的连接如图,而在DAC0832后端,由于输出的为模拟电流量,若需输出电压量,则可加入如图电路。

三.FPGA与ADC0809VHDL控制程序 ADC0809的引脚图如下 IN0-IN7模拟量输入通道 ADDA,ADDB,ADDC---输入通道选择地址,按其状态选择输入通道。 4

START---A/D转换启动信号。高电平有效。 ALE---地址锁存允许信号。当ALE上升沿时,把ADDA-ADDC的地址状态 传给地址锁存器。 CLK---时钟信号。因本芯片中无时钟电路,所以需由外部提供。 EOC---转换结束信号。EOC为低电平表示转换正在进行,当EOC变为高 电平,表示转换结束。 OE---输出允许信号。当oe=1时,将转换完成的数据输出。

分析ADC0809的工作原理后,得到其工作时序图:

于是将整个转换过程分为5个状态,并用状态图表示:

根据设定的状态图,写出VHDL控制程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --库和程序包的调用 ENTITY ADC0809 IS PORT( --定义端口参数 D:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --由ADC0809 输出的已转换完成的8 位数据 CLK:IN STD_LOGIC; --工作时钟 5

EOC:IN STD_LOGIC; --转换结束输出信号;转换过程中为低电平,转换结束后为高电平ALE:OUT STD_LOGIC; --地址锁存允许信号,高有效 START:OUT STD_LOGIC; --A/D转换启动信号,在其下降沿开始A/D转换过程 OE:OUT STD_LOGIC; --输出允许信号,高有效。当OE=1时,将数据送出 ADDA:OUT STD_LOGIC; --信号通道控制信号 ADDB:OUT STD_LOGIC; ADDC:OUT STD_LOGIC; LOCK0:OUT STD_LOGIC; --观察数据锁存时钟 Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--8 位数据输出 END ADC0809; ARCHITECTURE behave OF ADC0809 IS TYPE states IS(st0,st1,st2,st3,st4); --用枚举类型进行状态定义 SIGNAL current_state,next_state:states:=st0; --状态信号定义 SIGNAL REGL:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LOCK:STD_LOGIC; --转换后数据输出锁存时钟信号 BEGIN ADDA<='1'; ADDB<='0';ADDC<='0'; --选取信号通道,这里选择“111”,可按需更改 Q<=REGL;LOCK0<=LOCK; COMBIN:PROCESS(current_state,EOC)BEGIN --组合逻辑进程,规定各状态转换方式 CASE current_state IS WHEN st0=>ALE<='0';START<='0';LOCK<='0';OE<='0'; next_state<=st1; --对ADC0809进行初始化 WHEN st1=>ALE<='1';START<='1';LOCK<='0';OE<='0'; next_state<=st2; --启动转换过程 WHEN st2=>ALE<='0';START<='0';LOCK<='0';OE<='0'; IF(EOC='1')THEN next_state<=st3; --EOC=1 表明转换结束 ELSE next_state<=st2; ---EOC=0,表示转换未结束,继续转换过程 END IF; WHEN st3=>ALE<='0';START<='0';LOCK<='0';OE<='1'; next_state<=st4; --打开输出锁存器的三态门,将数据送入FPGA WHEN st4=>ALE<='0';START<='0';LOCK<='1';OE<='1';next_state<=st0; --返回状态o,继续下一次转换 WHEN OTHERS=>next_state<=st0; END CASE; END PROCESS COMBIAN; REG:PROCESS(CLK) --时序进程 BEGIN IF(CLK'EVENT AND CLK='1')THEN current_state<=next_state; END IF; END PROCESS REG; SAVE:PROCESS(LOCK) --锁存进程,在此进程中,在LOCK 转为高电平时,把已转换好的数据锁入 BEGIN IF LOCK='1'AND LOCK'EVENT THEN REGL<=D; END IF; 6

END PROCESS SAVE; END behave;

将程序载入QuartusⅡ,保存并start compilation,完成后得到flow summary报告如下:

生成Vector Waveform File,进行Timing simulation,此处因进行理论仿真并,故EOC由手动输入周期信号,同理CLK时钟亦为人为设定(实际因fpga的时钟频率不符adc0809所需的时钟频率,需对fpga进行分频后把时钟输给adc0809,具体分频模块详见后文),D设定随机数,得到仿真波形图如下:

如图:从330ns出开始,整个状态处于状态0,此时ALE和START都为低电平,A/D转换未启动。当CLK的上升沿来到,ALE地址锁存允许信号和START启动信号转为高电平,接着EOC转换结束信号由高转为低,状态1启动转换。在状态2时,转换过程继续,经过数个时钟周期等待后,EOC转换结束信号由低变为高电平,转换完成。伴随OE输出允许信号由低转高,进入状态3,ADC将已经转换好的数据输出;状态4时,LOCK变为高电平,这时转换好的 D 端口的转换数据被储存在寄存器中,至此一个转换过程完成。之后又进入状态0,等待下次转换。 7

四.FPGA中存储模块 在fpga中定义一储存模块,将A/D转换好的数据暂时保存,待控制程序使储存器按需要输出A/D数据至D/A转换模块。 储存模块的设计如下:

Clk--时钟信号端口;Cs---片选信号端口,低为选中;oe---使能端口,输入低为读,高为写;add[07-0]--地址端口;data_i[7-0]数据输入端口;data_o[7-0]数据输出端口;

程序如下: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ram is generic(width: integer := 8; -- 用与修改储存器数据宽度 depth: integer := 8); -- 用于修改地址长度 port( clk : in std_logic; addr : in std_logic_vector(depth - 1 downto 0); cs : in std_logic; --片选 oe : in std_logic; --使能 data_i: in std_logic_vector(width - 1 downto 0); data_o: out std_logic_vector(width - 1 downto 0) ); end ram; architecture Behavioral of ram is type ram is array(2 ** depth - 1 downto 0) of std_logic_vector(width - 1 downto 0); ------用于储存数据 signal ram1 : ram; begin process(clk) begin if(clk'event and clk = '1') then if(cs = '0') then if(oe = '0') then --------当cs有效选中,oe为低读时,储存器输出保存的数据 data_o <= ram1(conv_integer(addr)); else

相关主题