基于FPGA的简单运算器的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要
设计一个简单运算器。

由顶层电路、运算器、按键输入、控制信号产生、修正结果、显示等模块构成。

用Quartus II绘制原理图或编写VHDL程序,然后封装画出电路图,该简单运算器可以实现加、减法算数运算和与、异或逻辑运算,且该运算器设计完之后经过了Quartus II软件和FPGA实验板的下载验证。

关键词:运算器,Quartus II,VHDL程序
1
目录
第一章系统原理 (5)
1.1系统功能 (5)
1.2系统原理图 (6)
1.3电路设计原理 (6)
第二章系统组成 (7)
2.1按键模块 (7)
2.1.1按键模块VHDL程序 (7)
2.1.2按键模块仿真波形 (11)
2.1.3按键模块电路封装图 (12)
2.1.4按键模块功能 (12)
2.2控制信号产生模块 (12)
2.2.1控制模块VHDL程序 (12)
2.2.2控制模块仿真波形 (15)
2.2.3控制模块电路封装图 (15)
2.2.4控制模块功能 (16)
2.3修正模块 (16)
2.3.1修正模块VHDL程序 (16)
2.3.2修正模块仿真波形 (20)
2.3.3修正模块电路封装图 (20)
2.3.4修正模块功能 (21)
2.4显示模块 (21)
2.4.1显示模块VHDL程序 (21)
2.4.2显示模块电路封装图 (24)
2.4.3显示模块功能 (25)
2.5运算器模块 (25)
2.5.1运算器模块功能 (25)
2.5.2运算器模块电路图 (25)
第三章定制选择器 (26)
3.1定制选择器 (26)
3.2用VHDL符号图画运算器顶层电路图 (28)
第四章下载验证及调试 (30)
4.1器件选择及引脚设置 (30)
4.2配置文件下载 (31)
结论 (33)
参考文献 (34)
前言
随着FPGA性能的不断完善,FPGA器件的种类日益丰富,受到世界范围内电子设计人员的普遍欢迎,并占据了较大的市场,其生产厂家也由原来的Xilinx公司一家增加到Altera、Actel、lattice等十几家公司。

Altera公司的主要产品有:属于FPGA的FLEX、ACEX、APEX、Mercury、Excalibur、Stratix和Cyclone等系列;属于CPLD的MAX和Classic 系列。

开发工具有,被普遍认为是最优秀PLD 开发平台之一的MAX+Plus II和支持APEX、Mercury、Excalibur、Stratix和Cyclone系列器件的Quartus II开发软件。

Cyclone系列器件是Altera公司推出的低价位FPGA产品,是Stratix系列的简化版,分为Cyclone I和Cyclone II两个系列。

Cyclone I系列产品为基于1.5V、采用0.13um全铜SRAM工艺的低成本FPGA。

Cyclone II 系列产品基于1.2V,采用0.09um全铜CMOS工艺,SRAM编程技术,其成本更低、容量更高、速度更快。

它和高性能的Stratix II系列的FPGA是目前Altera公司主流产品。

我的简单运算器主要是用VHDL语言编写,以Cyclone器件为依托,并下载到Altera仿真工具箱Cyclone-EP1C6Q240C8验证功能成功,能够初步完成简单运算器的雏形。

随着大规模集成电路技术和计算机技术的高速发展,在涉及通信、国防、工业自动化、计算机设计与应用、仪器仪表等领域的电子系统设计工作中,FPGA技术的含量正以惊人的速度提升。

电子类的新技术项目的开发也更多地依赖于FPGA技术的应用,特别是随着HDL等硬件描述语言综合功能和性能的提高,计算机中许多重要的元件(包括CPU)都用硬件描述语言来设计和表达,许多微机CPU、硬核嵌入式系统(如ARM、MIPS)、软核嵌入式系统(如NiosII)、大型CPU,乃至整个计算机系统都用FPGA来实现,即所谓的单片系统SOC或SOPC(System On a Chip、System On a Programmerable Chip)。

计算机和CPU的设计技术及其实现途径进入了一个全新的时代!不但如此,传统的CPU结构模式,如冯诺依曼结构和哈佛结构正在接受巨大的挑战。

例如美国Wincom Systems 公司推出一款令人惊叹的服务器,其核心部分是由FPGA完成的超强功能CPU。

该系统工作能力超过50台DELL或IBM计算机,或SUN Microsystems 公司的服务器。

该服务器的处理速度要比传统服务器快50到300倍。

我们知道,传统的PC机及服务器通常采用诸如Intel公司的奔腾处理器或SUN公司的SPARC芯片作为中央处理单元,而Wincom Systems的这款产品却没有采用微处理器,而是由FPGA芯片驱动。

FPGA芯片的运行速度虽比奔腾处理器慢,但可并行处理多项任务,而微处理器一次仅能处理一项任务。

因此,Wincom Systems的服务器只需配置几个价格仅为2000多美元的FPGA芯片,便可击败SUN公司的服务器或采用Intel处理器的计算机。

50多年前,匈牙利数学家冯诺依曼提出了计算机的设计构想:通过中央处理器从储存器中存取数据,并逐一处理各项任务。

然而现在,却采用FPGA取代传统微处理器获得了更高的性能,致使美国Xilinx公司的首席执行官Willem Roelandts认为:“由冯诺依曼提出的电脑架构已经走到尽头”,“可编程芯片将掀起下一轮应用高潮”。

FPGA芯片操作灵活,可以重复擦写无限次,而微处理器均采用固定电路,只能进行一次性设计。

设计人员可通过改变FPGA中晶体管的开关状态对电路进行重写,即重配置,从而尽管FPGA芯片的时钟频率要低于奔腾处理器,但是由于FPGA芯片可并行处理各种不同的运算,所以可以完成许多复杂的任务。

正如Willem Roelandts所说的,“我们认为下一代超级电脑将基于可编程逻辑器件”,他声称,这种机器的功能比目前最大的超级电脑还要强大许多倍。

EDA专家William Carter认为,只要EDA开发工具的功能允许,将有无数的证据证明FPGA 具有这种神奇的能力,进而实现基于FPGA的超级电脑的开发。

此外,美国加州大学伯克利分校和杨百翰大学的研究人员也正在设计基于FPGA的电脑,这些电脑可在运行中实现动态重配置。

这对定位危险目标等军事应用和面容识别之类的计算密集型安全应用十分有用。

由此看来,在计算机应用领域和计算机系统设计领域中,EDA技术和FPGA的应用方兴未艾!
硬件描述语言HDL(Hardware Description Language)是EDA技术的另一重要组成部分,常见的HDL有:VHDL、Verilog HDL、System Verilog和SystemC。

其中VHDL、Verilog在现在EDA设计中使用最多,也得到几乎所有
的主流EDA工具的支持。

而后两种HDL 语言尚处于完善过程中。

VHDL语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。

V HDL具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述能力,在语言易读性和层次化结构设计方面表现了强大的生命力和应用潜力。

因此,VHDL支持各种模式的设计方法:自顶向下与自底向上或混合方法,在面对当今许多电子产品生命周期缩短,需要多次重新设计以融入最新技术、改变工艺等方面, VHDL都表现了良好的适应性。

第一章系统原理
1.1系统功能
该系统是基于FPGA设计的简单运算器,可以实现简单的-7到+7范围内的加、减、与、以及异或四则运算。

将设计好的系统电路图与硬件实验板相连接,进行运算验证。

该实验板由一个8按键电路和一个32位LCD显示器组成,通过相应的按键输入把运算结果显示在LCD显示器上。

1.2系统原理图
1.3电路设计原理
该运算器电路由按键输入、控制、修正、显示和运算五大模块组成,来实现加、减、与、异或运算功能。

首先按键模块用于输入两个数和运算符,通过控制模块传送到运算器模块进行运算,再连接到修正模块,通过修正模块对“溢出”的数值进行修正,最后显示模块功能实现把运算过程反应到LCD显示器上。

第二章系统组成
2.1按键模块
2.1.1按键模块VHDL程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY KEY IS
PORT(EN:OUT STD_LOGIC;
YSF:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
RSTN,CLK:IN STD_LOGIC;
KEYA,KEYB:IN STD_LOGIC;
KADD,KSUB,KAND,KXOR,KEQU:IN STD_LOGIC;
A,B,C,D:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
XSYSF:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
XA,XB:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END KEY;
ARCHITECTURE ARCH OF KEY IS
SIGNAL TKADD,TKSUB,TKAND,TKXOR,TKEQU :STD_LOGIC;
SIGNAL TA,TB:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
----保存A------
PROCESS (KEYA,RSTN)
BEGIN
IF RSTN='0' THEN TA<="0000";
ELSIF (KEYA'EVENT AND KEYA='1')THEN
TA<=TA+1;
END IF;
END PROCESS;
-----保存B------
PROCESS (KEYB,RSTN)
BEGIN
IF RSTN='0' THEN TB<="0000";
ELSIF(KEYB'EVENT AND KEYB='1')THEN
TB<=TB+1;
END IF;
END PROCESS;
------获取信号------
PROCESS(RSTN,KADD)
BEGIN
IF RSTN='0' THEN TKADD<='0';
ELSIF (KADD'EVENT AND KADD='1')THEN TKADD<='1';END IF; END PROCESS;
------------------
PROCESS(RSTN,KSUB)
BEGIN
IF RSTN='0' THEN TKSUB<='0';
ELSIF (KSUB'EVENT AND KSUB='1')THEN TKSUB<='1';END IF; END PROCESS;
--------
PROCESS(RSTN,KAND)
BEGIN
IF RSTN='0' THEN TKAND<='0';
ELSIF (KAND'EVENT AND KAND='1')THEN TKAND<='1';END IF; END PROCESS;
PROCESS(RSTN,KXOR)
BEGIN
IF RSTN='0' THEN TKXOR<='0';
ELSIF (KXOR'EVENT AND KXOR='1')THEN TKXOR<='1';END IF;
END PROCESS;
-------------
PROCESS(RSTN,KEQU)
BEGIN
IF RSTN='0' THEN TKEQU<='0';
ELSIF (KEQU'EVENT AND KEQU='1')THEN TKEQU<='1';END IF;
END PROCESS;
PROCESS(RSTN,CLK,TKADD,TKSUB,TKAND,TKXOR,TKEQU,TA,TB)
BEGIN
IF RSTN='0' THEN YSF<="00";EN<='0';XSYSF<="00100000";
ELSIF(CLK'EVENT AND CLK='1') THEN
IF TKADD='1' THEN YSF<="00";XSYSF<="00101011";A<=TA;B<=TB;END IF;
IF TKSUB='1' THEN YSF<="01";XSYSF<="00101101";A<=TA;B<=TB;END IF;
IF TKAND='1' THEN YSF<="10";XSYSF<="00101010";A<=TA;C<=TB;END IF;
IF TKEQU='1' THEN EN<='1';END IF;
END IF;
END PROCESS;
PROCESS(TA,TB,CLK)
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
CASE TA IS
WHEN "0000"=>XA<="00110000";
WHEN "0001"=>XA<="00110001";
WHEN "0010"=>XA<="00110010";
WHEN "0011"=>XA<="00110011";
WHEN "0100"=>XA<="00110100";
WHEN "0101"=>XA<="00110101";
WHEN "0110"=>XA<="00110110";
WHEN "0111"=>XA<="00110111";
WHEN "1000"=>XA<="00111000";
WHEN "1001"=>XA<="00111001";
WHEN "1010"=>XA<="01000001";
WHEN "1011"=>XA<="01000010";
WHEN "1100"=>XA<="01000011";
WHEN "1101"=>XA<="01000100";
WHEN "1110"=>XA<="01000101";
WHEN "1111"=>XA<="01000110";
WHEN OTHERS =>NULL;
END CASE;
CASE TB IS
WHEN "0000"=>XB<="00110000";
WHEN "0001"=>XB<="00110001";
WHEN "0010"=>XB<="00110010";
WHEN "0011"=>XB<="00110011";
WHEN "0100"=>XB<="00110100";
WHEN "0101"=>XB<="00110101";
WHEN "0110"=>XB<="00110110";
WHEN "0111"=>XB<="00110111";
WHEN "1000"=>XB<="00111000";
WHEN "1001"=>XB<="00111001";
WHEN "1010"=>XB<="01000001";
WHEN "1011"=>XB<="01000010";
WHEN "1100"=>XB<="01000011";
WHEN "1101"=>XB<="01000110";
WHEN "1110"=>XB<="01000101";
WHEN "1111"=>XB<="01000110";
WHEN OTHERS=>NULL;
END CASE;
END IF;
END PROCESS;
END ARCH;
2.1.2按键模块仿真波形
2.1.3按键模块电路封装图
2.1.4按键模块功能
实现对按键的设定及控制,得以把运算数据输入电路。

2.2控制信号产生模块
2.2.1控制模块VHDL程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CP3 IS
PORT(RSTN,CLK:IN STD_LOGIC;
CP,CPT,CPMUX:BUFFER STD_LOGIC;
SADD,SSUB,SAND,SXOR:OUT STD_LOGIC_VECTOR(1 DOWNTO 0)); END CP3;
ARCHITECTURE BEHA VIORAL OF CP3 IS
TYPE STATE1 IS(S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11);
SIGNAL PRES1,NXS1:STATE1;
TYPE STATE2 IS(SS0,SS1,SS2,SS3);
SIGNAL PRES2,NXS2:STATE2;
BEGIN
PROCESS(CLK,RSTN)
BEGIN
IF (RSTN='0')THEN PRES1<=S0;
ELSIF(CLK'EVENT AND CLK='1')THEN
PRES1<=NXS1;
END IF;
END PROCESS;
PROCESS(PRES1)
BEGIN
CASE PRES1 IS
WHEN S0=>
CP<='1';CPMUX<='0';CPT<='0';NXS1<=S1;
WHEN S1=>
CP<='0';CPMUX<='0';CPT<='0';NXS1<=S2;
WHEN S2=>
CP<='0';CPMUX<='1';CPT<='0';NXS1<=S3;
WHEN S3=>
CP<='1';CPMUX<='1';CPT<='0';NXS1<=S4;
WHEN S4=>
CP<='1';CPMUX<='0';CPT<='0';NXS1<=S5;
WHEN S5=>
CP<='0';CPMUX<='0';CPT<='0';NXS1<=S6;
WHEN S6=>
CP<='0';CPMUX<='1';CPT<='0';NXS1<=S7;
WHEN S7=>
CP<='1';CPMUX<='1';CPT<='0';NXS1<=S8;
WHEN S8=>
CP<='1';CPMUX<='1';CPT<='0';NXS1<=S9;
WHEN S9=>
CP<='0';CPMUX<='1';CPT<='1';NXS1<=S10;
WHEN S10=>
CP<='0';CPMUX<='1';CPT<='1';NXS1<=S11;
WHEN S11=>
CP<='1';CPMUX<='1';CPT<='1';NXS1<=S11;
END CASE;
END PROCESS;
PROCESS(CP,RSTN)
BEGIN
IF (RSTN='0')THEN PRES2<=SS0;
ELSIF(CP'EVENT AND CP='0')THEN
PRES2<=NXS2;
END IF;
END PROCESS;
PROCESS(PRES2)
BEGIN
CASE PRES2 IS
WHEN SS0=>
SADD<="00";SSUB<="00";SAND<="00";SXOR<="00"; NXS2<=SS1;
WHEN SS1=>
SADD<="01";SSUB<="00";SAND<="00";SXOR<="00";
NXS2<=SS2;
WHEN SS2=>
SADD<="00";SSUB<="01";SAND<="10";SXOR<="11";
NXS2<=SS3;
WHEN SS3=>
SADD<="00";SSUB<="01";SAND<="10";SXOR<="11";
NXS2<=SS3;
END CASE;
END PROCESS;
END BEHA VIORAL;
2.2.2控制模块仿真波形
2.2.3控制模块电路封装图
2.2.4控制模块功能
实现对电路运算的控制。

2.3修正模块
2.3.1修正模块VHDL程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY XZJG IS
PORT(RSTN:IN STD_LOGIC;
S:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
CLK,OVER,COUT:IN STD_LOGIC;
T:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
FH:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
SH,SL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END XZJG;
ARCHITECTURE BEHA VIORAL OF XZJG IS
SIGNAL OC:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL TH,TL:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
PROCESS(RSTN,CLK,OVER,COUT)
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
OC<=OVER&COUT;
END IF;
END PROCESS;
PROCESS(OC,CLK)
BEGIN
IF(RSTN='0')THEN
TH<="0000";TL<="0000";
ELSIF(CLK'EVENT AND CLK='1')THEN
CASE OC IS
WHEN"00"=>TH<="0000";
CASE T I
WHEN"0000"=>TL<="0000";FH<="00101011";
WHEN"0001"=>TL<="0001";FH<="00101011";
WHEN"0010"=>TL<="0010";FH<="00101011";
WHEN"0011"=>TL<="0011";FH<="00101011";
WHEN"0100"=>TL<="0100";FH<="00101011";
WHEN"0101"=>TL<="0101";FH<="00101011";
WHEN"0110"=>TL<="0110";FH<="00101011";
WHEN"0111"=>TL<="0111";FH<="00101011";
WHEN"1000"=>TL<="1000";FH<="01011101";
WHEN"1001"=>TL<="0111";FH<="00101101";
WHEN"1010"=>TL<="0110";FH<="00101101";
WHEN"1011"=>TL<="0101";FH<="00101101";
WHEN"1100"=>TL<="0100";FH<="00101101";
WHEN"1101"=>TL<="0011";FH<="00101101";
WHEN"1110"=>TL<="0010";FH<="00101101";
WHEN"1111"=>TL<="0001";FH<="00101101";
WHEN OTHERS=>NULL;
END CASE;
WHEN"01"=>TH<="0000";
CASE T IS
WHEN"0000"=>TL<="0000";FH<="00101011";
WHEN"0001"=>TL<="0001";FH<="00101011";
WHEN"0010"=>TL<="0010";FH<="00101011";
WHEN"0011"=>TL<="0011";FH<="00101011";
WHEN"0100"=>TL<="0100";FH<="00101011";
WHEN"0101"=>TL<="0101";FH<="00101011";
WHEN"0110"=>TL<="0110";FH<="00101011";
WHEN"0111"=>TL<="0111";FH<="00101011";
WHEN"1000"=>TL<="1000";FH<="00101101";
WHEN"1001"=>TL<="0111";FH<="00101101";
WHEN"1010"=>TL<="0110";FH<="00101101";
WHEN"1011"=>TL<="0101";FH<="00101101";
WHEN"1100"=>TL<="0100";FH<="00101101";
WHEN"1101"=>TL<="0011";FH<="00101101";
WHEN"1110"=>TL<="0010";FH<="00101101";
WHEN"1111"=>TL<="0001";FH<="00101101";
WHEN OTHERS=>NULL;
END CASE;
WHEN"10"=>FH<="00101011";
CASE T IS
WHEN"1000"=>TH<="0000";TL<="1000";
WHEN"1001"=>TH<="0000";TL<="1001";
WHEN"1010"=>TH<="0001";TL<="0000";
WHEN"1011"=>TH<="0001";TL<="0001";
WHEN"1100"=>TH<="0001";TL<="0010";
WHEN"1101"=>TH<="0001";TL<="0011";
WHEN"1110"=>TH<="0001";TL<="0100";
WHEN OTHERS=>NULL;
END CASE;
WHEN"11"=>FH<="00101101";
CASE T IS
WHEN"0000"=>TH<="0001";TL<="0110";
WHEN"0001"=>TH<="0001";TL<="0101";
WHEN"0010"=>TH<="0001";TL<="0100";
WHEN"0011"=>TH<="0001";TL<="0011";
WHEN"0100"=>TH<="0001";TL<="0010";
WHEN"0101"=>TH<="0001";TL<="0001";
WHEN"0110"=>TH<="0001";TL<="0000";
WHEN"0111"=>TH<="0000";TL<="1001";
WHEN OTHERS=>NULL;
END CASE;
END CASE;
END IF;
END PROCESS;
PROCESS(RSTN,S,TH,TL,CLK) BEGIN
IF(RSTN='0')THEN SH<="0000";SL<="0000";
ELSIF(CLK'EVENT AND CLK='0')THEN CASE S IS
WHEN"00"=>SH<=TH;SL<=TL;
WHEN"01"=>SH<=TH;SL<=TL;
WHEN"10"=>SH<="0000";SL<=T;
WHEN"11"=>SH<="0000";SL<=T;
END CASE;
END IF;
END PROCESS;
END BEHA VIORAL;
2.3.2修正模块仿真波形
正溢出波形
负溢出波形
2.3.3修正模块电路封装图
2.3.4修正模块功能
实现对运算中有超过-7到7的溢出的结果进行修正,方便读取
2.4显示模块
2.4.1显示模块VHDL程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY XIANSHI IS
PORT(CLK:IN STD_LOGIC;
R0:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
R1,R2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
R3,R4,R5:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
RS:BUFFER STD_LOGIC;
RW:OUT STD_LOGIC;
EN:OUT STD_LOGIC;
CLK_OUT:BUFFER STD_LOGIC;
D:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0));
END XIANSHI;
ARCHITECTURE BEHA VIORAL OF XIANSHI IS
TYPE XIANSHI IS ARRAY(0 TO 31)OF STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL QX:XIANSHI:=((OTHERS=>"00100000"));
TYPE STATE IS(CLEAR,IDS,DLNF,DCB,DDRAM1,OUTDATA1,DDRAM2,OUTDATA2);
SIGNAL COUNT:STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL LCLK_OUT:STD_LOGIC;
SIGNAL COUNTS:INTEGER RANGE 0 TO 3000000:=0;
SIGNAL CURRENT_STATE:STATE;
SIGNAL TEMPA:STD_LOGIC_VECTOR(4 DOWNTO 0):="00000";
BEGIN
PROCESS(CLK_OUT,CLK)
BEGIN
IF(RISING_EDGE(CLK))THEN
COUNTS<=COUNTS+1;
IF(COUNTS=3000000)THEN
CLK_OUT<=NOT CLK_OUT;
END IF;
END IF;
END PROCESS;
QX(2)<=R3;
QX(3)<=R4;
QX(4)<=R5;
QX(5)<="00100000";
QX(6)<=R0;
QX(7)<="0011"&R1;
QX(8)<="0011"&R2;
PROCESS(CLK,LCLK_OUT)
BEGIN
IF(RISING_EDGE(CLK))THEN
COUNT<=COUNT+1;
IF(COUNT=0)THEN
LCLK_OUT<=NOT LCLK_OUT;
END IF;
END IF;
END PROCESS;
EN<=LCLK_OUT;
PROCESS(LCLK_OUT,CURRENT_STATE) BEGIN
IF RISING_EDGE(LCLK_OUT)THEN
RS<='0';
RW<='0';
CASE CURRENT_STA TE IS
WHEN CLEAR=>
D<="00000001";
CURRENT_STATE<=DLNF;
WHEN DLNF=>
D<="00111000";
CURRENT_STATE<=IDS;
WHEN IDS=>
D<="00000110";
CURRENT_STATE<=DCB;
WHEN DCB=>
D<="00001100";
CURRENT_STATE<=DDRAM1;
WHEN DDRAM1=>
D<="10000000"+TEMPA(3 DOWNTO 0);
CURRENT_STATE<=OUTDATA1;
WHEN OUTDATA1=>
RS<='1';
D<=QX(CONV_INTEGER(TEMPA));
TEMPA<=TEMPA+1;
IF TEMPA="10000"THEN
CURRENT_STATE<=DDRAM2;
ELSE
CURRENT_STATE<=DDRAM1;
END IF;
WHEN DDRAM2=>
D<="11000000"+TEMPA(3 DOWNTO 0);
CURRENT_STATE<=OUTDATA2;
WHEN OUTDATA2=>RS<='1';
D<=QX(CONV_INTEGER(TEMPA));
TEMPA<=TEMPA+1;
IF TEMPA="00000"THEN
CURRENT_STATE<=DDRAM1;
ELSE
CURRENT_STATE<=DDRAM2;
END IF;
WHEN OTHERS=>NULL;
END CASE;
END IF;
END PROCESS;
END BEHA VIORAL;
2.4.2显示模块电路封装图
2.4.3显示模块功能
通过显示电路把运算结果显示到LCD显示器上。

2.5运算器模块
2.5.1运算器模块功能
对输入的数据进行简单的运算,输出运算结果。

2.5.2运算器模块电路图
第三章定制选择器
3.1定制选择器
新建“原理图Block Diagram”文件后,点打开下图,
点击按钮Megewizard Plug-In Manager, 打开下图,点击next,打开图见下页。

在下图左侧选择Gates Lpm_Mux
在下图右侧找到你的文件夹后,输入文件名MUX44 点击NEXT,打开下页图
在下图中设置选择器的输入输出线:
设置数据输入端个数为4。

设置每个数据输入端的宽度(即总线位数)为4。

设置输出缓冲时间为1个周期。

点击NEXT,打开下页图。

在下面图中 mux43.bsf打钩,然后点击NEXT。

点击下图的按钮Finish,完成定制。

3.2用VHDL符号图画运算器顶层电路图
1.新建文件夹:“运算器综合电路”
2. 新建原理图文件,放置若干input后,保存,文件名TOP
3. 建立工程
4. 把KEY.VHD CP3.VHD XZJG.. VHD XIANSHI.VHD 和定制的2个选择器文件:mux44.vhd mux42.vhd mux44.bsf mux42.bsf 共6个文件复制到文件夹“运算器综合电路”
5. 把这6个文件加到工程中:操作见下面2个图
在下图中点击按钮“Add All”
6. 把按键模块、信号发生器模块和修正结果模块和显示模块的代码封装成符号图:(1)打开某个模块的代码,例如按键模块代码KEY.VHD,
(2)选择FILE菜单的Create /Update,
(3)选Create Symbol Files For Current File 。

系统自动把符号保存到工程中。

7. 画顶层电路
点打开下图,展开Project,选择一个符号名称,放到原理图文件中。

第四章下载验证及调试
4.1器件选择及引脚设置
图3-1 器件选择
如图,在Quartus II工具栏选择Assignments->Devices如图选择,并在Device&Opitions选项卡里如下图设置。

图3-2 器件选择
然后再在Assignments里选择Pins,打开如下图的选项卡,按图进行引脚设置。

图3-3 运算器引脚设置
4.2配置文件下载
连上实验板并安装好驱动,在设置编程器选择HardWare Setup里的USB-ByteBlasterMV,按下Start下载到试验箱并进行按键测试。

图3-4 下载验证
结论
经过一周的时间,我顺利地完成了这次课程设计。

在本次的课程设计中,我对课本上学到的数字逻辑知识有了进一步的了解和认识并且把课堂上学到的课本知识与实际融合联系起来,拓宽了我对该专业的视野,增厚了我对这门课程的兴趣。

在课程设计中因为有了指导老师耐心的指导和同学热心的帮助,我才能顺利地完成本次课程设计,在此我对帮助过我的老师和同学表示真心的感谢。

参考文献
[1] 数字逻辑(第四版)欧阳清明于俊清华中科技大学出版社。

[2] VHDL数字电路设计教程Circuit Design with VHDL [巴西]V olnei A. Pedroni著乔庐峰王志功等译电子工业出版社。

[3] 百度百科。

相关文档
最新文档