实验四 基于QuartusⅡ的硬件描述语言的拔河电路设计
一、实验内容
基于前期原理图电子拔河电路,甲、乙双方分别按动己方按键,按键的次数分别在双方的两个数码管上显示,当喊停止的时候,数码管数字较大的一方获胜,连续比赛多局以定胜负。 二、实验工具
1、DE0开发板一个 2、Quartus2 16软件 3、VHDL语言 三、实验准备
1、学习VHDL语言,了解基本语法规则和基本语句。
2、明确所实现的电路所需要的器件,并且明确用VHDL实现该器件的基本逻辑关系和基本语句。实验所需要的器件为百进制计数器、比较器和译码器。
3、明确VHDL实体的定义,明确实体的输入输出,并且明确实现该实体的基本语法和基本步骤。
4、必须明确实体层次的概念,在低层次实体中,必须明确各个输入输出之间的联系,以结构的方式构建高层次实体。
四、实验程序 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY test4 IS
PORT(KEY1,KEY2,KEY3,CLOCK_IN: IN STD_LOGIC;
HEX0,HEX1,HEX2,HEX3,HEX4,HEX5: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); com:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END test4;
--以下为百进制计数器设计实体--
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNT_100 IS
PORT(clk,clr: IN STD_LOGIC;
--date_in: IN STD_LOGIC_VECTOR(3 DOWNTO 0); lo_out,hi_out:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COUNT_100;
ARCHITECTURE fwm OF COUNT_100 IS
SIGNAL hi_tmp,lo_tmp: STD_LOGIC_VECTOR(3 DOWNTO 0); --SIGNAL load_cnt : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
--load_cnt<=load&hi_lo; --数据写入与置数位控制的并置 PROCESS(clk,clr)
--hi_lo='1'时为高位置数,hi_lo='0'时为低位置数
--VARIABLE q_tmp : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
IF clr='0'THEN hi_tmp<=\异步清零
ELSIF clk'EVENT AND clk='1'THEN
--IF load_cnt=\低位置数
--IF date_in>=\ --ELSE lo_tmp<=date_in; --END IF;
--ELSIF load_cnt=\高位置数
--IF date_in>=\ --ELSE hi_tmp<=date_in; --END IF;
--ELSIF load_cnt=\ IF lo_tmp=\低位等于9 IF hi_tmp/=\THEN --如果高位不等于9
lo_tmp<=\--那么高位加1
ELSE
hi_tmp<=\
--ELSE lo_tmp<=\除此之外,低位9保持不变
END IF;
ELSE lo_tmp<=lo_tmp+1; --如果低位不是9,那么低位加1
END IF; --END IF; END IF; END PROCESS;
lo_out<=lo_tmp; --低位信号赋值给低位输出端 hi_out<=hi_tmp; --高位信号赋值给高位输出端 END fwm;
--以下为计算胜的局数的10进制计数器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNT_10 IS
PORT(clk,clr: IN STD_LOGIC;
COUNT_10_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COUNT_10;
ARCHITECTURE fwm OF COUNT_10 IS
SIGNAL COUNT_10_TMP: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clk,clr)
BEGIN IF clr='0'THEN COUNT_10_TMP<= \异步清零 ELSIF clk'EVENT AND clk='1'THEN COUNT_10_TMP<=COUNT_10_TMP+1;
IF COUNT_10_TMP=\如果加到十,归零
COUNT_10_TMP<=\
END IF; END IF;
END PROCESS;
COUNT_10_OUT<=COUNT_10_TMP;
END fwm;
--以下为分频器实体电路 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FP IS
PORT(clk_in:IN STD_LOGIC;
clk_out:OUT STD_LOGIC); END FP;
ARCHITECTURE fwm OF FP IS
CONSTANT M:INTEGER:=25000000; --50M分频到1HZ
SIGNAL FP_TMP:STD_LOGIC; BEGIN
PROCESS(clk_in)
VARIABLE COUNT :INTEGER:=0; BEGIN
IF clk_in'EVENT AND clk_in='1' THEN COUNT:=COUNT+1; --计数器+1 IF COUNT<=M THEN FP_TMP<='0'; ELSIF COUNT ELSE COUNT :=0; END IF; END IF; END PROCESS; clk_out<=FP_TMP; END fwm; --以下为七段数码管显示译码电路设计实体 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DIS IS PORT(date_in:IN STD_LOGIC_VECTOR(3 DOWNTO 0); dis_out: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END DIS; ARCHITECTURE fwm OF DIS IS BEGIN PROCESS(date_in) BEGIN CASE date_in IS WHEN\显示0; WHEN\显示1; WHEN\显示2; WHEN\显示3; WHEN\显示4; WHEN\显示5; WHEN\显示6; WHEN\显示7; WHEN\显示8; WHEN\显示9; WHEN OTHERS=>dis_out<=\不显示; END CASE; END PROCESS; END fwm; --以下为8位无符号整数比较器设计实体 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COMPARE IS PORT(a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0); eq,lt,gt: OUT STD_LOGIC); END COMPARE; ARCHITECTURE fwm OF COMPARE IS BEGIN PROCESS(a,b) BEGIN eq<='0';lt<='0';gt<='0'; IF a=b THEN eq<='1';