VHDL实验报告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位可逆计数器:library ieee;use ieee.std_logic_1164.all;entity cnt isport(clk,ctr,rst: in bit;clkout: buffer bit;led:out std_logic_vector(3 downto 0));end cnt;architecture arch_cnt of cnt isbeginprocess(clk)variable cnt: integer;beginif (clk'event and clk='1')thencnt:=cnt+1;if(cnt=16777216)thenclkout<=not clkout;cnt:=0;end if;end if;end process;process(clkout,ctr)variable tem:integer range 0 to 15;beginif(rst='0') thenif (ctr='1') then tem:=0; end if;if (ctr='0') then tem:=15;end if;elsif(clkout'event and clkout='1') thenif(ctr='1') thenif (tem=15)then tem:=0; end if;tem:=tem+1;end if;if(ctr='0') thenif (tem=0)then tem:=15; end if;tem:=tem-1;end if;end if;--end if;case tem iswhen 0=>led<="0000";when 1=>led<="0001";when 2=>led<="0010";when 3=>led<="0011";when 4=>led<="0100";when 5=>led<="0101";when 6=>led<="0110";when 7=>led<="0111";when 8=>led<="1000";when 9=>led<="1001";when 10=>led<="1010";when 11=>led<="1011";when 12=>led<="1100";when 13=>led<="1101";when 14=>led<="1110";when 15=>led<="1111";when others=>null;end case;end process;end arch_cnt;2)4位可逆二进制代码-格雷码转换器:library ieee;using ieee.std_logic_1164.all;entity graycode isport(ctr:in std_logic;sw:buffer std_logic_vector(3 downto 0);led:buffer std_logic_vector(3 downto 0));end graycode;architecture garycoder of graycode isbeginprocess(ctr,sw)beginif(ctr='0') thenled[3]<=sw[3];for i in 2 downto 0 loopled[i]<=led[i+1] xor sw[i];end loop;elsif(ctr='1') thenled[3]=sw[3];for i in 2 downto 0 loopled[i]=sw[i+1] xor sw[i];end loop;else null;end if;end process;end garycoder;[实验心得]:本次实验让我了解了基本的时序电路设计,仿真和测试,也进一步加深对VHDL语言的理解。
同时我也进行了4位二进制可逆计数的设计和格雷码转换器的设计,对其原理和工作方式有了进一步的熟悉。
本次实验给了我从理论性的VHDL设计向实践和操作的过程的体验。
实验六. 序列检测器的设计[设计思路及步骤]:一.需求:使用状态机设计一个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的值,这步为时序逻辑部分;[源程序]:library ieee;use ieee.std_logic_1164.all;entity seriescheck isport(clk,d,rst:in bit;res:out bit);end seriescheck;architecture serieschecker of seriescheck istype state is (one,two,three,four,five,six);signal pstate,nstate:state;beginprocess(rst,clk)beginif(rst='1') thenpstate<=one;elsif(clk'event and clk='1') thenpstate<=nstate;end if;end process;process(d,pstate)begincase pstate iswhen one =>res<='0';if(d='1') then nstate<=two;else nstate<=one;end if;when two =>res<='0';if(d='0') then nstate<=three;else nstate<=two;end if;when three =>res<='0';if(d='1') then nstate<=four;else nstate<=one;end if;when four =>res<='0';if(d='1') then nstate<=five;else nstate<=three;end if;when five =>res<='0';if(d='0') then nstate<=six;else nstate<=two;end if;when six =>res<='1';if(d='0') then nstate<=one;else nstate<=two;end if;end case;end process;end serieschecker;[实验心得]:实验之后,我学会了使用VHDL实现状态机的基本方法,实验中要求利用状态机实现序列检测器,我联系到以前编程的经验使用VHDL来完成了目的。