版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章第章设计实践本章介绍了Xilinx公司的SpartanIIE最小系统板和Altera公司的APEXDSP最小系统板,FPGA与LED、LCD显示、与8位ADC、与8位DAC接口电路与VHDL控制程序,FPGA构成介绍了产生单极性归零码(RZ码)、差分码、分相码(曼彻斯特码)码、交替极性码(AMI)等码形的基带码发生器程序;介绍了数字式频率计、八音电子琴、电子时钟、自动售货机、电梯控制器、出租车计价知识要点FPGA最小系统板印制板设计LED、LCD显示A/D与D/A转换器基带码发生器数字信号调制与解调FPGA应用教学建议本章的重点是掌握FPGA的设计与应用。通过学习本章所提供的设计例,掌握FPGA开发的程度不同,所设计的VHDL程序是不同的。最小系统板设计最小系统板设计为了方便用户更快、更好使用FPGA器件,Xilinx和许多第3方公司针对不同系列的FPGA器件,开发了一系列的评估板,提供给用户使用。下面以JacylTechnology公司开发的SpartanIIE最小系统板(型号:LT-50K)为例,介绍FPGA最小系统板的基本特性。JacylTechnology公司开发的SpartanⅡE最小系统板采用XilinxSpartanⅡEXC2S50E-6PQ208FPGA,具有与PC/104总线和IEEE1149.1JTAG完全兼容的接口,可提供100个可编程的I/O在最小板上具有100MHz的振荡器可提供FPGA全局时钟,具有2个用户可定义的时钟输入端,使用XilinxXC18V02串行在系统可编程配置PROM,2个用户可定义的LED和开关,可通过PC/104总线或者外部DC电源供电,由Xilinx公司免费的Webpack软件支持,系统板尺寸3.55”×3.775”,外部电源电压5~14VDC(200mA)。图8.1.1最小系统板的电路图8.1.2元器件布局图最小系统板设计最小系统板设计Altera公司与Xilinx公司一样,为了方便用户更快、更好使用FPGA器件,Altera和许多第3方公司针对不同系列的FPGA器件,开发了一系列的评估板,提供给用户使用。下面以Altera公司开发的APEXDSP最小系统板为例,介绍FPGA最小系统板的基本特最小系统板的基本特性Altera公司开发的APEXDSP最小系统板采用652BGA封装的APEX™EP20K200E-1Xanalog公司的AD9203ARU(10-bit,40-MSPS)A/D转换器,TI公司的THS5651AIPW(10-bit,100-MSPS)D/A转换器,具有2个10ns异步64K×16SRAM(型号为IDT71V016SA),在板配置采用16MbitEPC16flash配置器件,使用ByteBlasterMV™下载电缆下载配置数据,调试通道使用3.3V逻辑分析仪,具有用户可定义的7个开关和3个LED,板上具有振荡器,并具有外部振荡器输入引脚端,采用单5V电源供电元器件布局图、尺寸图、实物图等更详细的内容可登录网站查询。封装印制板设计封装印制板设计球栅阵列封装,简称BGA(BallGridArrayPackage)。BGA封装技术可以增加I/O引脚数,而不减小引脚间距,从而提高了组装成品率;采用可控塌陷芯片法焊接,可以改善它的电热性能,具有更加快速和有效的散热途径;厚度和重量都较TSOP等封装技术有所减少;寄生参数减小,信号传输延迟小,使用频率大大提高;组装可用共面焊接,可靠性高。但BGA封装仍然存在着占用基板面积较大的问题。器件中的一些型号都采用BGA封装。下面以Xilinx公司的产品为例介绍BGA封装印制板设计。号引脚端为多行分布在周边,电源和地引脚端成组分布,引脚端详细分布情况请登录www.X网站查询。图公司推荐的焊盘设计图公司推荐的焊盘设计典型数值设计例公司的封装有等形式,印制板的设计布局也不同,印制板层数从层板到层板都有。推荐的多层板的信号分布采用FG900封装的XCV1600E的层板设计对显示器的控制数码管的工作原理LED数码管用8段发光二极管来显示数字,每一段都是一个发光二极管,如图8.2.1所示。共阴LED数码管的公共端连接到地,另一端分别接一个限流电阻后再接到控制电路的信号端,当信号端为高电平时,该段即被点亮,否则不亮。号端,只有信号端为低电平时才被点亮,否则不亮。在数字逻辑电路中,可用74LS48(共阳)/74LS49(共阴)译码驱动电路来控制LED显示。在FPGA中,用硬件描述语言设计一个译码驱动器,例如进行一个74LS48的功能设由于FPGA和硬件描述语言的灵活性,可以设计出能显示更多内容的译码驱动模块。实现静态显示控制运用硬件描述语言(如VHDL)设计一个显示译码驱动器,即将要显示的字符译成8段码。FPGAN较少,可以直接使用静态显示方式,即将每一个数码管都分别连接到不同的8个引脚线上,共需要8×N条引脚线控制,如图。采用实现数码管动态显示控制的引脚端资源是有限的。因此对于多个LED数码管显示,可以采用扫描方式来实现LED实现方法是依次点亮各个LED数码管,循环进行显示,即一个数码管显示之后另一个数码管马上显示,利用人眼的视觉暂留特性,可以到多个数码管同时显示的效果。采用扫描方式来实现LED数码管动态显示,控制好数码管之间的延时是相当重要。根据人眼视觉暂留原理,LED数码管每秒的导通16次以上,人眼就无法分辨LED数码管短暂的不亮,认为是一直点亮的(其实LED数码管是以一定频率在闪动的)。如果延时控制的不好则会出现闪动,或者亮度不够。据经验,延时0.005秒可以达到满亮下一个,即可得到数码管逐个显示的效果。另外,显示的字符有变化时,可在延时到达后送一个低电平(共阴极数码管)让LED数码管先短暂熄灭,再显示下一个字符,可使在视觉上字符的变化更清晰。实现动态方式显示的控制电路实现动态方式显示的控制电路驱动静态显示程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitydecoderisPort(seg:instd_logic_vector(3downto0);--四位二进制码输入q3:outstd_logic_vector(6downto0));--输出LED七段码enddecoder;architectureBehavioralofdecoderis驱动静态显示程序process(seg)casesegiswhen"0000"=>q3<="0000001";--0when"0001"=>q3<="1001111";--1when"0010"=>q3<="0010010";--2when"0011"=>q3<="0000110";--3when"0100"=>q3<="1001100"--4when"0101"=>q3<="0100100";--5when"0110"=>q3<="0100000";--6when"0111"=>q3<="0001111";--7when"1000"=>q3<="0000000";--8when"1001"=>q3<="0000100";--9whenothers=>q3<="1111111";endcase;endprocess;endBehavioral;驱动动态显示(位)entitydynamicisPort(clk,reset:instd_logic;din1:instd_logic_vector(6downto0);--译码后的数据信号1din2:instd_logic_vector(6downto0);--译码后的数据信号2din3:instd_logic_vector(6downto0);--译码后的数据信号3din4:instd_logic_vector(6downto0);--译码后的数据信号4shift:outstd_logic_vector(3downto0);--位选信号bus4:outstd_logic_vector(6downto0));--数据信号enddynamic;architectureBehavioralofdynamicissignalscan_clk:std_logic_vector(1downto0);process(clk,scan_clk,reset)--分频进程variablescan:std_logic_vector(17downto0);beginifreset='1'thenscan:="000000000000000000";scan_clk<="00";elsifclk'eventandclk='1'thenscan:=scan+1;endif;scan_clk<=scan(17downto16);endprocess;process(scan_clk,din1,din2,din3,din4)--扫描进程begincasescan_clkiswhen"00"=>bus4<=din1;shift<="0001";when"01"=>bus4<=din2;shift<="0010";when"10"=>bus4<=din3;shift<="0100";when"11"=>bus4<=din4;shift<="1000";whenothers=>bus4<="0000000";shift<="0000";endcase;endprocess;endBehavioral;对显示器的控制系列液晶显示模块显示的原理的显示效果。液晶显示驱动器的功能就是建立这种电场系列电路框图SRW0进行写操作。字符型液晶显示模块指令集字符型液晶显示模块的信号真值表字符型液晶显示模块的时序图时序图可以看到数据写入的条件:寄存器为高电平,读写标志为低电平,建立地址,接下来使能信号E为高电平,数据被写入,当使能端E为下降沿的时候数据被完全建立。从地址的建立、保持到数据的建立、保持的结束,整个过程需要的时间至少为355ns。关于MDLS系列接口特性及电气特性请查阅点阵字符式液晶显示模块使用手字符型液晶显示模块驱动电路原理方框图驱动电路和液晶显示模块组成。FPGA控制器驱动液晶显示模块,实现对字符型液晶显示的液晶显示器驱动模块的状态控制从启动液晶到向液晶写如数据需要执行的指令包括:功能设置指令、光标画面移动程序设计与仿真见随书所附光盘中文件:8.3LCD控制VHDL程序与仿真。接口电路及程序设计与接口电路ADC0809的精度是8位,转换时间约为100µs,含锁存控制的8路开关,输出有三态缓冲控制,单5V电源供电。与接口电路原理图接口电路原理图与接口电路设计FPGA_IO1~8接收ADC08098位数数据;FPGA_IO9接收ADC0809转换结束信号EOC;FPGA_IO10~12为ADC0809提供8路模拟信号开关的3位地址选通信号(ADD-A~C);FPGA_IO13为ADC0809提供地址锁存控制信号ALE:高电平时把三个地址信号送入地址锁存器,并经译码器得到地址输出,以选择相应的模拟输入通道;FPGA_IO14为ADC0809提供输出允许控制信号ENABLE:电平由低变高时,打开输出锁存器,将转换结果的数字量送到数据总线上;FPGA_IO15为ADC0809提供启动控制信号START:一个正脉冲过后A/D开始转换;FPGA_IO16为ADC0809提供时钟信号信号CLOCK;采样控制程序设计ADDB、ADDA)信号锁存信号。EOC是转换情况状态信号,当启动转换约100μs后,EOC产生一个负脉冲,以示转换结在EOC的上升沿后,且输出使能信号ENABLE为高电平,则控制打开三态缓冲器,把转换好的8位数据送至数据总线。至此ADC0809的一次转换结束采样控制状态图FPGA器件可以根据其采样时序用状态机来描述采样控制过程,其状态转换关系如图.3。采样控制程序采样控制程序电路符号程序的端口信号与中间信号entityADC0809isport(d:instd_logic_vector(7downto0);--ADC0809输出的采样数据clk,eoc:instd_logic;--clk为系统时钟,eoc为ADC0809转换结束信号clk1,start,ale,en:outstd_logic;--ADC0809控制信号abc_in:instd_logic_vector(2downto0);--模拟选通信号abc_out:outstd_logic_vector(2downto0);--ADC0809模拟信号选通信号q:outstd_logic_vector(7downto0));--送至8个并排数码管信号endADC0809;architecturebehavofADC0809istypestatesis(st0,st1,st2,st3,st4,st5,st6);--定义各状态的子类型signalcurrent_state,next_state:states:=st0;signalregl:std_logic_vector(7downto0);--中间数据寄存信号signalqq:std_logic_vector(7downto0);begin状态转换模块(com)casecurrent_stateiswhenst0=>next_state<=st1;ale<='0';start<='0';en<='0';whenst1=>next_state<=st2;ale<='1';start<='0';en<='0';whenst2=>next_state<=st3;ale<='0';start<='1';en<='0';whenst3=>ale<='0';start<='0';en<='0';ifeoc='1'thennext_state<=st3;--检测EOC的下降沿elsenext_state<=st4;endif;whenst4=>ale<='0';start<='0';en<='0';ifeoc='0'thennext_state<=st4;--检测EOC的上升沿elsenext_state<=st5;endif;whenst5=>next_state<=st6;ale<='0';start<='0';en<='1';whenst6=>next_state<=st0;ale<='0';start<='0';en<='1';regl<=d;whenothers=>next_state<=st0;ale<='0';start<='0';en<='0';endcase;分频模块(clock)clock:process(clk)--对系统时钟进行分频,得到ADC0809转换工作beginifclk'eventandclk='1'thenqq<=qq+1;--在clk1的上升沿,转换至下一状态ifQQ="01111111"THENclk1<='1';current_state<=next_state;elsifqq<="01111111"thenclk1<='0';endif;endif;endprocess;q<=regl;abc_out<=abc_in;endbehav;接口电路及程序设计与接口电路TLC5510是CMOS、8位、20MSPS模拟/数字转换器(ADC),它利用了半闪速结构。TLC5510用单5V电源工作,消耗功率100mW(典型值),具有内部采样和保持电路,具有高阻抗方式的并行口以及内部基准电阻(内部基准电阻使用VDDA可以产生标准的2V满度转换范围)。与闪速转换器(flashconverters)相比,半闪速结构减少了功率损耗和晶片尺寸。通过在2步过程(2-stepprocess)中实现转换,可大大减少比较器的数目。转换数据的等待时间为2.5个时钟。与的接口电路图图与路图与接口电路图的注释FPGA_IO1提供TLC5510工作时钟。FPGA_IO2~9接收TLC5510的采样数据。FPGA_IO10为TLC5510提供输出使能信号OE,低电平有效。TLC5510与FPGA接口应用电路元器件。采样控制程序设计图8.5.2时序图TLC5510是以流水线的工作方式进行工作的。它在每一个CLK(时钟)周期都启动一次采样,完成一次采样;每次启动采样是在CLK从采样到输出需经2.5*CLK+td(D)。对于需要设计的采样控制器,可以认为,每加一个可以通过对FPGA系统时钟进行分频得到一个与TLC5510的工作周期相一致的CLK1送采样控制程序采样控制程序电路符号采样控制程序libraryieee;useieee.std_logic_1164.all;entitytlc5510isport(clk:instd_logic;--系统时钟oe:outstd_logic;--TLC5510的输出使能/OEclk1:outstd_logic;--TLC5510的转换时钟din:instd_logic_vector(7downto0);--来自TLC5510的采样数据dout:outstd_logic_vector(7downto0));--FPGA数据输出endtlc5510;architecturebehavoftlc5510issignalq:integerrange3downto0;beginprocess(clk)--此进程中,把CLK进行4分频,得到TLC5510的转换时钟ifclk'eventandclk='1'thenifq=3thenq<=0;elseq<=q+1;endif;endif;--对系统CLK进行4分频ifq>=2--对系统CLK进行4分频elseclk1<='0';endif;endprocess;--输出使----输出使--采能赋低电平dout<=din;样数据输出endbehav;接口电路及程序设计接口电路设计DAC0832是采用CMOS/Si-Cr工艺实现的8位D/A转换器。DAC0832中有两级锁存器,第一级即输入寄存器,第二级即DAC寄存器,可以工作在与接口电路原理图图8.6.1与接口电路原理图与接口电路设计FPGA_IO1~8向DAC0832的数据输入口(DI0~DI7)输送数据。FPGA_IO9提供DAC0832数据锁存允许控制信号ILE,高电平有效。FPGA_IO10提供DAC0832控制信号(CS:片选信号;Xfer:数据传输控制信号;WR1、WR2:DAC寄存器写选通信号),低电平有效。Iout1、Iout2、Rfb与运算放大器LM324完成电流/电压的转换(DAC0832属电流输出型)。接口电路程序设计输出控制时序图根据DAC0832输出控制时序,利用接口电路图,通过改变输出数据设计一个锯齿波发生器。DAC0832是8位的D/A转换器,转换周期为1μs。锯齿波形数据可以由256个点构成,每个点的数据长度为8位。又因为FPGA的系统时钟为50MHz,必须对其进行分频处理,这里进行64分频,得到的锯齿波的频率为762.9Hz。接口电路输出控制程序输出控制接口电路程序符号图接口电路程序--功能:产生频率为762.9Hz的锯齿波。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityDAC0832isport(clk:instd_logic;rst:instd_logic;--系统时钟--复位信号ile:outstd_logic;cont:outstd_logic;--ile:outstd_logic;cont:outstd_logic;data_out:outstd_logic_vectordata_out:outstd_logic_vector(7downto0));--波形数据输出endDAC0832;signalq:integerrangesignalq:integerrange0to63;signaldata:std_logic_vector(7downto0);process(clk)ifrst='1'thenifrst='1'thenq<=0;elsifclk'eventandclk='1'thenifq=63thenq<=0;--此IF语句对系统时钟进行64分频ifdata="11111111"thendata<="00000000";--此IF语句产生锯齿波波形数据elsedata<=data+1;endif;elseq<=q+1;endif;endif;endprocess;ilecontdataoutdatailecont出;endbehav;接口电路及程序设计接口电路设计TLC5724是TI公司生产的8位D/A转换器,转换周期为100ns。接口电路设计图图图8.7.1接口电路设计图FPGA_IO1~8为TLC7524提供8位并行数据。TLC7524的CS、WR都是低电平有效,所以直接接地接口电路程序设计TLC7524输出控制时序图上图所示。根据TLC7524输出控制时序,利用接口电路图,通所以锯齿波形数据由256个点构成,每个点的数据长度为8位。FPGA的系统时钟为50MHz,必须对其进行分频处理,这里进行5分频,得到的正弦波的频率为156.25KHz。接口电路输出控制程序电路符号接口电路输出控制程序--功能:产生156.25KHz的正弦波。libraryieee;useieee.std_logic_arith.all;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityTLC7524isport(clk:instd_logic;rst:instd_logic;--系统时钟--复位信号data_out:outstd_logic_vector(7downto0));--波形数据--地址计数器--计数器--波形数据寄存器architecturebehav--地址计数器--计数器--波形数据寄存器signalb:integerrange0to63;signalq:integerrange0to4;signald:integerrange0to255;process(clk)--此进程通过对系统时钟的分频,完成的地址计数器的循环计数ifrst='1'thenb<=0;elsifclk'eventandclk='1'thenifq=4thenq<=0;ifb=63thenb<=0;elseb<=b+1;endif;elseq<=q+1;endif;endif;endprocess;process(b)casebis--复位时,对地址寄存器清零--此IF语句完成对系统时钟的5分频--此IF语句完成对地址的循环计数--此进程存储了正弦波64个采样点的波形数据when00=>d<=255;when01=>d<=254;when02=>d<=252;when03=>d<=249;when04=>d<=245;when05=>d<=239;when06=>d<=233;when07=>d<=225;when08=>d<=217;when09=>d<=207;when10=>d<=197;when11=>d<=186;when12=>d<=174;when13=>d<=162;when14=>d<=150;when15=>d<=137;when16=>d<=124;when17=>d<=112;when18=>d<=99;when19=>d<=87;when20=>d<=75;when21=>d<=64;when22=>d<=53;when23=>d<=43;when24=>d<=34;when25=>d<=26;when26=>d<=19;when27=>d<=13;when28=>d<=8;when29=>d<=4;when30=>d<=1;when31=>d<=0;when32=>d<=0;when33=>d<=1;when34=>d<=4;when35=>d<=8;when36=>d<=13;when37=>d<=19;when38=>d<=26;when39=>d<=34;when40=>d<=43;when41=>d<=53;when42=>d<=64;when43=>d<=75;when44=>d<=87;when45=>d<=99;when46=>d<=112;when47=>d<=124;when48=>d<=137;when49=>d<=150;when50=>d<=162;when51=>d<=174;when52=>d<=186;when53=>d<=197;when54=>d<=207;when55=>d<=217;when56=>d<=225;when57=>d<=233;when58=>d<=239;when59=>d<=245;when60=>d<=249;when61=>d<=252;when62=>d<=254;when63=>d<=255;whenothers=>null;endcase;endprocess;data_out<=conv_std_logic_vector(d,8);--正弦波波形数据输出endbehav;通用异步收发器设计UART(UniversalAsynchronousReceiverTransmitter通用异步收发器)是一种应用广接口。常常用于短距离、低速、低成本的通讯中。8250、8251、NS16450等芯片都是常见的UART器件。基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收(1)在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。(2)起始位(StartBit):发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。(3)数据位(DataBits):起始位之后就是传送数据位。数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。(4)校验位(parityBit):可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。在使用中,该位常常取消。(5)停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。(6)位时间:即每个位的时间宽度。起始位、数据位、校验位的位宽度是一致的,停(7)帧:从起始位开始到停止位结束的时间间隔称之为一帧。8)波特率:UART的传送速率,用于说明数据传送的快慢。在串行通信中,数据是按位率9600=9600bps(位/秒)。UART的数据帧格式为:系统组成FPGAUART由三个子模块组成:()波特率发生器;()接收模块;()发送模块;模块设计顶层模块波特率发生器接收器发送器顶层模块异步收发器的顶层模块由波特率发生器、UART接收器和UART发送器构成。UART发送器的用途是将准备输出的并行数据按照基本UART帧格式转为TXD信号串行UART接收器接收RXD串行信号,并将其转化为并行数据。波特率发生器就是专门产生一个远远高于波特率的本地时钟信号对输入RXD不断采样,使接收器与发送器保持同步。顶层模块的电路图波特率发生器波特率发生器实际上就是一个分频器。可以根据给定的系统时钟频率(晶振时钟)和要求的波特率算出波特率分频因子,算出的波特率分频因子作为分频器的分频数。波特率分频因子可以根据不同的应用需要更改。接收器由于串行数据帧和接收时钟是异步的,由逻辑1转为逻辑0可以被视为一个数据帧的起特率时钟采样的过程中至少有一半都是属于逻辑0才可认定接收到的是起始位。由于内部采样时钟bclk周期(由波特率发生器产生)是发送或接收波特率时钟频率的16倍,所位和奇偶校验位将每隔16个bclk周期被采样一次(即每一个波特率时钟被采样一次)。如果起始位的确是16个bclk周期长,那么接下来的数据将在每个位的中点处被采样。接收器的接收状态机有个状态:R_START(等待起始位)R_CENTER(求中点)R_WAIT(等待采样)R_SAMPLE(采样)R_STOP(停止位接收)当UART接收器复位后,接收状态机将处于这一个状态。在此状态,状态机一直在等待RXD的电平跳转,从逻辑1变为逻辑0,即起始位,这意味着新的一帧UART数据帧的开始,一旦起始位被确定,状态机将转入R_CENTER状态。望检测的信号是不稳定的,所以不直接检测RXD信号,而是检测经过同步后的累计误差较小,显然在每位的中点检测是最为理想的。在本状态,就是由起始位求出每位的中点,通过对bclk的个数进行计数(RCNT16),但计数值不是想当然的“1000”,要考虑经过一个状态,也即经过了一个bclk周期,所希望得到的是在采样时1/2位。另外,可能在R_START状态检测到的起始位不是真正的起始位,可能是一个偶然出现的干扰尖脉冲(负脉冲)。这种干扰脉冲的周期是很短的,所以可以认为保持逻辑0超过1/4个位时间的信号一定是起始位。态当状态机处于这一状态,等待计满15个bclk,在第16个bclk是进入R_SAMPLE状态进行数据位的采样检测,同时也判断是否采集的数据位长度已达到数据帧的长度 (FRAMELEN),如果到来,就说明停止位来临了。FRAMELEN在设计时是可更改的(使用了Generic),在本设计中默认为8,即对应的UART工作在8位数据位、无校验位格式。即数据位采样检测,完成后无条件状态机转入R_WAIT状态,等待下次数据位的到来。态收完毕信号(REC_DONE<=‘1’),停止位后状态机转回到R_START状态,等待下一送器发送器只要每隔16个bclk周期输出1个数据即可,次序遵循第1位是起始位,第8位是停止位。在本设计中没有校验位,但只要改变Generic参数FrameLen,也可以加入校验位,停止位是固定的1位格式。发送状态机的状态图发送状态机一共有个状态X_IDLE(空闲)X_START(起始位)X_WAIT(移位等待)X_SHIFT(移位)X_STOP(停止位)当UART被复位信号复位后,状态机将立刻进入这一状态。在这个状态下,UART的发送器一直在等待一个数据帧发送命令XMIT_CMD。XMIT_CMD是一个外加信号,在FPGA之外,不可能对XMIT_CMD的脉冲宽度进行限制,如果XMIT_CMD有效在UART发完一个数据帧后仍然有效,那么就会错误地被认为,一在此对XMIT_CMD进行了脉冲宽度的限定,XMIT_CMD_P就是一个处理后的信号。当XMIT_CMD_P=‘1’,状态机转入X_START,准备发送起始位。在这个状态下,UART的发送器一个位时间宽度的逻辑0信号至TXD,即起始位。紧接着状态机转入X_WAIT状态。XCNT16是bclk的计数器态同UART接收状态机中的R_WAIT状态类似。停止位发送状态,当数据帧发送完毕,状态机转入该状态,并发送16个bclk周期的逻辑状态机送完停止位后回到X_IDLE状态,并等待另一个数据帧的发送命令。程序设计与仿真顶层程序--文件名:top.vhd。--功能:顶层映射。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitytopisPort(clk32mhz,reset,rxd,xmit_cmd_p_in:instd_logic;--总的输入输出信号的定义rec_ready,txd_out,txd_done_out:outstd_logic;txdbuf_in:instd_logic_vector(7downto0);--待发送数据输入rec_buf:outstd_logic_vector(7downto0));--接收数据缓冲endtop;architectureBehavioraloftopiscomponentrecieverPort(bclkr,resetr,rxdr:instd_logic;r_ready:outstd_logic;rbuf:outstd_logic_vector(7downto0));endcomponent;componenttransferPort(bclkt,resett,xmit_cmd_p:instd_logic;txdbuf:instd_logic_vector(7downto0);txd:outstd_logic;txd_done:outstd_logic);endcomponent;componentbaudPort(clk,resetb:instd_logic;bclk:outstd_logic);endcomponent;signalb:std_logic;beginu1:baudportmap(clk=>clk32mhz,resetb=>reset,bclk=>b);--顶层映射u2:recieverportmap(bclkr=>b,resetr=>reset,rxdr=>rxd,r_ready=>rec_ready,rbuf=>rec_buf);u3:transferportmap(bclkt=>b,resett=>reset,xmit_cmd_p=>xmit_cmd_p_in,txdbuf=>txdbuf_in,txd=>txd_out,txd_done=>txd_done_out);endBehavioral;顶层程序的仿真波特率发生器程序--功能:将外部输入的32MHz的信号分成频率为153600Hz的信号。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitybaudisPort(clk,resetb:instd_logic;bclk:outstd_logic);endbaud;architectureBehavioralofbaudisbeginprocess(clk,resetb)variablecnt:integer;beginifresetb='1'thencnt:=0;bclk<='0';--复位elsifrising_edge(clk)thenifcnt>=208thencnt:=0;bclk<='1';--设置分频系数elsecnt:=cnt+1;bclk<='0';endif;endif;endprocess;endBehavioral;波特率发生器程序的仿真发送器程序--说明:系统由五个状态(x_idle,x_start,x_wait,x_shift,x_stop)和一个进程构成。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitytransferisgeneric(framlent:integer:=8);Port(bclkt,resett,xmit_cmd_p:instd_logic;--定义输入输出号txdbuf:instd_logic_vector(7downto0):="11001010";txd:outstd_logic;txd_done:outstd_logic);endtransfer;architectureBehavioraloftransferistypestatesis(x_idle,x_start,x_wait,x_shift,x_stop);signalstate:states:=x_idle;signaltcnt:integer:=0;beginprocess(bclkt,resett,xmit_cmd_p,txdbuf)程--定义个子状态--主控时序、组合进variablexcnt16:std_logic_vector(4downto0):="00000";variablexbitcnt:integer:=0;variabletxds:std_logic;ifresett='1'thenstate<=x_idle;txd_done<='0';txds:='1';elsifrising_edge(bclkt)thencasestateis--定义中间变量--复位whenx_idle=>--状态1,等待数据帧发送命令ifxmit_cmd_p='1'thenstate<=x_start;txd_done<='0';elsestate<=x_idle;接收器程序endif;whenx_start=>--状态2,发送信号至起始位ifxcnt16>="01111"thenstate<=x_wait;xcnt16:="00000";elsexcnt16:=xcnt16+1;txds:='0';state<=x_start;endif;whenx_wait=>--状态3,等待状态ifxcnt16>="01110"thenifxbitcnt=framlentthenstate<=x_stop;xbitcnt:=0;xcnt16:="00000";elsestate<=x_shift;endif;elsexcnt16:=xcnt16+1;state<=x_wait;endif;whenx_shift=>txds:=txdbuf(xbitcnt);xbitcnt:=xbitcnt+1;state<=x_wait;--状态4,将待发数据进行并串转换whenx_stop=>--状态5,停止位发送状态ifxcnt16>="01111"thenifxmit_cmd_p='0'thenstate<=x_idle;xcnt16:="00000";elsexcnt16:=xcnt16;state<=x_stop;endif;txd_done<='1';elsexcnt16:=xcnt16+1;txds:='1';state<=x_stop;endif;whenothers=>state<=x_idle;endcase;endif;txd<=txds;endprocess;endBehavioral;发送器的仿真波形图--说明:系统由五个状态(r_start,r_center,r_wait,r_sample,r_stop)和两个进libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityrecieverisgeneric(framlenr:integer:=8);Port(bclkr,resetr,rxdr:instd_logic;--定义输入输出信号r_ready:outstd_logic;rbuf:outstd_logic_vector(7downto0));endreciever;architectureBehavioralofrecieveristypestatesis(r_start,r_center,r_wait,r_sample,r_stop);--定义各子状态signalstate:states:=r_start;signalrxd_sync:std_logic;beginpro1:process(rxdr)beginifrxdr='0'thenrxd_sync<='0';elserxd_sync<='1';endif;endprocess;pro2:process(bclkr,resetr,rxd_sync)进程variablecount:std_logic_vector(3downto0);variablercnt:integer:=0;variablerbufs:std_logic_vector(7downto0);beginifresetr='1'thenstate<=r_start;count:="0000";elsifrising_edge(bclkr)thencasestateiswhenr_start=>--定义中间变量--复位--状态1,等待起始位ifrxd_sync='0'thenstate<=r_center;r_ready<='0';rcnt:=0;elsestate<=r_start;r_ready<='0';endif;whenr_center=>--状态2,求出每位的中点ifrxd_sync='0'thenifcount="0100"thenstate<=r_wait;count:="0000";elsecount:=count+1;state<=r_center;endif;elsestate<=r_start;endif;whenr_wait=>--状态3,等待状态ifcount>="1110"thencount:="0000";ifrcnt=framlenrthenstate<=r_stop;elsestate<=r_sample;endif;elsecount:=count+1;state<=r_wait;endif;whenr_sample=>rbufs(rcnt):=rxd_sync;rcnt:=rcnt+1;state<=r_wait;--状态4,数据位采样检测whenr_stop=>r_ready<='1';rbuf<=rbufs;state<=r_start;--状态4,输出帧接收完毕信号whenothers=>state<=r_start;endcase;endif;endprocess;endBehavioral;接收器的仿真波形uu(t)8.9二进制振幅键控(ASK)调制器与解调器设计调制方法数字信号对载波振幅调制称为振幅键控即ASK(Amplitude-ShiftKeying)。ASK有两种实现方法:2.键控法乘法器实现法来进行频谱搬移,相乘后的信号通过带通滤波器滤除高频谐波和低频干扰。带通滤波器的输出是振幅键控信号。乘法器常采用环形调制器。键控法键控法是产生ASK信号的另一种方法。二元制ASK又称为通断控制(OOK)。最典型的实现方法是用一个电键来控制载波振荡器的输出而获得。数字电路实现键控产生信号的实例子开关来实现,代替电键产生信号,上图所示就是以数字电路实现键控产生信号的实例。该电路是用基带信号控制与非门的开闭,实现调制,产生解调方法有两种2.包络解调法。同步解调也称相干解调,信号经过带通滤波器抑制来自信道的带外干扰,乘法器(1)发“1”码时情况发“1”码时,输入的ASK信号为,它能顺利地通过带通滤波器。为零均值的高斯白噪声,经过带通滤波器后变为窄带高斯噪声,用表示。经过低通滤波器后,输出信号为x(t),也就是取样判决器的输入信号。(2)发“0”码时情况x(t)也是取样判决器的输入信号。综合上面的分析,可得下面讨论判决问题。若没有噪声,上式简化为此时判决电平取0~A的中间值A/2,大于A/2判为“1”码,小于A/2判为“0”码。在无噪判决一定是正确的。包络解调包络解调是一种非相干解调发“”码时的情况服从莱斯分布,如上图所示。其概率密度发“”码时的情况如上页图所示。其概率密度为与同步解调相似,为使误码率最小,判决电平应和的交点的横坐标值,如图中称为最佳门限,经分析,得到当信噪比(即大信噪比)时,调制程序及仿真调制方框图调制电路符号调制程序--功能:基于VHDL硬件描述语言,对基带信号进行ASK振幅调制libraryieee;useieee.std_logic_arith.all;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityASKisport(clk:instd_logic;--系统时钟start:instd_logic;--开始调制信号x:instd_logic;--基带信号y:outstd_logic);--调制信号endASK;architecturebehavofASKissignalq:integerrange0to3;--分频计数器signalf:std_logic;--载波信号beginprocess(clk)beginifclk'eventandclk='1'thenifstart='0'thenq<=0;elsifq<=1thenf<='1';q<=q+1;--改变q后面数字的大小,就可以改变载波信号的占空比elsifq=3thenf<='0';q<=0;q信号的频率elsef<='0';q<=q+1;endif;endif;endprocess;y<=xandf;--对基带码进行调制endbehav;调制程序仿真图及注释解调程序及仿真解调程序--功能:基于VHDL硬件描述语言,对ASK调制信号进行解调libraryieee;useieee.std_logic_arith.all;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityASK2isport(clkstartxyendASK2;cicdlogicarchitecturebehavofASK2issignalq:integerrange0to11;signalxx:std_logic;signalm:integerrange0to5;process(clk)--系统时钟--调制信号--基带信号--计数器--寄存x信号--计xx的脉冲数q频,ifclk'eventandclk='1'thenxx<=x;--clk上升沿时,把x信号赋给中间信号xxifstart='0'thenifstart='0'thenq<=0;elsifq=11thenq<=0;elseq<=q+1;endif;endif;endprocess;--此进程完成ASK解调process(xx--此进程完成ASK解调ifq=11thenm<=0;--m计数器清零elsifq=10thenifm<=3theny<='0';--if语句通过对m大小,来判决y输出的电平elsey<='1';endif;elsifxx'eventandxx='1'thenm<=m+1;--计xx信号的脉冲个数endif;endprocess;endbehav;程序解调仿真图及注释k二进制频移键控()调制器与解调器设计数字信号对载波频率调制称为频移键控即FSK(Frequency-ShiftKeying)。频移键控(FSK)是用不同频率的载波来传送数字信号,用数字基带信号控制载波信号二进制频移键控是用两个不同频率的载波来代表数字信号的两种电平。接收端收到不同的载波信号再进行逆变换成为数字信号,完成信息传输过程。信号的产生有两种方法1.直接调频法2.频率键控法。直接调频法直接调频法是用数字基带信号直接控制载频振荡器的振荡频率。直接调频法实现电路有许多,一般采用的控制方法是:当基带信号为正时(相当于“1”为f1);当基带信号为负时(相当于“0”码),改变振荡器谐振回路的参数(电容或者电感数值),使振荡器的振荡频率降低(设为f2);从而实现了调频,这种方法产生的调频信号是相位连续的。虽然实现方法简单,但频率稳定度不高,同时频率转换速度不能做得太快。频率键控法基带信号控制转换开关,选择不同频率的高频振荡信号实现FSK调制。u(t)u(t)1基带信号基带信号2是uFSK(t)信号在基带信息变换时电压会发生跳变,这种现象也称为相位不连续,这是频率键控特有的情况。下图是利用两个独立分频器,以频率键控法来实现FSK调制的原理电路图。在下图中,与非门3和4起到了转换开关的作用。当数字基带信号为“1”时,与非门4打键控法也常常利用数字基带信号去控制可变分频器的分频比来改变输出载波频率,从而实现FSK调制。下图是一个11/13可控分频器原理图。当数字基带信号为“1”时,第四级双稳态电路输出的反馈脉冲被加到第一级和第二级双稳态电路上,此时分频比为13;当基带信号为“0”时,第四级双稳态电路输出的反馈脉冲被加到第一级和第三级双稳态电路上,分频比变为11。由于分频比改变,使输出信号频率变化,从而实现FSK调制。采用可变分频器产生的使输出频率满足FSK信号要求的频率。信号的解调数字频率键控(FSK)信号常用的解调方法有很多种如:1.同步(相干)解调法2.过零检测法3.差分检波法在同步解调器中,有上、下两个支路,输入的FSK信号经过和两个带通滤波器后变成了上、下两路ASK信号,之后其解调原理与ASK类似,但判决需对上、下两支路假设上支路低通滤波器输出为,下支路低通滤波器输出为,则判决准则是:(x-x>0判输入为f信号x-x<0x-x<0判输入为f信号122当输入的FSK信号振荡频率为f1时,上支路经带通后有正弦信号ASKx然x1过零检测法方框图xA,按判决准则应判输入为f2。因此可以判决出FSK信号。包络解调法FSK信号包络解调相当于两路ASK信号包络解调。用两个窄带的分路滤波器分别滤出频率为f1及f2的高频脉冲,经包络检波后分别取出它们的包络。把两路输出同时送到抽样判决器进行比较,从而判决输出基带数字信号。设频率f1代表数字信号1;f2代表0,则抽样判决器的判决准则:1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 通信基站防雷接地安全管理规范
- 智能制造生产线数字化改造技术方案
- 品质工程师绩效考核办法
- 学生宿舍信息化运维管理制度
- 2026-2027学年人教版七上期中词汇分类专项训练(含答案)
- 执业药师沟通技巧培训方案
- 液晶显示屏输送设备项目水土保持方案报告
- 网络销售人员绩效考核办法
- 汽车零部件厂工艺流程制度
- 中等教育专业副高级案例分析冲刺押题模拟考试试卷及答案
- Effective C++ 第三版完整版中文版(Effective C++ 第 3 版)(全文完整译本 + 课后习题解析)
- 2026-2027学年济南天桥区泺口实验学校九年级9月份语文月考考试试题以及答案
- IEC 60601-1-2-2024 中文版(医用电气设备 第 1-2 部分:基本安全和基本性能的要求 并列标准:电磁兼容 要求和试验)
- 2026年永州职业技术学院高职单招职业技能考试题库完美版附答案详解
- 工业企业温室气体排放核算表
- 2025-2026学年甘肃省兰州市五校联考八年级上册期中考试物理试卷 含答案
- (正式版)DB43∕T 2546-2023 《早期人防工程分类鉴定规范》
- 雨课堂学堂在线学堂云《临床心理学(山东第二医科)》单元测试考核答案
- 小学生象棋课件
- 2025版小学语文新课程标准
- 变电站预试检修安全培训
评论
0/150
提交评论