实验三 时序逻辑电路的VHDL设计
- 格式:doc
- 大小:299.50 KB
- 文档页数:4
VHDL语言的时序电路设计-----设计一个可逆计数译码显示电路一、实验目的掌握VHDL设计的基本方法,进一步熟悉MAX+PLUSII的使用。
二、实验内容1、具有清除端、使能端,计数范围为0—9的可逆计数器设计。
输出为8421BCD码。
2、8421BCD码—七段LED译码显示电路设计。
三、实验条件(1)电脑。
(2)开发软件:MAX+PLUSII。
(3)实验设备:EL—EDA—V型、EDA实验开发系统。
(4)拟用芯片:ACEX1K:EP1K100QC208-3。
四、实验要求1、用VHDL设计上述两个电路,用元件例化的方式实现顶层设计。
2、完成功能仿真和时序仿真。
3、对设计结果进行下载和硬件测试。
提示:设计可以采用自顶向下的设计方法或自底向上的设计方法。
一般采用自顶向下的设计方法,即先对顶层进行系统结构描述,再组建底层设计。
五、实验步骤1、用元件例化的方式实现顶层设计;2、设计具有异步清除端、同步使能端,计数范围为0—9的十进制可逆计数器;3、设计8421BCD码/七段LED的显示译码器。
六、实验设计(1)可逆计数、译码及显示电路的VHDL语言程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;------entity count10_top isport(CLR,EN,UP,CLK: in STD_LOGIC;LED7S: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);CO,BO: OUT STD_LOGIC);end count10_top;-------architecture a of count10_top iscomponent count10port( CLR,EN,UP,CLK: in STD_LOGIC;Q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CO,BO: OUT STD_LOGIC );end component;component DEC7Sport(A: in STD_LOGIC_VECTOR(3 DOWNTO 0);LED7S: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));end component;SIGNAL D: STD_LOGIC_VECTOR(3 DOWNTO 0);beginU1:count10 PORT MAP (CLR,EN,UP,CLK,D,CO,BO);U2:DEC7S PORT MAP (D,LED7S);end a;----LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity count10 isport(CLR,EN,UP,CLK: in STD_LOGIC;Q: BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);CO,BO: OUT STD_LOGIC);end count10;-----architecture b of count10 isbeginProcess(CLR,EN,UP,CLK)beginIF CLR='0' THENQ<="0000";ELSIF CLK'EVENT AND CLK='1' THENIF EN='1' THENIF UP='1' THENIF Q=9 THENQ<="0000";ELSEQ<=Q+1;END IF;ELSEIF Q=0 THENQ<="1001";ELSEQ<=Q-1;END IF;END IF;END IF;END IF;END Process;CO<='1' when Q=9 ELSE'0';BO<='1' when Q=0 ELSE'0';end b;-----LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;entity DEC7S isPORT(A:IN BIT_VECTOR(3 DOWNTO 0);LED7S:OUT BIT_VECTOR(6 DOWNTO 0)); END DEC7S;ARCHITECTURE one OF DEC7S ISBEGINPROCESS(A)BEGINCASE A(3 DOWNTO 0) ISWHEN "0000"=>LED7S<="0111111";WHEN "0001"=>LED7S<="0000110";WHEN "0010"=>LED7S<="1011011";WHEN "0011"=>LED7S<="1001111";WHEN "0100"=>LED7S<="1100110";WHEN "0101"=>LED7S<="1101101";WHEN "0110"=>LED7S<="1111101";WHEN "0111"=>LED7S<="0000111";WHEN "1000"=>LED7S<="1111111";WHEN "1001"=>LED7S<="1101111";WHEN OTHERS=>NULL;END CASE;END PROCESS;END one;(2)仿真波形(1)系统仿真情况系统功能仿真结果与时序仿真结果分别如图1、图2所示:图1、系统功能仿真结果图2、系统时序仿真结果从系统仿真结果可以看出,本系统完全符合设计要求。
实验三 VHDL 时序逻辑电路设计一、实验目的1.熟悉用VHDL语言设计时序逻辑电路的方法2.熟悉用Quartus文本输入法进行电路设计二、实验所用仪器元件及用途1.计算机:装有Quartus软件,为VHDL语言提供操作场所。
2.直流稳压电源:通过USB接口实现,为实验开发板提供稳定电源。
3.数字系统与逻辑设计实验开发板:使试验结果下载到开发板上,实现整个实验的最终结果。
三、实验内容1.用VHDL语言设计实现一个8421码十进制计数器。
(1)实验内容及要求:在Quartus平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。
(2)试验结果:VHDL代码和仿真结果。
2.用VHDL语言设计实现一个分频系数为8,分频输出信号占空比为50%的分频器。
(1)实验内容及要求:在Quartus平台上设计程序和仿真题目要求。
(2)试验结果:VHDL代码和仿真结果。
3.用VHDL语言设计实现一个控制8个发光二极管亮灭的电路。
(1)实验内容及要求:在Quartus平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。
a.单点移动模式:一个点在8个发光二极管上来回的亮b.幕布式:从中间两个点,同时向两边依次点亮直至全亮,然后再向中间点灭,依次往复c.通过拨码开关或按键控制两种模式的转换(2)试验结果:VHDL代码和仿真结果。
四、实验设计思路及过程1.8421码十进制计数器状态转移表左图为8421码十进制计数器的状态转移表,abcd为初状态,ABCD为下一状态,每当有“1”出现时,相应的管脚就亮灯,从而从0000到1001的灯依次出现。
VHDL代码如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count12 ISPORT(clk,clear:IN STD_LOGIC;q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END count12;ARCHITECTURE a OF count12 ISSIGNAL q_temp:ATD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk)BEGINIF(clk'event and clk='1') THENIF clear='0' THENq_temp<="0000";ELSIF q_temp="1011"THENq_temp<="0000";ELSEq_temp<=q_temp+1;END IF;END IF;END PROCESS;q<=q_temp;END a;2.分频系数为8,输出占空比为50%的分频器的设计左图为八分频器(占空比50%)的状态转移图,其中abc为原状态,ABC为下一状态。
实验名称:时序逻辑VHDL设计---触发器一、同步清零(低电平有效)和异步置数(高电平有效)的D触发器的VHDL设计1.实体框图Dclk Reset set QD_FFinst2.程序设计①编译前的程序library ieee;use ieee.std_logic_1164.all;Entity D_FF isport(D,clk,Reset,set:in std_logic;Q:out std_logic);End Entity D_FF;Architecture one of D_FF issignal Q1:std_logic;Beginprocess(clk,Reset,set)Beginif set='1' thenQ1<='1';Elseif clk'event and clk='1' thenif Reset='0' thenQ1<='0';elseQ1<=D;end if;end if;end process;Q<=Q1;End architecture one;②程序编译错误情况错误1:Error (10500): VHDL syntax error at D_FF.vhd(22) near text "process"; expecting "if"错误2:Error (10500): VHDL syntax error at D_FF.vhd(24) near text "architecture"; expecting "if"分析:经检查,发现原程序少了END if,没有与if匹配,添加即可。
③正确的程序library ieee;use ieee.std_logic_1164.all;Entity D_FF isport(D,clk,Reset,set:in std_logic;Q:out std_logic);End Entity D_FF;Architecture one of D_FF issignal Q1:std_logic;Beginprocess(clk,Reset,set)Beginif set='1' thenQ1<='1';Elseif clk'event and clk='1' thenif Reset='0' thenQ1<='0';elseQ1<=D;end if;end if;end if;end process;Q<=Q1;End architecture one;3.仿真波形图4.仿真波形分析当置数端SET出现高电平时,此时不管CP脉冲和D的状态如何,输出立即置为‘1’,实现异步置数的功能;当清零端RESET出现低电平时,而且必须当CP脉冲为上升沿时,输出清零,实现同步清零;除此之外,当CP脉冲为上升沿状态时,D=0,Q=0;D=1,Q=1;二、异步清零(高电平有效)和同步置数(低电平有效)的JK触发器的VHDL设计1.实体框图clk reset setJK[0..1]QJK_FFinst2.程序设计①编译前的程序Library ieee;use ieee.std_logic_1164.all;Entity JK_FF isport( clk,reset,set,J,K:in std_logic;Q:out std_logic);End entity JK_FF;Architecture two of JK_FF issignal Q1:std_logic;beginprocess(clk,reset,set,J,K)beginif reset='1' thenQ1<='0';elseif clk'event and clk='1' thenif set='0' thenQ1<='1';elsecase JK iswhen "00" => Q1<=Q1;when "10" => Q1<='1';when "11" => Q1<=not Q1;when others =>NULL;end case;end if;end if;end if;end process;Q<=Q1;end architecture two;②程序编译错误情况错误1:Error (10482): VHDL error at JK-FF.vhd(19): object "JK" is used but not declared错误2:Error (10523): Ignored construct two at JK-FF.vhd(7) due to previous errors分析:JK为两位,需要定义如下:JK:in std_logic_vector(0 to 1);③正确的程序Library ieee;use ieee.std_logic_1164.all;Entity JK_FF isport( clk,reset,set:in std_logic;JK:in std_logic_vector(0 to 1);Q:out std_logic);End entity JK_FF;Architecture two of JK_FF issignal Q1:std_logic;beginprocess(clk,reset,set,JK)beginif reset='1' thenQ1<='0';elseif clk'event and clk='1' thenif set='0' thenQ1<='1';elsecase JK iswhen "00" => Q1<=Q1;when "01" => Q1<='0';when "10" => Q1<='1';when "11" => Q1<=not Q1;end case;end if;end if;end if;end process;Q<=Q1;end architecture two;3.仿真波形图4.仿真波形分析当清零端ResET出现高电平时,此时不管CP脉冲和JK的状态如何,输出立即清零,实现异步清零的功能;当置数端SET出现低电平时,而且必须当CP脉冲为上升沿时,输出立即置数‘1‘,实现同步置数的功能;除此之外,当CP脉冲为上升沿状态时,J=K=0,Q保持;J=0,K=1,Q置零;J=1,K=0,Q置1;J=K=1,Q翻转一、8位锁存器的VHDL设计1.实体框图D[0..7] clk Q[0..7]latch8a2.程序设计①编译前的程序Library ieee;use ieee.std_logic_1164.all;Entity latch8a isport(D:in std_logic_vector(7 to 0);clk:in std_logic;Q:out std_logic_vector(7 to 0));End latch8a;Architecture three of latch8a issignal q1:std_logic_vector(7 to 0);beginprocess (clk,D)beginif clk'event and clk='1' thenQ1<=D;end if;end process;Q<=Q1;End architecture three;②程序编译错误情况错误:无③正确的程序Library ieee;use ieee.std_logic_1164.all;Entity latch8a isport(D:in std_logic_vector(0 to 7);clk:in std_logic;Q:out std_logic_vector(0 to 7));End latch8a;Architecture three of latch8a issignal q1:std_logic_vector(0 to 7);beginprocess (clk,D)beginif clk'event and clk='1' thenend if;end process;Q<=Q1;End architecture three;3.仿真波形图4.仿真波形分析当CLK脉冲为高电平时,输出为与其相对应的输出。
专用集成电路实验报告13050Z011305024237X德文实验一开发平台软件安装与认知实验实验内容1、本实验以三线八线译码器(LS74138)为例,在Xilinx ISE 9.2软件平台上完成设计电路的VHDL文本输入、语法检查、编译、仿真、管脚分配和编程下载等操作。
下载芯片选择Xilinx公司的CoolRunner II系列XC2C256-7PQ208作为目标仿真芯片。
2、用1中所设计的的三线八线译码器(LS74138)生成一个LS74138元件,在Xilinx ISE 9.2软件原理图设计平台上完成LS74138元件的调用,用原理图的方法设计三线八线译码器(LS74138),实现编译,仿真,管脚分配和编程下载等操作。
源程序:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-- Unment the following lines to use the declarations that are-- provided for instantiating Xilinx primitive ponents.--library UNISIM;--use UNISIM.Vponents.all;entity ls74138 isPort ( g1 : in std_logic;g2 : in std_logic;inp : in std_logic_vector(2 downto 0);y : out std_logic_vector(7 downto 0));end ls74138;architecture Behavioral of ls74138 isbeginprocess(g1,g2,inp)beginif((g1 and g2)='1') thencase inp iswhen "000"=>y<="00000001";when "001"=>y<="00000010";when "010"=>y<="00000100";when "011"=>y<="00001000";when "100"=>y<="00010000";when "101"=>y<="00100000";when "110"=>y<="01000000";when "111"=>y<="10000000";when others=>y<="00000000";end case;elsey<="00000000";end if;end process;end Behavioral;波形文件:生成元器件及连接电路思考:有程序可以看出,定义了三个输入端,一个输出端。
前几节,我们讲解的都是组合逻辑电路。
通过这些组合逻辑电路,我们初步掌握了VHDL常用的语法结构。
从这节开始,我们要介绍时序电路了。
(其实我们没有刻意去分组合和时序,只是觉的前面组合讲的多点,后面可能会多讲些时序电路而已。
对小平爷爷曾经说过:不管黑猫,白猫,只要能捉到老鼠的猫就是好猫。
所以不论时序,组合,还是时序和组合的混合体,只要能实现功能的就是好程序!)说一下概念:异步和同步。
这是时序电路的两大类。
同步就是电路的触发器由同一个时钟信号驱动,在同一个时刻翻转;而异步就是不在同一个时刻翻转。
大多数编程器的的内部结构是同步时序逻辑电路。
我们以时序电路的基础单元D触发器说起。
上升沿D触发器逻辑符号:由功能表可知,一个D触发器有一个异步置零端Rd,异步置1端Sd,只要Rd或Sd有效(低电平),则D触发器就会立即复位或则置1操作,复位与置1操作是与是时钟无关的,是异步的,有一个输入端D,一个时钟输入端CP,有两个互补的输出端Q和Q源代码:(工程见example中的D_FF文件夹)逐行解释:19~33:是一个有嵌套的IF结构。
这个IF结构就是按照功能表的顺序来写的。
25:是一条功能表没有的语句,在这种情况下,信号输出不确定,即用’X’来表示。
这儿要考虑到选择信号的完备性:Rd和Sd的组合会形成4种可能,若没有第25句的话,那么28~32可在Rd=’0’且Sd=’0’和Rd=’1’且Sd=’1’两种情况下运行。
这个是不符合功能要求的。
这里提醒大家一句:编写程序,不仅仅是VHDL程序,心一定要细。
29:用到了一个内置函数rising_edge(),即表示信号的上升沿,相对的就是falling_edge()。
该句等同于(if CP’event and CP=’1’),意思是CP上有事件发生,且事件发生后CP是高电平。
(事件无非就是上升和下降,若事件后是高电平,那就是上升沿发生了!)这两个函数在以后会经常用到的。
注意:因为是Sd,Rd是异步信号,即该信号不等待时钟的某一状态,而是直接起作用。
实验三序列信号发生器VHDL设计一、实验目的1、设计一个序列信号发生器,可以在时钟的作用下周期性的产生1110010序列信号2、学习时序电路的设计方法;3、掌握产生周期性信号电路的设计方法;4、掌握同步和异步概念;5、掌握仿真的目的和作用;二、实验环境QuartusII 、PC机、GW-PK2 EDA实验箱三、实验原理给出原理图,说明行为描述方式设计序列信号发生器的原理。
可以产生周期信号的序列信号发生器由计数器和译码器构成。
若想产生1110010序列信号,则需要三位二进制计数器,从000记到110,当时钟是上升沿时,若当前记到110,则将计数清为000,再从头开始,否则计数加1,译码器将每个三位二进制数转换为一位序列信号,计数器和译码器分别由两个进程实现。
四、实验内容及要求利用QuartusII完成序列信号发生器的VHDL设计及仿真测试,给出仿真波形,进行引脚锁定,并在实验箱上进行硬件验证。
五、实验步骤(1)用文本方式输入设计文件并存盘①创建工程,利用“New Preject Wizard”创建此设计工程。
选择菜单“File” “New Preject Wizard”,点击Next,即可弹出工程设置对话框点击此框最上一栏右侧的按钮“…”,设置工程路径,找到文件夹D:\Quartus8\vhdl_code\three,填写工程名和顶层文件名称后,点击Next按钮进行下一步。
②添加设计源程序。
如果已有源程序,可以在此加入到工程中,如果没有点击Next进行下一步。
③选择目标芯片。
首先在“Family”栏选芯片系列,在此选“ACEX1K”系列,选择此系列的具体芯片:EP1K30TC144-3。
④选择仿真器和综合器类型。
点击上图的Next按钮,这时弹出的窗口是选择仿真器和综合器类型的,如果都是选默认的“NONE”,表示都选QuartusII中自带的仿真器和综合器,因此,在此都选默认项“NONE”。
⑤结束设置。
目录第一部分实验思路 (2)第二部分问题和解决方案 (3)第三部分技术的认识 (3)第四部分课程的建议 (4)第五部分程序源代码 (4)--实验二(8位可逆计数器) (4)--实验三(任意整数分频电路设计) (6)--实验四(多功能循环彩灯控制电路设计) (7)--实验五(8段数码管动态扫描显示控制) (9)--实验六(频率计设计) (13)--实验七(矩阵式键盘扫描与键码检测) (17)--实验八(LPM的使用) (20)--实验九(多功能电子钟设计) (20)--实验十(SPI总线时序模拟) (29)第一部分实验思路1.1实验二(8位可逆计数器)分两个进程,一个记录手动脉冲个数,另一个记录脉冲源脉冲个数,最后以方式选择开关决定显示哪个个数。
1.2实验三(任意整数分频电路设计)分两个进程,一个记录上升沿个数,另一个纪录下降沿个数,当计数总和等于预分频数时,两个进程的标识位取反,最后将两个标识位的异或送给输出。
1.3实验四(多功能循环彩灯控制电路设计)确定四种循环方式,分别为1、3、5、7,2、4、6、8,7、5、3、1,8、6、4、2。
用case,when语句,同时计数自动加一。
1.4实验五(8段数码管动态扫描显示控制)设置一个顶层文件,三个模块文件(分频模块,计数模块,显示模块)。
分频是将20Mhz分成周期为1/100s和100us的方波。
计数是记录有多少个1/100s。
显示是以100us为步调扫描数码管以显示计数。
1.5实验六(频率计设计)设置一个顶层文件,三个模块文件(分频模块,计数模块,显示模块)。
分频是将20Mhz分成周期为1s和1ms的方波。
计数是记录在1s内待测脉冲的周期数。
显示是以1ms为步调扫描数码管以显示计数。
1.6实验七(矩阵式键盘扫描与键码检测)设立四个进程,一个完成由20Mhz到周期为10ms,100us的转换(10ms用于扫描键盘,100us 用于扫描数码管以显示键码)。
实验三实验三 VHDL VHDL VHDL 时序逻辑电路设计时序逻辑电路设计 一、实验目的一、实验目的1. 熟悉用VHDL 语言设计时序逻辑电路的方法语言设计时序逻辑电路的方法 2. 熟悉用Quartus 文本输入法进行电路设计文本输入法进行电路设计 二、实验所用仪器元件及用途二、实验所用仪器元件及用途 1. 计算机:装有Quartus 软件,为VHDL 语言提供操作场所。
语言提供操作场所。
2. 直流稳压电源:通过USB 接口实现,为实验开发板提供稳定电源。
接口实现,为实验开发板提供稳定电源。
3. 数字系统与逻辑设计实验开发板:使试验结果下载到开发板上,实现整个实验的最终结果。
果。
三、实验内容三、实验内容 1. 用VHDL 语言设计实现一个8421码十进制计数器。
码十进制计数器。
(1) 实验内容及要求:在Quartus 平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。
验证试验结果。
(2) 试验结果:VHDL 代码和仿真结果。
代码和仿真结果。
2. 用VHDL 语言设计实现一个分频系数为8,分频输出信号占空比为50%的分频器。
的分频器。
(1) 实验内容及要求:在Quartus 平台上设计程序和仿真题目要求。
平台上设计程序和仿真题目要求。
(2) 试验结果:VHDL 代码和仿真结果。
代码和仿真结果。
3. 用VHDL 语言设计实现一个控制8个发光二极管亮灭的电路。
个发光二极管亮灭的电路。
(1) 实验内容及要求:在Quartus 平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。
验证试验结果。
a. 单点移动模式:一个点在8个发光二极管上来回的亮个发光二极管上来回的亮b. 幕布式:从中间两个点,同时向两边依次点亮直至全亮,然后再向中间点灭,依次往复往复c. 通过拨码开关或按键控制两种模式的转换通过拨码开关或按键控制两种模式的转换 (2) 试验结果:VHDL 代码和仿真结果。
实验三时序逻辑电路设计一、实验目的1、进一步熟悉和掌握QuartusⅡ的操作步骤和相关工具的使用方法;2、了解和逐步掌握一般时序逻辑电路的设计方法;3、熟悉和掌握嵌入式逻辑分析仪Signal TapⅡ的使用和测试方法。
二、实验设备计算机、QuartusⅡ软件、实验箱三、实验内容在QuartusⅡ软件中采用VHDL语言完成一个具有异步复位和同步使能功能的10进制计数器的设计。
要求如下:1、通过3个按键分别控制时钟信号、使能信号和复位信号;2、计数器的计数值通过1个数码管实时显示、进位输出通过一个发光二极管的亮来表示;3、时钟脉冲的控制首先通过单个按键引入,然后通过实验箱上的Clock0引脚引入连续脉冲;4、对实验结果进行测试时,使用QuartusⅡ软件中的嵌入式逻辑分析仪Signal TapⅡ实时测试,并观察计数器的相关端口信号的变化。
四、实验步骤1、设计10进制计数器,并进行波形仿真截取仿真波形作为部分实验结果。
2、完成10进制计数器的引脚锁定(1)时钟信号——233脚(键1),使能信号——234脚(键2),复位信号——235脚(键3);(2)计数值的显示锁定在数码管1,其8421码的输出由高到低分别锁定在16脚、15脚、14脚、13脚;(3)进位信号的输出锁定在LED1——1脚。
3、在实验箱上进行下载和测试(1)连接实验箱电源插头和USB下载器。
USB下载器的一端接电脑的USB接口,另一端通过10芯接线连接实验箱的JTAG口。
(2)打开实验箱上的电源开关,先按模式选择键直到对应的数码管显示5,然后按复位键使电路进入“模式5”的连接状态。
说明:“模式5”下的键为高低电平信号输入方式,即按下灯亮表示输入高电平,否则按下为低电平。
因此,采用按键方式的时钟脉冲引入可以连续按键1两次从而得到正(负)脉冲;“模式5”下的数码管自身带有译码器电路,因此实验中不需要设计译码器。
(3)由JTAG口下载调试。
先采用按键方式引入时钟信号,通过三个按键控制,观察数码管1和LED1;再将时钟信号锁定在Clock0(28脚)从而引入连续的时钟信号并完成相关测试。
实验三时序逻辑电路的VHDL设计
一、实验目的与要求
1、目的
(1)熟悉VHDL语言的编程方法
(2)学会利用VHDL语言设计实现时序逻辑功能器件的逻辑功能。
(3)总结体会VHDL语言的编程技巧方法
2、要求
(1)调试程序要记录调试过程中出现的问题及解决办法;
(2)给出每个问题的算法或画出流程图;
(3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;
(4)做完实验后给出本实验的实验报告。
二、实验设备、环境
PII以上计算机,装有QuartusII软件
三、方法与步骤
(一)教师简单回顾所需知识并演示较一个简单功能的实现过程。
1、简单回顾组合逻辑电路的特点及常用逻辑功能器件的功能
2、回顾QuartusII的VHDL操作步骤
3、以JKFF为例,重点演示该时序逻辑单元的VHDL设计过程。
(1)JKFF的参考VHDL源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY JK_FF IS
PORT(J,K:IN STD_LOGIC;
CLK:IN STD_LOGIC;
Q:OUT STD_LOGIC);
END JK_FF;
ARCHITECTURE A OF JK_FF IS
SIGNAL QTMP:STD_LOGIC;
SIGNAL J_K:STD_LOGIC_VECTOR(0 TO 1);
BEGIN
J_K<=J&K;
PROCESS(CLK,J_K)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
CASE J_K IS
WHEN "00"=>NULL;
WHEN "01"=>QTMP<='0';
WHEN "10"=>QTMP<='1';
WHEN "11"=>QTMP<=NOT QTMP;
WHEN OTHERS=>NULL;
END CASE;
END IF;
END PROCESS;
Q<=QTMP;
END A;
四、实验过程、内容、数据处理及分析
按照设计选题编写简单程序
1、可供选择进行设计的时序逻辑电路如下,要求规定课时内至少完成2种逻辑电路的设计。
设计对象选择:各类基本触发器、各种功能的计数器、各种功能的移位寄存器。
(1)1位计数器
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity countbasic is
port(clk:in std_logic;
q:buffer std_logic_vector(7 downto 0));
end countbasic;
architecture a of countbasic is
begin
process(clk)
variable qtmp:std_logic_vector(7 downto 0);
begin
if clk'event and clk='1' then
qtmp:=qtmp+1;
end if;
q<=qtmp;
end process;
end a;
(2)移位寄存器
library ieee;
use ieee.std_logic_1164.all;
entity shifter is
port ( data:in std_logic_vector(7 downto 0 );
shift_left:in std_logic;
shift_right:in std_logic;
clk:in std_logic;
reset:in std_logic;
mode:in std_logic_vector(1 downto 0);
qout: buffer std_logic_vector(7 downto 0)); end shifter;
architecture a of shifter is
begin
process
begin
wait until (rising_edge(clk));
if (reset='1') then qout<="00000000";
else case mode is
when "01" =>
qout<=shift_right&qout(7 downto 1);
when "10" =>
qout<=qout(6 downto 0)&shift_left;
when "11" =>qout<=data;
when others=>null;
end case;
end if;
end process;
end a;
对所编写的VHDL程序进行软件仿真,直到仿真结果满足功能要求。
1、功能仿真。
2、选择某一型号器件后时序仿真。
记录正确的源程序与仿真波形。
五、实验结论与问题讨论
1、使用PROCESS时敏感信号的使用原则有哪些?
答:敏感信号的值改变时都必需完成某一功能行为,其参数表需列出用于启动本进程可读入的信号名(当有WAIT语句时例外)。
2、用VHDL描述时钟边沿有哪些方法?比较各自的特点。
答:⑴ wait until (rising_edce(clk))
⑵if clk'event and clk='1'
3、记录、讨论实验过程遇到的问题以及解决的方法。
六、实验心得
通过本次实验,我熟悉了VHDL语言的编程方法,并掌握VHDL语言设计实现时序逻辑功能器件的逻辑功能及敏感信号的使用。