VHDL实验报告60 庄炜旭实验三. 4位可逆计数器,4位可逆二进制代码-格雷码转换器设计一.实验目的学习时序电路的设计,仿真和硬件测试,进一步熟悉VHDL设计技术1. 学习4位可逆计数器的设计2. 学习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为低位。
c)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高位,LEDR0为低位。
三.管脚设定SW[0]PIN_N25SW[1]PIN_N26SW[2]PIN_P25SW[3] PIN_AE14SW[17] PIN_V2LEDR[0] PIN_AE23LEDR[1] PIN_AF23LEDR[2] PIN_AB21LEDR[3] PIN_AC22LEDR[17] PIN_AD12KEY[3] PIN_W26CLOCK_50 PIN_N2四.相关知识二进制代码与格雷码相互转换格雷码(Gray Code,简称G码)是典型的循环码,它是由二进制码(Binary,简称 B 码)导出的。
特点是序号相邻的两组代码只有一位码不同(包括头尾两组代码),且具有循环性。
上述特点使全部码组按序循环相邻,若以循环码表示一个循环过程中按顺序发生的状态,则任何状态变化只对应有一个变量发生变化,这个特点有助于提高电路的可靠性。
五.思路及原理框图本实验分两个部分,首先是一个四位可逆计数器。
这是一个比较基础的部分,每次时钟信号来的时候内置计数器加一或者减一,到十六或者零的时候相应跳变,然后再把这个相应的信号转换到led灯上输出。
第二部分是关于格雷码与二进制码的转换,如上表所示,它把转换关系都告诉我们,这样我们只需要读入单片机上面的输入,再通过几个简单的公式转化输出即可。
框图如下:六.源代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.All;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity count isport(clk_count:in std_logic;SW17:in std_logic;key3:in std_logic;led_out:out std_logic_vector(3 downto 0);ledr17:out std_logic);end count;architecture b of count issignal cntQ:std_logic_vector(3 downto 0);signal countQ:std_logic_vector(24 downto 0):= "0000000000000000000000000";beginprocess(clk_count,SW17,key3)begin--u1:DIV port map(clk_count,clk25);if(key3='0')thenif(sw17='1')thencntQ<="0000";elsecntQ<="1111";end if;elsif(clk_count'event and clk_count='1')thencountQ<=countQ+1;if(countQ(24)='1')thencountQ<=(others=>'0');if(sw17='1')thencntQ<=cntQ+1;elsif(sw17='0')thencntQ<=cntQ-1;end if;end if;end if;end process;led_out<=cntQ;ledr17<=sw17;end b;--------------entity gray isport(sw:in std_logic_vector(17 downto 0);ledr:out std_logic_vector(3 downto 0));end gray;architecture rtl of gray issignal gray:std_logic_vector(3 downto 0);beginprocess(sw)beginif(sw(17)='1')thengray(3)<=sw(3);gray(2)<=sw(3) xor sw(2);gray(1)<=sw(2) xor sw(1);gray(0)<=sw(1) xor sw(0);elsegray(3)<=sw(3);gray(2)<=gray(3) xor sw(2);gray(1)<=gray(2) xor sw(1);gray(0)<=gray(1) xor sw(0);end if;ledr<=gray;end process;end rtl;七.结论与心得体会这个实验难度不大,逻辑思路十分清晰简单,但我却做得很不顺利,做了两个半小时,主要原因是,我的代码中分了许多if循环,而且这些if语句又没有嵌套,这个造成的结果是程序只要检测到敏感列表中的变量的变化,就会在执行完本次循环后跳出,重新执行,这样有些语句就一直没法被执行。
这次实验给我的体会很深,上述失败也让我对VHDL语言编程有了深刻的了解,让我也让我体会到了之前的无知,我决定回去认真研读课本,好好学好这门课。
实验四. 7段数码管译码器设计与实现一.实验目的1.掌握7段数码管译码器的设计与实现2.掌握模块化的设计方法二.实验内容设计一个7段数码管译码器,带数码管的4位可逆计数器[具体要求]1. 7段数码管译码器a)使用拨码开关SW3, SW2, SW1, SW0作为输入,SW3为高位,SW0为低位。
b)将输出的结果在HEX1,HEX0显示。
当输入为‘0000’~‘1111’显示为00~15,2. 带数码管的4位可逆计数器将实验三的结果在数码管上显示。
结合上次实验,将4位可逆计数器,数码管显示,分别作为两个子模块,实现在数码管上显示的4位可逆计数器。
模块化的设计,可以参考《VHDL硬件描述语言与数字逻辑电路设计》一书的第九章三.管脚设定SW[0] PIN_N25SW[1] PIN_N26SW[2] PIN_P25SW[3] PIN_AE14SW[17] PIN_V2HEX0[0] PIN_AF10HEX0[1] PIN_AB12HEX0[2] PIN_AC12HEX0[3] PIN_AD11HEX0[4] PIN_AE11HEX0[5] PIN_V14HEX0[6] PIN_V13HEX1[0] PIN_V20HEX1[1] PIN_V21HEX1[2] PIN_W21HEX1[3] PIN_Y22HEX1[4] PIN_AA24HEX1[5] PIN_AA23HEX1[6] PIN_AB24LEDR[17] PIN_AD12KEY[3] PIN_W26CLOCK_50 PIN_N2四.相关知识数码管如右图所示:每一条线分别对应一个管脚,当管脚为‘0’时,这条线为亮,当管脚设置为‘1’时,这条线不亮。
在DE2中,共有8个数码管。
例如:设置HEX0[0]的管脚为‘0’,那么这条线就会亮。
要让HEX0显示数字0,那么我们可以设置HEX0为“1000000”.五.设计思路及实验框图首先是七段管码的编辑,这是一个相对简单的问题,只需要检测四个按键是否被按下,再转换为相应的数字大小,然后根据上图给的管脚定义,通过一个switch函数,转化为输出。
而第二个实验要求也同样简单,每个时钟就将内置的计数器加一,然后到16以后自动回零,只需相应地转换为数码管输出即可。
六.源代码--------------freqdiv--------------------LIBRARY ieee;USE ieee.std_logic_1164.all;-----------------------------------------ENTITY freqdiv ISPORT(clk: IN STD_LOGIC;out1: BUFFER STD_LOGIC);END freqdiv;-----------------------------------------ARCHITECTURE behavior OF freqdiv ISSIGNAL count1: INTEGER RANGE 1 TO 2**24;BEGINPROCESS(clk)BEGINIF( clk'EVENT AND clk = '1') THENcount1 <= count1 + 1;IF( count1 = 2**24 ) THENout1 <= NOT out1;count1 <= 1;END IF;END IF;END PROCESS;END behavior;--------------subcounter---------------------LIBRARY ieee;USE ieee.std_logic_1164.all;---------------------------------------------ENTITY subcounter ISPORT(clk,SW17,KEY3: IN STD_LOGIC;count2: BUFFER INTEGER RANGE 0 TO 15);END subcounter;---------------------------------------------ARCHITECTURE behavior OF subcounter ISBEGINPROCESS(clk,SW17,KEY3 )BEGINIF( KEY3 = '0' )THENIF( SW17 = '1' )THEN count2 <= 0;ELSE count2 <= 15;END IF;ELSIF( clk'EVENT AND clk = '1')THENIF( SW17 = '1' )THENIF( count2 = 15 )THEN count2 <= 0;ELSE count2 <= count2 + 1;END IF;ELSEIF( count2 = 0 )THEN count2 <= 15;ELSE count2 <= count2 - 1;END IF;END IF;END IF;END PROCESS;END behavior;----------------decoder-----------------------LIBRARY ieee;USE ieee.std_logic_1164.all;----------------------------------------------ENTITY decoder ISPORT(num: IN INTEGER RANGE 0 TO 15;digit1,digit2: OUT STD_LOGIC_VECTOR( 0 TO 6)); END decoder;----------------------------------------------ARCHITECTURE behavior OF decoder ISBEGINPROCESS(num)variable temp1:INTEGER RANGE 0 TO 9;variable temp2:INTEGER RANGE 0 TO 9;BEGINtemp1 := num/10;temp2 := num-temp1*10;CASE temp1 ISWHEN 0 => digit1 <= "0000001";WHEN 1 => digit1 <= "1001111";WHEN 2 => digit1 <= "0010010";WHEN 3 => digit1 <= "0000110";WHEN 4 => digit1 <= "1001100";WHEN 5 => digit1 <= "0100100";WHEN 6 => digit1 <= "0100000";WHEN 7 => digit1 <= "0001111";WHEN 8 => digit1 <= "0000000";WHEN 9 => digit1 <= "0000100";END CASE;CASE temp2 ISWHEN 0 => digit2 <= "0000001";WHEN 1 => digit2 <= "1001111";WHEN 2 => digit2 <= "0010010";WHEN 3 => digit2 <= "0000110";WHEN 4 => digit2 <= "1001100";WHEN 5 => digit2 <= "0100100";WHEN 6 => digit2 <= "0100000";WHEN 7 => digit2 <= "0001111";WHEN 8 => digit2 <= "0000000";WHEN 9 => digit2 <= "0000100";END CASE;END PROCESS;END behavior;----------------MAIN--------------------------LIBRARY ieee;USE ieee.std_logic_1164.all;----------------------------------------------ENTITY counter ISPORT(clk50,SW17,KEY3: IN STD_LOGIC;digit1,digit2: OUT STD_LOGIC_VECTOR(0 TO 6));END counter;----------------------------------------------ARCHITECTURE behavior OF counter IS----------------------------------------------COMPONENT freqdiv ISPORT(clk: IN STD_LOGIC; out1: BUFFER STD_LOGIC);END COMPONENT;----------------------------------------------COMPONENT subcounter ISPORT(clk,SW17,KEY3: IN STD_LOGIC; count2: BUFFER INTEGER RANGE 0 TO 15);END COMPONENT;----------------------------------------------COMPONENT decoder ISPORT(num: IN INTEGER RANGE 0 TO 15; digit1,digit2: OUTSTD_LOGIC_VECTOR( 0 TO 6));END COMPONENT;----------------------------------------------SIGNAL n: INTEGER RANGE 0 TO 15;SIGNAL clknew: STD_LOGIC;BEGINU1: freqdiv PORT MAP(clk50, clknew );U2: subcounter PORT MAP( clknew, SW17, KEY3, n );U3: decoder PORT MAP( n, digit1,digit2 );END behavior;七.结论与心得体会本次实验的逻辑部分都相当简单,但是关于模块化程序设计的思想与方法是十分深刻和复杂的。