大三上电气实践231fpgasyzds航空航天电工电子中心实验指导书_第1页
大三上电气实践231fpgasyzds航空航天电工电子中心实验指导书_第2页
大三上电气实践231fpgasyzds航空航天电工电子中心实验指导书_第3页
大三上电气实践231fpgasyzds航空航天电工电子中心实验指导书_第4页
大三上电气实践231fpgasyzds航空航天电工电子中心实验指导书_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VHDL1位的std_logic可以通过以下的方法 clk’EVENTandclk=’1’CycloneFPGA66MHZ32ASSPASIC器件连接,Al提供了一种低成CycloneFPGA的应用主要是定位在终端市场,如消费电子、计算机、598020M4KRAM块支持外扩器,包括DDR支持多种知识(IP),包括 的megacore和 1.8CycloneFPGA特性见参表1.9CycloneFPGAI/O1.21pins,第三是Totalmemorybits,第四是TotalPLLs.他们和器件到底是什么关系呢?Cyclone器件的平面布局如图 所示CycloneLABs、嵌入式M4kPPL、输入输出单IOEs。有5960个LEs。LABs在整个器件内按行列排放。Cyclone1C6含有20个M4KRAM块,每个RAM块有4608位,提供双端口,简单双端口、单端口三种模式,最大宽度是32位,最高速度是200MHZ。IOIOEFPGALABs的行和列的末端。IO管脚IOEIObuffer和三个寄存器用于寄存器的输入、输出和使能信号。兼用的DQS、DQ和DM带有延时链提供外部器DDRSDRAM和FCRAM的接口。Cyclone有两个锁相环提供全局时钟网络。全局时钟网络包含8条可以驱动整个的LABs10LEs、LE进位链、LAB控制信号、局部互连线、LUT链和寄存LABLEs间传输信息;LUTLAB内将LUTLUTLE寄存器传送到邻近的寄存器。QuartusII编译器自动对布线资源进行调整。LABLEsLABLE输出、行线和列线所LABs、PLLsM4KRAM块可以通过直接连接驱动局部互连线。直接驱动高速灵活,每个LE具有驱动30个负载的能力。图LEsCycloneLE4LUT,它是四变量输入LE包含了一个可编程寄存器决定。每个LE可以驱动局部互连、行、列、LUT链、寄存器链、直接驱动。每个LE可编异步装载数据、时钟、时钟使能和等输入。无论是IO引脚还是内部的逻辑都能驱动时LEdata3LUT的输LUT和寄存器的输出可以独立驱动它们。LE有两个输出驱动行、列和直接连接,一个驱动DSDQSIOCycloneIOEsbuffer和三个寄存器以完成一位数据的双向传输,如可以利用输出使能寄存器的到快速的时钟到输出使能定时。QuartusII编译器根据输出使能的时间自动控制多路输出和双向管脚。IOEs可以被用于输入、输出和双向的引脚。它不仅能和输入输出信号相连接,而且可以作为总线使用,以方便、灵活地传送数据。IOEs在IO块内,IO块位于Cyclone的四周。CycloneIOE双向IO配置如图 寄存器和输出使能寄存器的时钟信号和时钟使能信号来自LAB、IO、行、列的局部互CycloneIOE由可编程延时模块实现(1)0保持时间,(2)最小建立时间,(3)时钟入寄存器延时。QuartusII编译器在0保持时间的模式下能够自动地最大限度减小保持时间,可编程延时模块能够增加输出寄存器的寄存器到管脚的延时。图表明了这种关系。LVCMOS标准,SSTL-2classIandII和SSTL-3classIandII也是不错的选择,对压摆率的控 表I/OIOHIOLCurrentStrength482482828248Cyclone器件的I/O口有一可编程的输出缓冲器可以配置成低噪声和高速模式。快的个缓慢转换率降低了系统噪音,但增加了一个象征性的延误上升和下降的优势。每个IO引脚有一个单独的转换率控制,让设计师指定转换率对apin-by-pin进行设置。压摆率可以对上每个CycloneI/O管脚提供一个可选的总线保持功能。总线保持电路可以保持I/O管脚的每个CycloneI/O在用户模式下提供一个可选的上拉电阻(25K)。当设计者使能改功CyclonedeviceIOEs3.3-V2.5-V1.8-V1.5-V3.3-VSSTL-2classIandSSTL-3classIandDifferentialSSTL-2classII(onoutputclocks表 描述了Cyclone对接口的支持情七、IO1.26CycloneIOCyclone1C64IOBankIOBank1Bank3IO接口,Bank2Bank43.3VPCI标准,Bank2Bank4DQS、DSDMIOBankVCCIO1.5V、1.8V、2.5V3.3V接口,每Bank使用差分电压支持差分接口。VREFIOBank不使用电压参考标准,这一管脚可以用作一般的IO口。可以和LVTTL、LVCMOS、3.3VPCI和SSTL-3的所有输入信号、输出信号接口。VHDL 功能仿真(functionsimulation)综合后仿真(postsynthesissimulation)后仿真(timingsimulation) 配置配置综合:将设计输入翻译成门、触发器等基本逻辑单元组成的网表,供布局布线器使用。实体实体ENTITY ENTITY 流入和流出。实体的例子ENTITYmux21s:INSTD_LOGIC;STD_LOG;ENDENTITY ARCHTECTUREOFEND ARCHITECTUREoneOFmux21 y==awhenbwhens=‘1’;[进程标号:PROCESS(敏感信号参数表)]ISARCHITECUREs_modeOFstart CASEoutputISWHENs1→ ←WHENs2→ ←WHENs3→output ←s4WHENs4→ ←ENDIF;ENDPROCESSp1;库LIBRARY表示打开IEEE库VHDLSTD USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED;CONFIGURATIONOFEND代码编写-ActiveHDL、UEdit等文本编辑器后仿真-验证-Quartus、ISE、或由此组成的数组。VHDL设计实体内的数据传递以及端口界面外部数据的读写都必须通过变量赋值目标:=赋值源; aa:=‘1;b:=‘0;b数组单元素赋值目标 i:INTEGERRANGE0TO3; a(I)<=yb(3)<=z;c段下标元素赋值目标4:=“1011;d集合块赋值目标 4;s<=‘0‘1‘0‘0; (3=>e,4f,2=>(1),1>g(2)=h; a<=’0’;b<=’1’;c<=’0’; e:=h(3);IF语句CASE语句LOOP语句NEXT语句EXIT语句 END END END双2选1多路选择器SIGNALa,b,c,p1,p2,zIF(p1=‘1’)THEN ELSIF(p2=‘0’) SSbBBcAAa 表达式 选择值>= 顺序语句;(“>=”相当于then) 选择值>= ENDCASE语句中表达式的值,否则最末一个条件句中的选择必须用“OTHERS”。CASESIGNALvalue:INTEGERRANGE0TO15SIGNALout1:STD_LOGIC;CASEvalue ENDCASEvalueWHEN0 WHEN1=>out1<=‘0’;ENDCASE;CASEvalueWHEN0TO10 WHEN5TO15=>out1<=‘0’;ENDCASE;LOOP循环参数决定。LOOP语句的表达方式有3种。LOOP标号:ENDLOOPLOOPa:=EXIT a>10;--a10ENDLOOPLOOP标号:FORIN LOOPLOOPFORLOOP语句的局部变量,不必事先定于。这个LOOPLOOP语句内不要再使LOOP语句中的顺序语句被执行的8VHDL源码。USEENTITYp_checkSTD_LOI;ENDp_check;ARCHITECTUREoptOFp_checkISSIGNALtmp:STD_LOGIC;tmp<=‘0;FORnIN0TO7tmp<=tmpXORa(nENDy<=tmp;ENDFORnIN1TO3a(n)<=b(n)ANDc(n)ENDLOOP;c(1;c(2;c(3;[标号:WHILEENDLOOP标号FOR_LOOP语句不同,WHILE_LOOP语句没有给出循环,没有自动递增循环变量Shift1:PROCESSL1:WHILEn<=8Output(n)<=inputx(n+8;n:=n+1;ENDLOOPL1ENDPROCESS循环执行中,当n的值等于9时将跳出循环。有以下3种:NEXTLOOP标号 NEXTLOOP标号 NEXTLOOP标号WHEN条件表达式 LOOPNEXT语句时,即刻无条件终止当前的循环,跳回到本次循环LOOP语句处,开始下一次循环。NEXT旁加“LOOPLOOP第三种语句格式中,分句“WHENNEXT语句的条件,如果条件 S1:a(cnt_value):=‘0;:=‘0;ENDLOOPL1s2开始的赋值语句。在多重循环中,NEXT2-2那样,加上跳转标号2-2 S1:a(cnt_value):=‘0’;K:=0;L_y:S2:b(K:=‘0;NEXTL_x S3:(+8=‘0; LOOP执行语句;若为FALSE,则执行S3后使K1。(4)EXIT内部循环控制语句;EXIT语句格式也有三种: LOOP标号 LOOP标号 LOOP标号WHEN条件表达式 LOOPLOOPLOOP语句的循环起始点,EXITLOOPLOOPLOOP循环语句结束处, a_less_then_b:A_less_then_b<=FALSE; FORi b(i)=‘0)THENA_less_then_b<=FALSE; b(i)=‘1)THEN ELSENULL;ENDIF;END NULL为空操作语句,是为了满足ELSE的转换。此程序先比较a和b的,是这里假设a不等于b。WAITONWAITFOR三、VHDL<=WHEN赋值条件WHEN表达式;Z<= WHENp2=’1’;三句最后。这就是说,如果P1P21时,Za。WITH赋值目标信号<=WHENWHENWHENCASE语句的功能相选择信号语句中也有敏感量,即WHEN旁的选择表达式,每当选择表达式的值此子句表达式中的值赋给赋值目标信号。与CASE语句相类似,选择赋值语句对子句条件条测试的。因此,选择赋值语句不允许有条件现象,也不允许存在条件涵盖不全的情况。 Muxout<=0| b2TOcd COMPONENT元件名;ENDCOMPONENT例化名 元件名 MAPUSEIEEE.STD_LOGIC_1164.ALLENTITYnd2STD_LOGIC;ENDnd2;ARCHITECTUREnd2behvOFnd2ISC<=aNANDb;ENDnd2behv;USEIEEE.STD_LOGIC_1164.ALLENTITYord41z1:OUTSTD_LOGIC;ENDARCHITECTUREord41behvOFord41ISPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC;END u1:nd2PORTMAP(a1,b1,x); --位置关联方式u2:nd2PORTMAP(a=>c1,c=>y,b=>d1);--名字关联方式u3:nd2PORTMAP(x,y,c=>z1); 2-1ord41TYPEISOF基本数据类型;TYPEIS数据类型定义; st1ISARRAY(0TO15)OF weekIS(sun,on,ue,ed,hu,fr,sat; st116个元素的数组型数据类型,数组中每一个元VHDL预定义库中未被定义过的数据类型,这里的STD_LOGIC已被定义为标准位了。NodeFinder(Fuctional毕后,点击“GenerateFunctionalSimulationNetlist”保存到击Procesing菜单下的StartSimulation,KH-310板KH-310LED用VHDL语言和原理图分别完成设计、仿真和基本逻辑门电路半加器的过程:输入:a,b;输出:求和sum,进位c;在QuartusⅡ管理器界面中选择File/New..,菜单,出现New框,如图3.1所示。在框中选择VHDLFile,点击OK,打开文本编辑器,输入半加器的VHDL语言程序,如图1.2所示。然后保存文件halfadd.vhd。需要注意的是,文件名与模块名必须一致。图3.1Quartus图3.2输入半加器的VHDL图3.3在管理器窗口中选择File/NewProjectWizard...菜单,出现新建项目向导NewProjectWizard框,输入项目 图3.4所示,顶层实体名可以与项目名不同。图3.4图图图3.7点击Next按钮,再点击Next选择目标器件系列Cyclone,点击NEXT选择目标器件封装形式,引脚数目和速度级别。如图3.8所示,点击NEXT。图3.8点击FINISH按钮,项目halfadd出现在项目导航窗口中,如图3.9图3.9选择菜单Processing\StartComplition或直接点击中编译快捷按钮开始编译。编译过程译报告栏,编译结果在编译报告栏中自动更新,如图3.10所示。报告栏包含了将一个设计适配到器件的所有信息。选中某一获得更详细的信息。如编译有错误,需要修改设计进图3.10选择菜单File/New..,在New框中选择OtherFiles/VectorWaveformFile,出现空的仿真波形文件。将文件保存为halfadd.vwf。如图1.11所示:

图3.11选择菜单Edit/InsertNodeorBus..,在InsertNodeorBus框中点击按钮NodeFinder,先在Filter项里选择Pins:all,然后点击List,如图3.12所示:图3.12点击OK,加入节点。如图1.13所示:图3.13选择菜单Edit/EndTime..,可以调整最大仿真时间。本例使用200ns,如图3.14所示;选择菜单Edit\GridSize..,可以修改网格大小,通常用网格大小表示信号状态的基本维持时间,本例输入5ns,如图3.15所示。编辑激励波形时,先选中Name栏的一个节点,然后单击图形工具菜单中的赋值快捷键,如图3.16所示,根据要求编辑波形。图3.14确定仿真结束时 图3.15修改网格大

图3.16保存后选择Processing\StartSimulation菜单,或点击中的仿真快捷键按钮运行仿真器,波形如图3.16所示。如果仿真结果有错误,需要修改设计并重新编译仿真。选择Assignment\Pins菜单,打开引脚分配窗口,如图3.17所示。进行管脚分配:下面以33001板为例进行管脚分配:输入a设置为引脚pin1,输入b设置为引脚pin2,分别对应SW3的IO1和IO2;输出sum设置为引脚pin43,输出c设置为引脚pin44,分别对应KH-310主板LED区D1和D2两个LED,如下图:3.17将PC的并口和板的JTAG,/PS(Passiveserial)通过Al 的线连接起来。RESET是FPGA复位按键;TDO,TDI是目标器件选择短路夹,两个短路夹都接FO,FI时对FPGA配置,接EO,EI时对EPC2配置;配置开关控制EPC2对FPGA进行配置;该板支持JTAG、PS(Passiveserial)(QuartusII支持)两种配置方式。选择Tools\Programmer菜单,如图3.18所示。请注意在Hardwaresetup右边显示的是当前如图1.19所示,在弹出的框中点击“Add”按钮,则又会弹出一个框,选择含有“ByteBlasterMV”的项添加就可以指定烧录设备为“ByteBlasterMV(LPT1)”。在Mode栏中Start按钮开始。图图3.18

图3.19选择菜单FileNew..中BlockDiagram\SchematicFile打开模块编辑器。如图3.20图3.20添加模块:点击右键,选择Insert/Symbol,在Name中输入xor现异或门,如图1.21所示,点击ok拖入图中。同样输入AND2将与门加入图中;输入input,output加入输入输出。

图3.21图3.22保存文件为halfadd.bdf并将其设为顶层文件。接着就对原理图进行编译、仿真、下掌握CASEKH-310板KH-310KH-310LED控制8个LED四种模式循环切换,由复位键rst图输入信号时钟clk接10Hz输入 复位rst接拨动开关I01(拨码开关SW3左1)P18位输出信号接LED模块O25—O32。程序,将SW7拨至第二段(10Hz),拨码开关SW3的IO1拨至ONLED灯的前8 VHDLlibraryuseuseieee.std_logic_unsigned.all;entityledisport(clk:instd_logic;rst:inq:outstd_logic_vector(7downtoarchitectureledofledconstants0:std_logic_vector(1downtoconstants1:std_logic_vector(1downtoconstants2:std_logic_vector(1downtoconstants3:std_logic_vector(1downtosignalpresent:std_logic_vector(1downtosignalq1:std_logic_vector(7downtosignalcount:std_logic_vector(3downtoelsif(clk'eventandclk='1')thencasepresentiswhens0=>if(q1=" else elseq1<=q1(0)&q1(7downto1);endif;whens1=>if(count="0111")then elseq1<=q1(6downto0)&q1(7);endwhens2=>if(count="0011")then elseq1(7downto4)<=q1(4)&q1(7downto5);q1(3downto0)<=q1(2downto0)&q1(3);endif;whens3if(count="0011")then--S3模式:从中间到两边逐个点亮LED elseq1(7downto4)<=q1(6downto4)&q1(7);q1(3downto0)<=q1(0)&q1(3downto1);endif;endendendprocess;掌握时钟分频电路的HDL掌握CASEKH-310板KH-310KH-310LEDKH-310甲乙双方按乒乓球比赛规则来操作开关。当甲方按动发球开关Af时,靠近甲方的第一个灯图控制时钟CLK:可调时钟SW7 乒乓球信号shift[15..0]:LED显示模块SW3的IO1拨到ON后可进行比赛,PULS1为甲方发球,PULS2为甲方接球,PULS3为乙方发球,PULS4为乙方接球。LED灯中,始终点亮的代表球网,将SW7拨VHDLLibraryuseuseieee.std_logic_unsigned.all;entitycornaisportclr,af,aj,bf,bj,clk:instd_logic;shift:outstd_logic_vector(15downto0);ah,al,bh,bl:outstd_logic_vector(3downtoendarchitecturecorna_arcofcornaissignalamark,bmark:integer;signalclk1:std_logic;signalfen:std_logic_vector(9downto0);waituntilclk='1';endprocess;variablea,b:std_logic;variableshe:std_logic_vector(15downto0);ifclr='0'thenelsifclk1'eventandclk1='1'thenifa='0'andb='0'andaf='1'elsifa='0'andb='0'andbf='1'thenelsifa='1'andb='0'thenifshe>128thenifbj='1'thenshe:='0'&she(15downto1);endif;elsifshe=0ifbj='1'thenshe:='0'&she(15downto1);endif;endelsifa='0'andb='1'thenifshe<256andshe/=0thenifaj='1'thenshe:=she(14downto0)&'0';endif;elsifshe=0thenifaj='1'thenshe:=she(14downto0)&'0';endif;endif;endif;endvariableaha,ala,bha,bla:std_logic_vector(3downto0);variabletmp1,tmp2:integer;ifclr='0'thenelsifclk'eventandclk='1'thenifamark>tmp1thenifala="1001"thenendif;endif;ifbmark>tmp2thenifbla="1001"thenendif;endif;endif;endprocess;endLibraryuseentitych41aissel:instd_logic_vector(2downto0);d0,d1,d2,d3:instd_logic_vector(3downto0);q:outstd_logic_vector(3downto0)endarchitecturech41_arcofch41aiscaseselwhen"100"=>q<=d2;when"101"=>q<=d3;when"000"=>q<=d0;whenothers=>q<=d1;endcase;endendLibraryuseuseieee.std_logic_unsigned.all;entityselisportclk:insell:outstd_logic_vector(2downtoendarchitecturesel_arcofselisvariabletmp:std_logic_vector(2downto0);ifclk'eventandclk='1'theniftmp="000"thenelsiftmp="001"thenelsiftmp="100"thenelsiftmp="101"thenendif;endif;endprocess;endsel_arc;Libraryuseieee.std_logic_1164.all;entitydispisportd:instd_logic_vector(3downto0);q:outstd_logic_vector(6downtoendarchitecturedisp_arcofdispiscasedwhen when when when when when when when when whenothers=>q<=" endcase;endprocess;enddisp_arc;Libraryuseuseieee.std_logic_unsigned.all;entitypongisportclr,af,aj,bf,bj,clk:instd_logic;shift:outstd_logic_vector(15downto0);q:outstd_logic_vector(6downto0);net:outstd_logic_vector(1downto0);sellread:outstd_logic_vector(3downto0)endarchitecturepongofpongiscomponentcornaisportclr,af,aj,bf,bj,clk:instd_logic;shift:outstd_logic_vector(15downto0);ah,al,bh,bl:outstd_logic_vector(3downtoendcomponentch41aissel:instd_logic_vector(2downto0);d0,d1,d2,d3:instd_logic_vector(3downto0);q:outstd_logic_vector(3downto0)endcomponent;componentselisportclk:insell:outstd_logic_vector(2downtoendcomponent;componentdispisportd:instd_logic_vector(3downto0);q:outstd_logic_vector(6downtoendsignali1,i2,i3,i4,i5:std_logic_vector(3downto0);signali6:std_logic_vector(2downto0);u1:cornaportmap(clr,af,aj,bf,bj,clk,shift,i1,i2,i3,i4);u2:ch41aportmap(i6,i2,i1,i4,i3,i5);u3:selportmap(clk,i6);u4:dispportmap(i5,q);net<="11";--withi6--sellread<="1000"when--"0100"when- "0010"when--"0001"whenothers;sellread<="1000"wheni6="000"else"0100"wheni6="001"else"0010"wheni6="100"else"0001";end实验一指令译的设KH-310板4.1.1data2dataout输出,当不满足所列指令指令值data1 data1 data1 data1data1同或输入信号:译输入开关c、b、a接拨动开关I01(拨码开关SW3左1P1)、I02(拨开关SW3左2P2)、I03(拨码开关SW3左3P3),输入数据data1、data2接IO9(拨码开关SW4左1P11)、IO10(拨码开关SW3左2P12)LED模块O25KH-310板KH-310表2列举了步进电机的状态转换顺序。

输入信号时钟clk接10Hz输入(SW7) P152;方向dir接拨动开关I01(拨码开关SW3左1)P1;输出信号:4位输出信号接LED模块O25—O28。P43~P46;程序,将SW7拨至第二段(10Hz),此时,LED灯的前1位会有规律的闪烁。KH-310板KH-310KH-310LEDKH-310图计数器在正常工作下是对1HZ的频率计数,在调整时间状况下是对需要调整的时间模按下时,表示相应的调整块要加一,如要对小时调整时,显示时间的LED管将闪烁且当置LED显示。还可以增加定时和时区切换功基准时钟置数按键图CLR;P1信号PULSE1可进行时、分、秒的切换,按PULSE2可以对时,分,秒进行设置,I01为系统的使能,I01为off时开始计时。学习BCDKH-310板KH-310阵键盘模块输入运算数和操作符(0~9作为数据输入,A表示加号“+”,B表示减号“—”,F表示等号“=”,C表示清除)7段数码管作为数据显示单元,对输入数据和运算二进制编码的十进制(BCD码)BCD(BinaryCodeDecimal)码就是利用4位二进制编码表示十进制数的一种编码。为了实现十进制数运算器,须了解BCD码的运算原理。由于BCD码表示范围为0~9,所是将运算结果加0110(6)进行修正,如图1所示:图3.25BCD根据实验三中对矩阵键盘扫描原理的学习,我们在例程中使用di来记录键盘第i列的按键情况,表示第i列当前的按键。而用d(<=d0ord1ord2ord3)和d_reg表示键盘本轮扫描的按运算数为“45”。同时为了区分16个按键和没有按键的情况,ddi和d_reg定义均定义为5位图clk接100KHz频率时钟start接拨动开关程序,将拨码开关SW3的IO1拨到ON的位置,SW7拨到第六段的位置,此时,通过4*4键盘输入数据,即可进行计算器的实验(其中0~9作为数据输入,A表示加号“+”,B表示减号“—”,F表示等号“=”,C表示清除)。VHDLlibraryuseieee.std_logic_1164.all;entitycalculatorportclkinstd_logic100KHzstartinstd_logicKBCol:instd_logic_vector(3downto0);--键盘按键信息KBRow:outstd_logic_vector(3downto0);--键盘列扫描信号SCANoutstd_logic_vector(7downto0数码管选择控制信号seg7:outstd_logic_vector(7downto1)--数码管信号endarchitecturebevofcalculatortypestate_typeiss0,s1,s2,s3,s4状态机状态signalstate:state_type;signaloprstd_logic_vector(1downto0运算符(加、减、等于)signalopd1:std_logic_vector(7downto0);--操作数signalopstd_logicsignald0,d1,d2,d3,d,d_regstd_logic_vector(4downto0保存键盘每列的按键输入signaldatc,dath,datl:std_logic_vector(4downto0);--结果或当前操作数signalsegdatstd_logic_vector(4downto0当前数码管显示的数据processclk)variablecnt:std_logic_vector(9downto0);if(clk'eventandclk='1')thenifcnt(9)='0'thenendif;endendd<=d0ord1ord2ord3;--beginifstart='0'thenelsif(clk1'eventandcasestateiss0,s1,s2,s3分别对键盘4列进行扫描;s5whenKBRow<="0111";state<=s1;caseKBColis--fb73when"1110"=>when"1101"=>when"1011"=>when"0111"=>endcase;whenKBRow<="1011";state<=s2;caseKBColis--c840when"1110"=>when"1101"=>when"1011"=>when"0111"=>endcase;whenKBRow<="1101";state<=s3;caseKBColis--d951when"1110"=>when"1101"=>when"1011"=>when"0111"=>endcase;whencaseKBColis--when"11110"=>when"1101"=>when"1011"=>when"0111"=>endcase;whenKBRow<="1110";state<=s0;ifd/=d_regthend_reg<=ifd"10000"andd"11001"then数字键,更新操作数。dath<=datl;datl<=d; elsifd0="11010then加法运算符opd1<=dath(3downto0)&datl(3downto0);dath<="00000";datl<="00000";elsifd0="11011then减法运算符opd1<=dath(3downto0)&datl(3downto0);dath<="00000";datl<="00000";elsifd0="11111then等号,计算结果ifopr="01"then--加法if(datl(3downto0)+opd1(3downtoand(datl(3downto0)+opd1(3downto0)>=datl(3downto"datl(3downto0)<=datl(3downto0)+opd1(3downto0);ifdath(3downto0)+opd1(7downto4)<="1001"anddath(3downto0)+opd1(7downto4)>=dath(3downto"dath(3downto0)<=dath(3downto0)+opd1(7downto4);dath(3downto0)<=dath(3downto0)+opd1(7downto4)+"0110";datc<='1'&(datc(3downto0)+"0001");datl(3downto0)<=datl(3downto0)+opd1(3downto0)+"0110";ifdath(3downto0)+opd1(7downto4)<"1001"anddath(3downto0)+opd1(7downto4)>=dath(3downto"dath(3downto0)<=dath(3downto0)+opd1(7downto4)+"0001";dath(3downto0)<=dath(3downto0)+opd1(7downto4)+"0111";datc<='1'&(datc(3downto0)+"0001");endif;elsifopr="10thenifopd1>=dath(3downto0)&datl(3downto0)thenifopd1(3downto0)>=datl(3downto0)dath(3downto0)<=opd1(7downto4)-dath(3downto0);datl(3downto0)<=opd1(3downto0)-datl(3downto0);

datl(3downto0)<=opd1(3downto0)-datl(3downto0)+"1010";dath(3downto0)<=opd1(7downto4)-dath(3downto0)-"0001";endif;datc<="00010";--结果为负数,显示负号ifopd1(3downto0)<=datl(3downto0thendath(3downto0)<=dath(3downto0)-opd1(7downto4);datl(3downto0)<=datl(3downto0)-opd1(3downto0);datl(3downto0)<=datl(3downto0)-opd1(3downto0)+"1010";dath(3downto0)<=dath(3downto0)-opd1(7downto4)-"0001";endif;endif;endif;endif;endcase;endif;endvariablectrln:std_logic_vector(2downto0);ifstart='0' elsifclk'eventandclk='1'thencasectrln; when"100"=>segdat<="00000";when"101"=>segdat<="00000";endif;endcasesegdatwhenwhenwhen以下是一位16whenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenwhenothers=>endcase;endprocess;end掌握时钟分频电路的HDL掌握CASEKH-310板KH-310KH-310KH-310KH-3108X8LED采用测频法,设计一个8位十进制数字显示的数字频率计,其测量的范围为1~ 冲个数)Nx,则被测信号的频率为:fx=Nx/Tw,通常可以设定时间Tw为1秒图3.293.图3.30如图6.2所示,输入信号包括20M的基准时钟和1Hz~~40MHz的被测时钟,时间模块的作用是对基准时钟进行分频,得到一个1秒的信号,作为8位十进制计数器的计数标志,点阵模块显示Hz,8位数码管模块显示分频信号的频率。

图时钟SysClk接20MHz频率板上系统时钟时钟Clkin接可调时钟SW7,选择输入(1Hz~40MHz)被测时钟;P152 、、、77、78、79ctr(7downto0)接七段数码管选择信号SO58-SO65。P83、84、85、86、87、88、93、94Clockout:P1781.VHDLlibraryuseieee.std_logic_1164.all;entityCymometerisport(SysClk,Clkin:instd_logic;SEG7,SCAN:outstd_logic_vector(7downtoendarchitectureCymometerofCymometerissignalcnt:std_logic_vector(24downto0); tq8:std_logic_vector(3downtoprocess(SysClk)ifSysClk'event SysClk='1'--ifrising_edge(SysClk)thenifcnt= endif;endif;endifClkin'eventandClkin='1'then t='0'thenendif;endif;endif;endif;endif;endif;endif;endif;ifcntp1/="0000"cntp2/="0000"orcntp3/="0000"orcntp4/="0000"orcntp5/="0000"orcntp6/="0000"orcntp7/="0000"orcntp8/="0000"thenendif;endif;endendcasecnt(7downto5)when when when when when when when when endcase(Dat)when"0000"=>when"0001"=>when"0010"=>when"0011"=>when"0100"=>when"0101"=>when"0110"=>when"0111"=>when"1000"=>when"1001"=>whenendendprocess;endCymometer;实验三掌握LedKH-310板KH-310LedLed利用HDL语言来设计一个高速公路交叉路口信号灯控制器。使用Led显示模块和Led矩阵直行灯时间为5秒,停止灯时间为5秒,左转灯时间为5秒,二次红灯时间为5秒。对于其中每一个状态,由数码管显示剩余秒数,当倒计时到2秒以下(含)时,指示(LED)灯开始闪烁(数码管不闪烁)。LED闪烁效果可以通过时钟的高低电平变化来获取,例程中采用与4HZ时钟相与的方式获得。可以尝试将七段数码管和LED矩阵也进行相应修改,观察其闪烁效果。需要注意的是LED矩阵以低电平点亮每个LED。图Clock接10KHzReset接拨动开关I01;Strait_A_Out,Block_A_Out,Turn_A_Out接Led;Strait_B_Out,Block_B_Out,Turn_B_Out接Led;Road_Sign(6downto0)接LEDRoad_Sign(13downto7)接LED程序,将SW3的I01置于off可以看到点阵单元进行如下显示:直行灯时间为5秒,停止灯时间为5秒,左转灯时间为5秒,二次红灯时间为5秒。当倒计时到2秒以下(含)时,指示(LED)灯开始闪烁。若使用KH-33001/2/3板则需要有如图13.2所示的跳线图3.33使用KH-33001/2/3板时的跳图若使用KH-33004/5板则只需要将数码管的短路夹跳至JP2即可,如图3.33所示图3.34使用KH-33004/5板时的跳线VHDLlibraryuseIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;entitytrafficPort(Clock,Reset:inCount_Down_LCD:outstd_logic_vector(6downto0);Road_sign:outstd_logic_vector(13downto0);Ctr:outstd_logicendarchitecturetrafficoftrafficissignalClock_4Hz,LCD:std_logic;signalCount_4Hz:std_logic_vector(4downto0);signalCount_1Hz:std_logic_vector(1downto0);signalClock_1Hz:std_logic;signalCount_Down:std_logic_vector(2downto--signalCount_Down_LCD:std_logic_vector(6downto0);signalq:std_logic_vector(13downto0);signalState:std_logic_vector(1downto0);signalCount:std_logic_vector(2downtosignal--//wire[13:0]constantStrait_Block:std_logic_vector:="00";constantBlock_Turn:std_logic_vector:="01";constantTurn_Block:std_logic_vector:="10";constantBlock_Strait:std_logic_vector:="11";Strait_A_Out<=Strait_Aand(Clock_4HzorBlink);Strait_B_Out<=Strait_Band(Clock_4HzorBlink);Block_A_Out<=Block_Aand(Clock_4HzorBlink);Block_B_Out<=Block_Band(Clock_4HzorBlink);Turn_A_Out<=Turn_Aand(Clock_4HzorBlink);Turn_B_Out<=Turn_Band(Clock_4HzorBlink);Road_sign(13downto7)<=q(13downtoRoad_sign(6downto0)<=((notq(6))and(Clock_4HzorBlink))&((notq(5))and(Clock_4HzorBlink))&((notq(4))and(Clock_4HzorBlink))&((notq(3))and(Clock_4HzorBlink))&((notq(2))and(Clock_4HzorBlink))&((notq(1))and(Clock_4HzorBlink))&((notq(0))and(Clock_4Hzor--//*************Generate4HzClockSignalfrom1kHzClockSignal**********ifClock'eventandClock='1'thenCount_4Hz<=Count_4Hz-1;ifCount_4Hz="0000"Clock_4Hz<=notClock_4Hz;--Generate4Hzclocksignalendif;endif;endprocess;--//*************Generate1HzClockSignalfrom4HzClockSignal***********process(Clock_4Hz)ifClock_4Hz'eventandClock_4Hz='1'thenCount_1Hz<=Count_1Hz-1;ifCount_1Hz="00"Clock_1Hz<=notClock_1Hz; --//Generate1Hzclocksignalendif;endif;endprocess;--//****************************MainProgram*******************************process(Clock_1Hz)ifClock_1Hz'eventandClock_1Hz='1'thenifReset='1'thenStrait_A<='1';Block_A<='1';Turn_A<='1';Strait_B<='1';Block_B<='1';Turn_B<='1';Count_Down_LCD<="";ifState=Strait_BlockthenStrait_A<='1';Block_A<='0';Turn_A<='0';Strait_B<='0';Block_B<='1';Turn_B<='0';ifCount_Down="000"thenendif;elsifState=Block_TurnStrait_A<='0';Block_A<='1';Turn_A<='0';Strait_B<='0';Block_B<='0';Turn_B<='1';ifCount_Down="000"thenendif;elsifState=Turn_BlockStrait_A<='0';Block_A<='0';Turn_A<='1';Strait_B<='0';Block_B<='1';Turn_B<='0';ifCount_Down="000"thenendif;elsifState=Block_StraitStrait_A<='0';Block_A<='1';Turn_A<='0';Strait_B<='1';Block_B<='0';Turn_B<='0';ifCount_Down="000"thenendif;endcaseCount_Down";-";-when"010"=>Count_Down_LCD<=" ";--//3when"011"=>Count_Down_LCD<=" when"100"=>Count_Down_LCD<=" ";--//5when"101"=>Count_Down_LCD<=" when"110"=>Count_Down_LCD<=" ";--//7when"111"=>Count_Down_LCD<=" ";--//8endcaseifCount_Down>=3thenendif;endendif;endprocessvariablea:std_logic_vector(2downto0);ifClock'eventandClock='1'thenifReset='1'thenifCount="111"thenendif;caseaiswhen"100"=>caseCountwhen"000"=>q<="10000001111111";when"001"=>q<="01000001111111";when"010"=>q<="00100001011111";when"011"=>q<="00010000000000";when"100"=>q<="00001001011111";when"101"=>q<="00000101111111";when"110"=>q<="00000011111111";whenothers=>null;endcase;when"010"=>caseCountwhen"000"=>q<="10000000111110";when"001"=>q<="01000001011101";when"010"=>q<="00100001101011";when"011"=>q<="00010001110111";when"100"=>q<="00001001101011";when"101"=>q<="00000101011101";when"110"=>q<="00000010111110";whenothers=>null;endcase;when"001"=>caseCountwhen"000"=>q<="10000001111111";when"001"=>q<="01000001111111";when"010"=>q<="00100001110000";when"011"=>q<="00010001101111";when"100"=>q<="00001001101111";when"101"=>q<="00000101000111";whenwhenothers=>null;endcase;whenothers=>null;endcase;endif;endprocess;endtraffic;KH-31001图图 (1).(a)(b)--(2).8bitDIP开关4×4矩阵(扫描)键盘LED×7段(独立/扫描)12864LCD字型及绘图显示器8×8点阵彩色显示器扬声器USB接口PS/2接口VGA×18X8X8阶彩色RS-2328bits8bits256Kbits图1.35V~3.3V的DC-DC产生的电源+3.3Vex给除FPGA以外的所有和器件供电。显然这两个电源是共地的,图1.4三、4×4矩阵(扫描)1.5

1.6按键内部连线图按键和FPGA管脚连接关系如下:四、LED1.7LED1.1LEDI/O(LEDFPGA管脚连接图使用JP28/JP27来对应LEDD25-D36,EX01-EX12是选择由IO77-IO88EX01-EX12图 LED实物五、7段(独立/扫描)图 表 M124――FPGASO58――FPGAO51――FPGAM125――FPGASO59――FPGAO52――FPGAM126――FPGASO60――FPGAO53――F

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论