技术报告
电信082班 084775240 周霞
(合作者:电信082班 084775228 吴迪)
指导教师:倪海燕
2010-5-27
摘要:本设计通过A/D转换和D/A转换实现输入信号与输出信号的变化。通过实验箱上的模式3的ADC输入正弦波信号,设计按键选择,有3种模式分别是直接回放,单次回放,循环回放和定点回放。 关键字:信号 回放 模式选择
一、 实验要求
1. 实现输入,存储,回放信号
2. 回放模式选择(直接回放,单次波形回放,循环回放,分段存储定点回放等)
二、 总原理图
三、 系统总体方案设计
根据实验要求,TLC5510A 是采样率最高为20MHz的8同步相量测量装置位并行高速ADC 汽结构,FPGA的PIO48输出信号控制ADC1的输出使能信号OE(低电平有效);PIO15为转换时钟信号CLK;AD转换结果送至PIO16~PIO23,并且同时显示在数码管1和数码管2上。ADC的模拟信号输入端在实验箱的左侧,允许输入0~5V的信号。
转换关系:DATA=255×Ain/5
数据从采集到转换结束需要两个半时钟周期
四、 软件电路的设计
4.1控制器的设计
用VHDL语言编写控制器的程序,要有读写使能和模式选择。用choose[2]的四个状态分别表示直接回放,单次回放,循环回放和定点回放。
程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity control is
三方通话port ( clk:in std_logic; --时钟
writ:in std_logic; --读写使能
en:in std_logic; --使能
choose:in std_logic_vector(1 downto 0); --模式选择
ch:in std_logic_vector(1 downto 0); --阶段选择
enout:out std_logic; --读写使能输出
adr:out std_logic_vector(9 downto 0) ); --地址
end entity control;
architecture behave of control is
signal count1:std_logic_vector(9 downto 0);
signal count11:std_logic_vector(9 downto 0);
signal count2:std_logic_vector(9 downto 0);
自制室内单杠signal count22:std_logic_vector(9 downto 0);
begin
process(writ,en,ch,choose)
begin
if(en='1')then count1<="0000000000";count11<="0000000000";
count2<="0000000000";count22<="0000000000";
elsif (clk'event and clk='1')then
if(choose="01")then ---- 单次回放
if(writ='0')then enout<='1';adr<=count1;
if(count1="1111111111")then count1<="1111111111";
else count1<=count1+1; 彩硒鼓
end if;
else enout<='0';adr<=count2;
if(count2="1111111111")then count2<="1111111111";
else count2<=count2+1;
end if;
end if;
elsif(choose="10")then ---- 循环回放
if(writ='0')then enout<='1';adr<=count1;
if(count1="1111111111")then count1<="1111111111";
else count1<=count1+1;
end if;
else enout<='0';adr<=count2;
if(count2="1111111110")then count2<="0000000000";
else count2<=count2+1;
end if;
end if;
elsif(choose="11") then ---- 定点回放
if(writ='0')then enout<='1';adr<=count1;
if(count11="0011111111")then count11<="0011111111";
else count11<=count11+1;
end if;
if (ch="00")then count1<="0000000000"+count11;
elsif(ch="01")then count1<="0100000000"+count11;
elsif(ch="10")then count1<="1000000000"+count11;
else count1<="1100000000"+count11;
end if;
else
enout<='0';adr<=count2; if(count22="0011111110")then count22<="0000000000";
else count22<=count22+1;
end if;
if (ch="00")then count2<="0000000000"+count22;
elsif(ch="01")then count2<="0100000000"+count22;
elsif(ch="10")then count2<="1000000000"+count22;
else count2<="1100000000"+count22;