1VHDL实验报告5080309563李斌实验三.4位可逆计数器,4位可逆二进制代码-格雷码转换器设计[设计思路及步骤]:一.需求:设计4位可逆计数器,及4位可逆二进制代码-格雷码转换器,并仿真,下载。[具体要求]1.4位可逆计数器a)使用CLOCK_50作为输入时钟,其频率为50MHz(对于频率大于50Hz的闪烁,人眼会看到连续的光),因而,对其进行225的分频后,再用于时钟控制。(可利用实验一)b)使用拨码开关SW17作为模式控制,置‘1’时为加法计数器,置‘0’时为减法计数器,同时使用LEDR17显示SW17的值。c)使用KEY3作为异步复位开关(按下时为0,不按为1),当为加法计数器时,置“0000”,当为减法计数器时,置“1111”。d)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高位,LEDR0为低位。2.4位可逆二进制代码――格雷码转换器a)使用拨码开关SW17作为模式控制,置‘1’时为二进制代码―格雷码转换,置‘0’时为格雷码―二进制代码,同时使用LEDR17显示SW17的值。b)使用拨码开关SW3,SW2,SW1,SW0作为输入的被转换数,SW3为高位,SW0为低位。使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高位,LEDR0为低位。二.变量解释:4位可逆计数器:1.clk为时钟输入,clkout为分频后的时钟,cnt为分频计数,ctr为SW17模式控制,rst为KEY3异步复位开关,tem为输出结果的中间变量;2.本实验的时钟输入为50MHz,定义为clk,为此设计时需要将其分频为50Hz,需225分频,因此,代码中,需要有一个cnt作为一个225计数器,同时,定义分频后的时钟为clkout;3.建立process,检测key是否为0,为0则复位。否则,检测clkout,触发上升沿则检测模式控制,对tem加1或减1,同时应检测是否达到最大或最小值,达到最值则直接返回到最初值,否则继续操作;4.最后,转换tem的值为相应的4位二进制数,并于LED上反映出来。四位可逆二进制代码-格雷码转换器:1.检测模式,进行相应的操作;2.ctr为0则格雷码转换成二进制码;ctr为1则为二进制码转换为格雷码[源代码]:1)4位可逆计数器:libraryieee;useieee.std_logic_1164.all;entitycntis2port(clk,ctr,rst:inbit;clkout:bufferbit;led:outstd_logic_vector(3downto0));endcnt;architecturearch_cntofcntisbeginprocess(clk)variablecnt:integer;beginif(clk'eventandclk='1')thencnt:=cnt+1;if(cnt=16777216)thenclkout=notclkout;cnt:=0;endif;endif;endprocess;process(clkout,ctr)variabletem:integerrange0to15;beginif(rst='0')thenif(ctr='1')thentem:=0;endif;if(ctr='0')thentem:=15;endif;elsif(clkout'eventandclkout='1')thenif(ctr='1')thenif(tem=15)thentem:=0;endif;tem:=tem+1;endif;if(ctr='0')thenif(tem=0)thentem:=15;endif;tem:=tem-1;endif;endif;--endif;casetemiswhen0=led=0000;when1=led=0001;when2=led=0010;when3=led=0011;when4=led=0100;when5=led=0101;when6=led=0110;when7=led=0111;when8=led=1000;when9=led=1001;when10=led=1010;when11=led=1011;when12=led=1100;when13=led=1101;when14=led=1110;when15=led=1111;whenothers=null;endcase;endprocess;endarch_cnt;2)4位可逆二进制代码-格雷码转换器:libraryieee;3usingieee.std_logic_1164.all;entitygraycodeisport(ctr:instd_logic;sw:bufferstd_logic_vector(3downto0);led:bufferstd_logic_vector(3downto0));endgraycode;architecturegarycoderofgraycodeisbeginprocess(ctr,sw)beginif(ctr='0')thenled[3]=sw[3];foriin2downto0loopled[i]=led[i+1]xorsw[i];endloop;elsif(ctr='1')thenled[3]=sw[3];foriin2downto0loopled[i]=sw[i+1]xorsw[i];endloop;elsenull;endif;endprocess;endgarycoder;[实验心得]:本次实验让我了解了基本的时序电路设计,仿真和测试,也进一步加深对VHDL语言的理解。同时我也进行了4位二进制可逆计数的设计和格雷码转换器的设计,对其原理和工作方式有了进一步的熟悉。本次实验给了我从理论性的VHDL设计向实践和操作的过程的体验。4实验六.序列检测器的设计[设计思路及步骤]:一.需求:使用状态机设计一个5位序列检测器。从一串二进制码中检测出一个已预置的5位二进制码”10110”[具体要求]1.画出状态转换图。(每增加一位二进制码相当于增加一个状态,再加上一个初始态,用6个状态可以实现.)2.写出状态机的源程序,编译。要求当检测到预置序列时,输出一个脉冲的高电平,其余时候输出为低电平。3.进行仿真,看结果是否正确。二.思路:用一个6状态实现,特别考虑了当出现“10110110”这类前一个正确序列为结束,后一个正确序列已开始的情况。三.定义各量:clk为时钟输入,d为数据输入,res为复位信号,res为检测结果输出,pstate为现态,nstate为下一状态,同时,自定义数据类型state,取值从one到six,表示6个状态,pstate和nstate为state类型;检测复位信号rst,若为1则复位为寝状态one,否则,检测时钟输入,若时钟触发上升沿,则pstate取得nstate的值,这步为时序逻辑部分;[源程序]:libraryieee;useieee.std_logic_1164.all;entityseriescheckisport(clk,d,rst:inbit;res:outbit);endseriescheck;architectureseriescheckerofseriescheckistypestateis(one,two,three,four,five,six);signalpstate,nstate:state;beginprocess(rst,clk)beginif(rst='1')thenpstate=one;elsif(clk'eventandclk='1')thenpstate=nstate;endif;endprocess;process(d,pstate)begincasepstateiswhenone=res='0';if(d='1')thennstate=two;elsenstate=one;endif;whentwo=res='0';if(d='0')thennstate=three;elsenstate=two;5endif;whenthree=res='0';if(d='1')thennstate=four;elsenstate=one;endif;whenfour=res='0';if(d='1')thennstate=five;elsenstate=three;endif;whenfive=res='0';if(d='0')thennstate=six;elsenstate=two;endif;whensix=res='1';if(d='0')thennstate=one;elsenstate=two;endif;endcase;endprocess;endserieschecker;[实验心得]:实验之后,我学会了使用VHDL实现状态机的基本方法,实验中要求利用状态机实现序列检测器,我联系到以前编程的经验使用VHDL来完成了目的。过程中我了解了序列检测器的基本工作原理,并得知其在通信中的广泛应用和巨大作用。6实验七.基于ROM的正弦波发生器的设计[设计思路及步骤]:一.需求:设计基于ROM的正弦波发生器,对其编译,仿真。具体要求:1.正弦发生器由波形数据存储模块(ROM),波形发生器控制模块及锁存模块组成2.波形数据存储模块(ROM)定制数据宽度为8,地址宽度为6,可存储64点正弦波形数据,用MATLAB求出波形数据。3.将50MHz作为输入时钟。二.原理图:三.由于地址宽度为6,最多存64个数据,因此,在一个周期2π内,等间隔取64个采样点;同时,由于数据的宽度为8,因此数据值的范围可以为0到256,使用MATLAB得到这64个波形数据,如下:10000000,10001101,10011001,10100101,10110001,10111100,11000111,11010001,11011011,11100011,11101010,11110001,11110110,11111010,11111110,11111111,11111111,11111111,11111110,11111010,11110110,11110001,11101010,11100011,11011011,11010001,11000111,10111100,10110001,10100101,10011001,10001101,10000000,01110011,01100111,01011011,01001111,01000100,00111001,00101111,00100101,00011101,00010110,00001111,00001010,00000110,00000010,00000001,00000000,00000001,00000010,00000110,00001010,00001111,00010110,00011101,00100101,00101111,00111001,01000100,01001111,01011011,01100111,01110011[源代码]:libraryieee;useieee.std_logic_1164.all;entityseventisgeneric(bits:integer:=8;words:integer:=64);port(addr:bufferintegerrange0towords-1;data:bufferstd_logic_vector(bits-1downto0);clk:inbit;wave:bufferstd_logic_vector(7downto0));endsevent;architecturearch_seventofseventistypevector_arrayisarr