VHDL设计FPGA数字系统:计算器
- 格式:docx
- 大小:2.67 MB
- 文档页数:33
基于FPGA的计算器设计基于FPGA(可编程逻辑门阵列)的计算器设计是一种使用FPGA开发板和硬件描述语言来实现的计算器。
它可以进行基本的数学运算,如加法、减法、乘法和除法等。
FPGA计算器不仅具有快速的运算速度和高度的可靠性,还具有较小的体积和低功耗。
FPGA计算器通常由输入、控制单元、运算单元和输出组成。
输入可以通过按钮、键盘或其他输入设备来实现。
控制单元负责解析输入并发出相应的控制信号。
运算单元是FPGA计算器的核心组件,它负责接收控制信号,并执行相应的运算操作。
输出单元将运算结果显示在计算器的屏幕上。
使用硬件描述语言(HDL)来实现FPGA计算器的设计可以提供高度的灵活性和可扩展性。
HDL允许开发人员通过编程方式定义逻辑门和电路功能,而不是通过物理硬件组件来实现。
这意味着开发人员可以根据需要添加新的运算功能,并且可以很容易地在FPGA计算器上进行修改和更新。
FPGA计算器可以通过对数据进行二进制表示来实现各种数学运算。
例如,加法可以通过将两个二进制数相加来实现。
具体实现可以使用查找表(Look-up Table)或全加器等组合逻辑电路来完成。
除法则比较复杂,通常需要使用除法算法来实现。
除了基本的数学运算,FPGA计算器还可以实现其他功能,如逻辑运算、位操作和存储器操作等。
逻辑运算可以用于实现条件语句和循环语句等流程控制功能。
位操作可以用于提取和修改数据的特定位。
存储器操作可以用于存储和读取数据。
基于FPGA的计算器设计有许多优点。
首先,FPGA计算器具有非常快的运算速度,比软件计算器更加高效。
其次,FPGA计算器具有较小的体积和低功耗,适合嵌入式系统或低功耗应用场景。
此外,由于FPGA计算器的硬件实现,它也具有较高的稳定性和可靠性。
然而,基于FPGA的计算器设计也存在一些挑战。
首先,硬件描述语言的学习成本较高,需要开发人员具备一定的硬件设计知识。
其次,FPGA 计算器的开发过程相对复杂,需要编写和调试大量的HDL代码。
V e r i l o g H D L简单计算器设计(总13页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除目录第一章设计目的及任务要求 (1)1.1 设计目的 (1)1.2 设计任务 (1)1.3 课设要求 (1)第二章设计思路 (2)2.1 设计总体框图 (2)2.2 设计原理 (2)2.2.1 计算其原理 (2)2.2.2 数码显示原理 (2)2.2.3 八位数码管扫描的原理 (3)第三章设计源程序及分析 (4)3.1 计算器模块 (4)3.1.1 计算器源程序 (4)3.1.2 计算器程序分析 (4)3.2 数码管显示部分 (5)3.2.1 数码管显示源程序 (5)3.2.2 数码管显示程序分析 (5)3.3 循环扫描模块 (6)3.3.1 循环扫描程序 (6)3.3.2 循环程序分析 (6)3.4 总程序及其分析 (7)第四章时序仿真和结果验证 (10)4.1 计算器时序仿真及其分析 (10)4.2 数码管时序仿真及分析 (10)4.3 总体时序仿真图 (11)4.4 结果验证 (11)第五章心得体会 (12)第一章设计目的及任务要求1.1 设计目的(1)进一步加强熟练EDA基础知识。
(2)熟练掌握Quartus 6.0软件的使用以及用该软件编程和仿真的全过程。
(3)培养独立思考问题,解决问题的能力以及查阅相关资料和资料的正确使用能力,为明年的毕业设计打下良好的设计基础。
1.2 设计任务设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、 *、/ 四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。
1.3 课设要求(1)说明题目的设计原理和思路、采用方法及设计流程。
(2)系统框图、Verilog语言设计程序或原理图。
(3)对各子模块的功能以及各子模块之间的关系做较详细的描述。
简单计算器一、设计分析1、功能描述设计一个简单0-9数之间的加、减、乘法运算的计算器,,输入和输出均可以显示在数码管上。
2、实现工具1、用VHDL 语言文本形式输入;2、maxplusII行语言编写时序仿真和综合。
二、设计思想采用自顶向下的设计方式,分层进行设计。
设计分为五个模块进行;计算器模块、八位二进制数转化成8421BCD码模块,四选一数据选择器模块,七段显示译码器模块、模4计数器模块、模8计数器块、3—8译码器块。
顶层设计可以完全独立于目标器件芯片物理结构的硬件描述语言。
使用VHDL模型在所综合级别上对硬件设计进行说明、建模和仿真。
1、顶层原原理框图2、具体实现1、计算器模块、2、八位二进制数转化成8421BCD码模块3、四选一数据选择器模块4、七段显示译码器模块5、模4计数器模块6、模8计数器块7、3—8译码器块三、设计过程1、建立工程建立一个Project,命名为jiandanjisuanqi。
将各个模块生成的文件放在同一个文件夹下。
2、文本输入将各个模块的VHDL代码输入,保存并综合。
3、仿真建立各个模块的gdf图,设置输入波形并仿真。
4、顶层原理图输入利用各个模块生成的sym文件建立顶层原理图,编译并仿真。
5、硬件实现实验室提供的器件为FLEX10K,型号为EPF10K10LC84-4,将文件下载到器件当中,在实验箱中进行模拟。
四、整体框图五、VHDL部分代码及说明1、计算器模块、library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity jisuanqi isPort (a,b: in STD_LOGIC_VECTOR (3 downto 0);sel:in STD_LOGIC_VECTOR (1 downto 0); -----加减乘控制端s: out STD_LOGIC_VECTOR (7 downto 0));end jisuanqi;architecture Behavioral of jisuanqi issignal q1 ,q2: STD_LOGIC_VECTOR (3 downto 0);signal q3: STD_LOGIC_VECTOR (7 downto 0);signal q4: STD_LOGIC_VECTOR (1 downto 0);beginq1<=a;q2<=b;q4<=sel;process(q4,q3)begincase q4 iswhen "00" => ----加减乘算法q3<=q1+q2;s<=q3;when "01" =>if(q1>q2)thenq3<= q1-q2;s<=q3;elseq3<=q2-q1;s<=q3;end if;when "10"=>q3<=q1*q2;s<=q3;when "11"=>q3<=q1*q2;s<=q3;when others=>q3<="00000000";s<=q3;end case;end process;end Behavioral;2、八位二进制数转化成8421BCD码模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity bcd isPort (s : in STD_LOGIC_VECTOR (7 downto 0);a : out STD_LOGIC_VECTOR (3 downto 0);b : out STD_LOGIC_VECTOR (3 downto 0));end bcd;architecture Behavioral of bcd issignal q0: STD_LOGIC_VECTOR (7 downto 0);signal q1: STD_LOGIC_VECTOR (3 downto 0);signal q2: STD_LOGIC_VECTOR (3 downto 0);beginprocess(s)beginq0<=s;case q0 is ----把八位二进制数转化为8421BCD码when"00000000"=>q1<="0000";q2<="0000";when"00000001"=>q1<="0000";q2<="0001";when"00000010"=>q1<="0000";q2<="0010";when"00000011"=>…………………………….3、四选一数据选择器模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;entity mux4_1 isport(d0,d1,d2,d3 :in std_logic_vector(3 downto 0);q :out std_logic_vector(3 downto 0);sel :in std_logic_vector(1 downto 0) );end mux4_1;architecture rtl of mux4_1 isbeginprocess(sel)begin ------实现从四个数据中选择一个出来if(sel = "00") thenq<=d0;elsif(sel = "01")thenq<=d1;elsif(sel = "10")thenq<=d2;elsif(sel = "11")thenq<=d3;end if;end process;end rtl;4、七段显示译码器模块library ieee;use ieee.std_logic_1164.all;entity bcd_7dis isport (bcdm: in std_logic_vector(3 downto 0);a,b,c,d,e,f,g : out std_logic);end bcd_7dis;architecture art of bcd_7dis issignal w : std_logic_vector(6 downto 0);beginprocess(bcdm)begina<=w(6);b<=w(5);c<=w(4);d<=w(3);e<=w(2);f<=w(1);g<=w(0);case bcdm is -----实现8421码转化为2进制码的转换when "0000" =>w<="1111110";when "0001" =>w<="0110000";when "0010" =>w<="1101101";when "0011" =>w<="1111001";when "0100" =>w<="0110011";when "0101" =>w<="1011011";when "0110" =>w<="1011111";when "0111" =>w<="1110000";when "1000" =>w<="1111111";when "1001" =>w<="1111011";when "1100" =>w<="0000001";when others =>w<="0000000";end case;end process;end art;5、模4计数器模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;entity mo4 isport(q :out std_logic_vector(1 downto 0);clk :in std_logic);end mo4;architecture rtl of mo4 issignal qcl : std_logic_vector(1 downto 0);beginprocess(clk)begin ----实现模为4的计数if(clk'event and clk = '1')thenif(qcl = "11")thenqcl <= "00";elseqcl <= qcl + '1';end if;end if;q <= qcl;end process;end rtl;6、模8计数器块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count_8 isport( clk:in std_logic;ql :out std_logic_vector(2 downto 0));end count_8;architecture rt1 of count_8 issignal qcl:std_logic_vector(2 downto 0);beginprocess(clk)begin ---- 实现模8的计数if(clk'event and clk='1') thenif (qcl="111") thenqcl<="000";elseqcl<=qcl+'1';end if;end if;ql<=qcl;end process;end rt1;7、3—8译码器块library ieee;use ieee.std_logic_1164.all;entity decode3_8 isport(d :in std_logic_vector(2 downto 0);y :out std_logic_vector(7 downto 0));end decode3_8 ;architecture rt1 of decode3_8 isbeginprocess(d)begincase d is ------实现3对8的译码when "000"=>y<="10000000";when "001"=>y<="01000000";when "010"=>y<="00100000";when "011"=>y<="00010000";when others=>y<="00000000";end case;end process;end rt1;六、各模块仿真结果1、计算器模块2、八位二进制数转化成8421BCD码模块3.、四选一数据选择器模块4、七段显示译码器模块5、模4计数器模块6、模8计数器块7、3—8译码器块8、整体仿真七、管脚锁定及硬件实现1、管脚锁定2、文件下载将文件下载完后在硬件实验箱中进行仿真检查。
基于HDL 的十进制计数器设计一、 实验目的1、掌握基于语言的ISE 设计全流程;2、熟悉、应用VerilogHDL 描述数字电路;3、掌握基于Verilog 的组合和时序逻辑电路的设计方法。
4、掌握chipscope 片内逻辑分析仪的使用与调试方法。
5、设计具有异步复位、同步使能的十进制计数器,其计数结果可以通过七段数码管、发光二极管等进行显示。
二、 实验原理1、十进制计数器的设计即是设置一变量,当计数脉冲上升沿到来时,先判断是否为9,若是则置零,否则就进行加一操作。
将变量再进行一个译码操作输出到数码管显示即可。
图1 实验原理图2、数码管分为7 段和8 段,七段数码管由 7段二极管组成。
8段数码管比起7段数码管多了一个显示小数点的LED 。
数码管按发光二极管单元衔接方式分为共阳极数码管和共阴极数码管。
本实验使用共阳数码管。
它是指将一切发光二极管的阳极接到一同构成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM 接到电源VCC 上,当某一字段发光二极管的阴极为低电平相应字段就点亮。
当某一字段的阴极为高电平相应字段就不亮。
共阳端可以作为位选端,实现动态扫描。
动态扫描即是利用了人眼睛的视觉暂留现象,以合适的频率显示每一位数码管,便会产生所有数码使能控制异步清零十进制计数器七段数码管显示译时钟端FPG进管是一起点亮的错觉,数码管原理图如图:图2 共阳数码管示意图3、数码管显示数字与对应的输入数据的关系如表所示:0 8'hc01 8'hf92 8'ha43 8'hb04 8'h995 8'h926 8'h827 8'hf88 8'h809 8'h90表1 数码管显示表4、本次设计一共有11个端口:输入信号:clk -------待计数的时钟。
clr ---------异步清零信号,当clr=1,输出复位为0,当clr=0,正常计数。
期刊论文—EDA课程设计题目:计数器的VHDL设计与实现学生姓名:李雷学生学号:09专业班级:计算机科学与技术0902班指导老师:方恺晴计数器的VHDL设计与实现摘要:介绍了各种基本计数器的组成及其工作原理,重点研究了可变模计数器的设计与实现,在对现有的可变模计数器的研究基础上,在Quartus 开发环境中,用VHDL语言设计一种功能更加强大的可变模计数器,它具有清零、置数、使能控制、可逆计数和可变模等功能,并且对传统的可变模计数器的计数失控问题进行研究,最终设计出一种没有计数失控缺陷的可变模计数器,并通过波形仿真和EPF10K20TI144—4系列实验箱,验证了其各项设计功能。
结果表明该设计正确.功能完整。
运行稳定.关键词:VHDL;计数器;可变模计数;可逆计数VHDL Design and Realization of CounterAbstract:This paper analyzes all kinds of basic counter and its working principle, focus on the counter variable mode of design and implementation。
In the environment of Quartus based on research of the existing module—alterable counter,a module—alterable counter with more functions,such as clear,set,enable control,reversible count,module—alterable count and so on,which is designedwith VHDL.By researching the problem of losing control existed in traditional module—alterable counter。
基于FPGA的计算器设计摘要本文介绍了一个简单计算器的设计,该设计采用了现场可编程逻辑器件FPGA设计,并基于硬件描述语言VHDL在Altera公司的Quartus Ⅱ软件上实现仿真。
系统由计算部分、存储部分、显示部分和输入部分四个部分组成,计算部分为加法器、减法器、乘法器和除法器,存储部分需要3个存储器来实现:内部累加器(acc)、输入寄存器(reg)以及结果暂存器(ans)。
显示部分由四个七段译码管组成,分别来显示输入数字,输入部分采用外接键盘,由0—9十个数字按键,加减乘除四个运算符按键,一个等号按键和一个清零按键组成的。
通过外部的按键可以完成四位数之内的…加‟、…减‟、…乘‟、…除‟四种功能运算,其结构简单,易于实现。
关键词:FPGA;VHDL;计算器1 概述在国外,电子计算器在集成电路发明后,只用短短几年时间就完成了技术飞跃,经过激烈的市场竞争,现在的计算器技术己经相当成熟。
计算器已慢慢地脱离原来的“辅助计算工具”的功能定位,正向着多功能化、可编程化方向发展,在各个领域都得到了广泛的应用。
用计算器不仅可以实现各种各样复杂的数学计算还可以用来编制、运行程序,甚至解方程组,图形计算器还可以进行图形处理。
计算器内置的软件允许用户进行类似于对计算机的文件和目录管理等操作,允许用户对图形界面进行定制,同时各种新技术也被应用到计算器里使计算器功能越来越强大。
可以说,计算器就是一个“微微型”的计算机。
国内也有厂商利用计算器芯片开发新的产品,但对计算器技术的研究、计算器芯片的设计还处于起步阶段。
计算器的主要功能还是在于“计算”,不妨称之为“低档计算器”。
即便是对这种计算器,很多厂商也只从事计算器的组装、销售业务。
一些IC 设计公司、芯片提供商也开始研究计算器技术。
本次设计基于现场可编程逻辑器件FPGA进行设计,应用硬件描述语言VHDL编程并在Altera公司的Quartus Ⅱ软件上实现仿真。
需要进行计算器的常用运算功能的实现,通过外接键盘输入、LED数码显示来达成运算目的。
一种基于FPGA的可变模计数器的VHDL实现【摘要】可变模计数器是数字系统中广泛应用的一种电路模块,本文讨论了一种基于VHDL语言实现的可变模计数器的EDA设计方案,采用FPGA芯片作为设计载体,FPGA具有在线可重构的优点,如需对计数器的技术指标进行修改,只需修改源程序中的相应参数,重新进行编译、仿真、配置即可,使得设计本身灵活性好,便于升级和维护。
【关键词】FPGA;VHDL;可变模计数器1.引言EDA是将数字系统以某一种特定的表达方式输入计算机开发平台进行处理,经由综合,仿真,下载到目标芯片,最终实现设计的智能化设计技术。
其中输入文件的种类众多,有原理图输入法、硬件描述语言输入法、状态图输入法、波形输入法等。
硬件描述语言(HDL)是EDA技术的重要组成部分,是设计数字系统的重要表达手段,和原理图输入法,波形输入法相比,具有灵活度高,易于修改、升级,方便调用,库资源丰富等优点。
常见的HDL主要有VHDL、Verilog HDL、ABEL、AHDL等,其中标准化语言VHDL、Verilog使用最广泛,可以被几乎所有的EDA工具支持。
可变模计数器是数字系统中广泛应用的一种电路模块,本文讨论了一种基于VHDL语言实现的可变模计数器的EDA设计方案,采用FPGA芯片作为设计载体,FPGA具有在线可重构的优点,如需对计数器的技术指标进行修改,只需修改源程序中的相应参数,重新进行编译、仿真、配置即可,使得系统本身灵活性好,便于升级和维护。
2.可变模计数器的功能指标本文设计的计数器为5位输出可变模计数器,采用两位控制信号选择计数的模值,因此可进行四种模值的切换。
计数器在工作时,可以通过控制信号m[1:0]的值选择相应的模值m,计数时,在每个时钟的上升沿进行加法计数,从0计到m-1,然后自动归零循环计数。
在本设计中,输出端口为5位,可以实现模小于等于32的计数应用。
如果需要增可选择模值的数量,只需要增加选择控制信号位数即可。
基于FPGA的计算器设计摘要本文介绍了一个简单计算器的设计,该设计采用了现场可编程逻辑器件FPGA设计,并基于硬件描述语言VHDL在Altera公司的Quartus Ⅱ软件上实现仿真。
系统由计算部分、存储部分、显示部分和输入部分四个部分组成,计算部分为加法器、减法器、乘法器和除法器,存储部分需要3个存储器来实现:内部累加器(acc)、输入寄存器(reg)以及结果暂存器(ans)。
显示部分由四个七段译码管组成,分别来显示输入数字,输入部分采用外接键盘,由0—9十个数字按键,加减乘除四个运算符按键,一个等号按键和一个清零按键组成的。
通过外部的按键可以完成四位数之内的…加‟、…减‟、…乘‟、…除‟四种功能运算,其结构简单,易于实现。
关键词:FPGA;VHDL;计算器1 概述在国外,电子计算器在集成电路发明后,只用短短几年时间就完成了技术飞跃,经过激烈的市场竞争,现在的计算器技术己经相当成熟。
计算器已慢慢地脱离原来的“辅助计算工具”的功能定位,正向着多功能化、可编程化方向发展,在各个领域都得到了广泛的应用。
用计算器不仅可以实现各种各样复杂的数学计算还可以用来编制、运行程序,甚至解方程组,图形计算器还可以进行图形处理。
计算器内置的软件允许用户进行类似于对计算机的文件和目录管理等操作,允许用户对图形界面进行定制,同时各种新技术也被应用到计算器里使计算器功能越来越强大。
可以说,计算器就是一个“微微型”的计算机。
国内也有厂商利用计算器芯片开发新的产品,但对计算器技术的研究、计算器芯片的设计还处于起步阶段。
计算器的主要功能还是在于“计算”,不妨称之为“低档计算器”。
即便是对这种计算器,很多厂商也只从事计算器的组装、销售业务。
一些IC 设计公司、芯片提供商也开始研究计算器技术。
本次设计基于现场可编程逻辑器件FPGA进行设计,应用硬件描述语言VHDL编程并在Altera公司的Quartus Ⅱ软件上实现仿真。
需要进行计算器的常用运算功能的实现,通过外接键盘输入、LED数码显示来达成运算目的。
FPGA_实验⼩项⽬:四位运算⼩计算器最近在武汉参加⾄芯科技的FPGA培训,经过了第⼀周的强化基础培训,我们掌握了分频模块的书写,以及按键消抖的书写,还有就是边沿检测的⽅法,当然按键消抖模块我们这⾥⽤到的是通过移位打拍然后相或的⽅法,达到了消抖的⽬的,不过运⽤过程中这种⽅法也会遇到⼀些BUG,⽐如时间过短的问题,所以我计划是好要学习⼀下按键消抖的状态机的实现⽅法,除了这些还有7段数码管的显⽰驱动的编写,状态机与TB⽂件的编写,常⽤加法期间_74ls161的驱动等等。
这⾥就不赘述了,当然还有另外⼀个实验,数字钟的实现的实验,这个实验会在另外⼀篇随笔中详述。
现在开始今天这次四位运算⼩计算器的实现,设计之前⾸先得明确要实现的功能,以及按照⽼师所说,⾃顶向下的设计思路,⾸先要明确顶层模块需要有哪些输⼊以及输出,然后顶层以下有哪些模块构建。
⾸先明确四则运算模块的实现需要哪些⼦模块构成:1. 7段数码管显⽰模块2. 4*4键盘码扫描分析电路3.算数逻辑运算模块4.数制转换模块:涉及BCD转bin bin转BCD5.运算操作状态机的书写⾸先是7段数码管显⽰模块的书写,这⼀任务在第⼀周的培训中已经讲解,并已经写出,参考我原来写的7段数码管显⽰原理的介绍。
其中在计算模块时要先对码制进⾏转换,计算器只能对⼆进制码进⾏运算,⽽显⽰的时候要显⽰BCD码,所以要对其进⾏转换,就要编写bin2BCD 和BCD2bin模块。
此次设计的计算器可实现的功能有:可以实现4位以内的加减乘除,以及固定两位⼩数的运算。
矩阵键盘与数码管显⽰模块已经写出,现在主要说⼀下操作输⼊输出控制这⼀模块。
因为要考虑⼩数的计算,所以对应的要显⽰⼩数点的标志位。
第⼀个操作数显⽰,操作符显⽰,第⼆个操作数显⽰,以及连续运算模块。
module key2bcd1 (clk,rst_n,real_number,opcode,BCDa,BCDb,result ,iKey);input [4:0] real_number;input rst_n,clk;input iKey;// ⼩数点控制位input [24:0] result;output reg [24:0] BCDa,BCDb;output reg [3:0] opcode;reg [3:0] opcode_reg;reg [3:0] state;reg datacoming_state,datacoming_flag;// ,rst_dian;reg dian_flag;//always @( posedge rst_dian or negedge iKey)// begin// if(rst_dian)// dian_flag <= 0;// else// dian_flag <= 1;// endalways @(posedge clk)if (!rst_n)begindatacoming_state <=0;datacoming_flag <=0;endelseif (real_number!=17)case(datacoming_state)0: begindatacoming_flag <=1;datacoming_state <=1;end1: begindatacoming_flag <=0;datacoming_state <=1;endendcasedatacoming_state <= 0;datacoming_flag <= 0;endreg [2:0] i;always @ (posedge clk or negedge rst_n)beginif(!rst_n)beginBCDa <= 0;BCDb <= 0;state <= 0;opcode <= 0;dian_flag <=1;i<=0;endelse if (iKey)dian_flag <= 1;elseif(datacoming_flag)begincase(state)0: case(real_number)0,1,2,3,4,5,6,7,8,9:if(!dian_flag)BCDa[23:8] <={BCDa[19:8],real_number[3:0]};else if (dian_flag==1 && i==0)beginBCDa[7:4] <= real_number [3:0];i <= i+1;endelse if(dian_flag==1 && i==1)beginBCDa[3:0] <= real_number [3:0];end// begin// BCDa[23:0] <= {BCDa[19:0],real_number[3:0]};// state <= 0;// end10,11,12,13:beginopcode_reg <= real_number[3:0];state <= 1;i <=0;dian_flag <=0;end15:beginBCDa[24]= ~BCDa[24];state <= 0 ;enddefault:state <= 0;endcase1: case(real_number)0,1,2,3,4,5,6,7,8,9:beginopcode <= opcode_reg;dian_flag <=0;if(!dian_flag)BCDb[23:8] <={BCDb[19:8],real_number[3:0]};else if (dian_flag && i==0)beginBCDb[7:4] <= real_number [3:0];i <= i+1;endelse if(dian_flag && i==1)beginBCDb[3:0] <= real_number[3:0];endend// if(!dian_flag)// BCDa[23:8] <={BCDa[19:8],real_number[3:0]};// else if (dian_flag && i=1)// begin// BCDa[7:4] <= real_number [3:0];// i <= i+1;// end// else if(dian_flag && i=2)// begin// BCDa[3:0] <= real_number [3:0];// end14:beginBCDa <= result;BCDb <= 0;opcode <= 0;state <= 2;i <=0;dian_flag<=0;end15:beginBCDb[24]= ~BCDb[24];state <= 1;enddefault:state <= 1;endcase// 连续运算模块2:begindian_flag<=1;case( real_number)0,1,2,3,4,5,6,7,8,9:beginBCDa <= {real_number,8'h00};state <= 0;end10,11,12,13:beginopcode_reg <= real_number[3:0];state <= 1;end15:beginBCDa[24]= ~BCDa[24];state <= 2 ;enddefault:state <= 2;endcaseenddefault : state <= 0;endcaseendendendmodule计算模块中涉及到的理论图:计算时是利⽤⼆进制来进⾏的所以要先利⽤bcd2bin模块来进⾏码制转换。
源程序:4位二进制并行进位加法器的源程序ADDER4B.VHD 如下LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER4B IS --四位二进制并行加法器PORT(ci:IN STD_LOGIC; --低位进位a:IN STD_LOGIC_VECTOR3 DOWNTO 0); --4位加数b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位被加数s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --4位和co:OUT STD_LOGIC --进位输出);END ADDER4B;ARCHITECTURE behave OF ADDER4B ISSIGNAL SINT:STD_LOGIC_VECTOR(4 DOWNTO 0); --部定义的一个数据SIGNAL aa,bb:STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINaa<=’0’&a; --将4位加数矢量扩为5位,为进位提供空间bb<=’0’&b; --将4位被加数矢量扩为5位,为进位提供空间INT<=aa+bb+ci; -- 相加s<=SINT(3 DOWNTO 0);co<=SINT(4); --最高位为输出进位END behave;顶层模块:8位二进制并行进位加法器的部分程序ADDER8B.VHD如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER8B ISPORT(ci:IN STD_LOGIC;a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);s:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);co:OUT STD_LOGIC);END ADDER8B;ARCHITECTURE a OF ADDER8B ISComponent adder4B --引用4位二进制并行进位加法器PORT(ci:IN STD_LOGIC;a:IN STD_LOGIC_VECTOR3 DOWNTO 0);b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);co:OUT STD_LOGIC);END COMPONENT;SIGNAL CARRY_OUT:STD_LOGIC; --4位加法器的进位标志BEGINU1:ADDER4B --安装一个4位二进制加法器U1PORT MAP(ci=>ci,a=>a(3 DOWNTO 0),b=>b(3 DWONTO 0),s=>(3 DOWNTO0),co=>CARRY_OUT);U2:ADDER4B --安装一个4位二进制加法器U2PORT MAP(ci=>CARRY_OUT,a=>a(7 DOWNTO 4),b=>b(7 DWONTO 4),s=>(7 DOWNTO 4),co=>co);END behave;加法器VHDL程序如下LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY adder ISport(a:in std_logic; --被加数ab:in std_logic; --加数bci:in std_logic; --输入进位s:out std_logic; --结果输出co:out std_logic --输出进位);end adder;architecture behave of adder issignal tem: std_logic; --暂存signal stem: std_logic;begintem<=a xor b; --中间变量stem<=tem xor ci; --结果co<=(tem and ci) or (a and b); --进位输出s<=stem; --输出end behave;4位二进制并行进位减法器的源程序suber.VHD如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sub4 ISPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位被减数b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位减数ci:IN STD_LOGIC; --输入进位s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --结果输出co:OUT STD_LOGIC --输出进位);end suber;architecture behave of suber iscomponent adder is --引用加法器的模块port(a:in std_logic;b:in std_logic;ci:in std_logic;s:out std_logic;co:out std_logic);end component;signal btem:std_logic_vector(3 downto 0); --减数寄存signal ctem:std_logic_vector(4 downto 0); -- 进位寄存signal stem:std_logic_vector(3 downto 0); -- 结果寄存beginbtem(3 downto 0)<=not b(3 downto 0); --先把减数求反ctem(0)<=not ci; --输入的进位也求反,从而对减数求补码g1:for I in 0 to 3 generate --连用4位全加器add:adder port map (a(i),btem(i),ctem(i),stem(i),ctem(i+1));end generate;s(3 downto 0)<=stem(3 downto 0); --结果输出co<=not ctem(4); --求反输出进位end behave;乘法器的源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;Entity mul isPort(a:in std_logic_vector(3 downto 0); --4位被乘数b:in std_logic_vector(3 downto 0); --4位乘数y:out std_logic_vector(7 downto 0) --乘积);end mul;architecture arch of mul isbeginy(7 downto 0)<=a(3 downto 0)*b(3 downto 0);end arch;除法器的源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity diver isPORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --8位被除数输入b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位除数输入clk:IN STD_LOGIC; --时钟str:IN STD_LOGIC; --启动信号s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --4位商输出y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) --4位余数输出);End;Architecture behave of diver isComponent suber is --引用减法器PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ci:IN STD_LOGIC;s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);co:OUT STD_LOGIC);End component;type state_type is(start,one,two,three,eror); --状态定义signal state:state_type; --定义状态变量signal ain: std_logic_vector(7 downto 0); --被除数寄存signal bin: std_logic_vector(3 downto 0); --除数寄存signal atem: std_logic_vector(3 downto 0); --减法器被减数输入signal btem: std_logic_vector(3 downto 0); --减法器减数输入signal stem: std_logic_vector(3 downto 0); --结果寄存signal citem: std_logic; --减法器借位输入signal cotem:std_logic; --减法器借位输出beginp2:process(clk)variable n: integer range 0 to 3; --移位次数计数值beginif clk’event and clk=’1’ thencase state iswhen atart=> --开始状态if str=’1’ then --收到启动信号state<=one; --转到状态oneatem(3 downto 0)<=a(7 downto 4); --把高4位放到减法器被减数端btem(3 downto 0)<=b(3 downto 0); --把除数放到减法器减数端ain(7 downto 0)<=a(7 downto 0); --寄存被除数bin(3 downto 0)<=b(3 downto 0); --寄存除数end if;when one=> --第一次移位if cotem=’0’ then --被除数高4位小于除数,溢出!state<=eror; --转到出错状态else --不溢出ain(3 downto 1)<=ain(2 downto 0); --被除数做移位ain(0)<=not cotem; --在最低位接收该位商值atem(3 downto 0)<=ain(6 downto 3); --把除数寄存器高4位输到减法器,作为减法器被减数state<=two; --转到下一状态end if;when two=> --再做3此移位if n=2 then --第四次移位state<=three; --是,则跳转到下一状态n:=0; --移位计数器清零else --否则state<=two; --还回到这个状态n:=n+1; --移位计数器加1end if;if cotem=’0’ then --不够减,有借位atem(3 downto 1)<=stem(2 downto 0); --减法器结果移位作为下一次的输入else --够减,没有借位atem(3 downto 1)<=atem(2 downto 0); --结果输出移位作为下一次的输入end if;ain(3 downto 1)<=ain(2 downto 0); --结果寄存器左移一位ain(0)<=not cotem; --这次运算借位输出,输入到寄存器ain最后一位atem(0)<=ain(3); --寄存器ain的最高位作为减法器输入被减数的低位when three=> --正常运算结果输出s(3 downto 1)<=ain(2 downto 0); --寄存器ain低3位作为输出结果高3位s(0)<=not cotem; --最后一次减法运算的借位输出求反作为结果输出最低位if cotem=’0’ then --最后一次减法运算,够减(无借位)y(3 downto 0)<=atem(3 downto 0); --则减法器输出结果为整个除法的余数else --否则,不够减y(3 downto 0)<=atem(3 downto 0); --则最后一次减法运算的被减数为整个除法的余数end if;atem(3 downto 0)<= "0"; --寄存器清零btem(3 downto 0)<= "0"; --寄存器清零state<=start; --回到开始状态when eror=> --溢出状态state<=start; --回到开始状态atem(3 downto 0)<= "0"; --寄存器清零btem(3 downto 0)<= "0"; --寄存器清零end case;end if;end process p2;citem<=’0’; --4位减法器借位输入接地U1:suber port map(atem,btem,citem,stem,cotem);end behave;数字按键译码电路VHDL语言描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity numdecoder isport(reset:in std_logic;inclk:std_logic;innum:std_logic_vetctor(9 downto 0);outnum:buffer std_logic_vector(3 woento 0);outflag:out std_logic);end;architecture behave of numdecoer is]beginif reser=’1’thenoutnum<=”0000”;elsif inclk’event and inclk=’1’thencase innum iswhen”0000000001”=>outnum<=”0000”;outflag<=’1’; --按下第一个键表示输入0when”0000000010”=>outnum<=”0001”;outflag<=’1’; --按下第二个键表示输入1when”0000000100”=>outnum<=”0010”;outflag<=’1’; --按下第三个键表示输入2when”0000001000”=>outnum<=”0011”;outflag<=’1’; --按下第四个键表示输入3when”0000010000”=>outnum<=”0100”;outflag<=’1’; --按下第五个键表示输入4when”0000100000”=>outnum<=”0101”;outflag<=’1’; --按下第六个键表示输入5when”0001000000”=>outnum<=”0110”;outflag<=’1’; --按下第七个键表示输入6when”0010000000”=>outnum<=”0111”;outflag<=’1’; --按下第八个键表示输入7when”010*******”=>outnum<=”1000”;outflag<=’1’; --按下第九个键表示输入8when”1000000000”=>outnum<=”1001”;outflag<=’1’; --按下第十个键表示输入9when others=>outnum<=outnum;outflag<=’0’; --不按键时保持end case;end if;end process;end behave;7段译码器的vhdl语言描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity vdecode isport(indata:in std_logic_vector(3 downto 0);outdata:out std_logic_vector(0 to 6));End;Atchitecture behave of vdecode isBeginWith indata selectOutdata<=”1111110”when”0000”,”0110000”when”0000”,”1111001”when”0000”,”0110011”when”0000”,”1011011”when”0000”,”1011111”when”0000”,”1110000”when”0000”,”1111111”when”0000”,”1111110”when”0000”,”1111110”when”0000”,”1111011”when”0000”,”0000000”when others;End behave;8位二进制数转换成个位、十位、百位的进程:Ctrview:process(c,clk)BeginIf c=’1’thenview1<=”0000”;view2<=”0000”;view<=”0000”;viewstep<=takenum;elsif clk’event and clk=’1’thencase virestep iswhen takenum=>ktemp<=keep;viewstep<=hundred=>if ktemp>=”11001000”thenview1<=”0010”;ktemp<=ktemp-“11001000;elsif ktemp>=”01100100”thenview1<=”0001”;ktemp<=ktemp-“01100100”;elsif view1<=”0000”;end if;viewstep<=ten;when ten=>if ktemp>=”01011010”thenview2<=”1001”;ktemp<=ktemp-“01011010”;elsif ktemp>=”01010000”thenview2<=”1000”;ktemp<=ktemp-“01010000”; elsif ktemp>=”01000110”thenview2<=”0111”;ktemp<=ktemp-“01000110”; elsif ktemp>=”00111100”thenview2<=”0110”;ktemp<=ktemp-“00111100”; elsif ktemp>=”00110010”thenview2<=”0101”;ktemp<=ktemp-“00110010”; elsif ktemp>=”00101000”thenview2<=”0100”;ktemp<=ktemp-“00101000”; elsif ktemp>=”00011110”thenview2<=”0011”;ktemp<=ktemp-“00011110”; elsif ktemp>=”00010100”thenview2<=”0010”;ktemp<=ktemp-“00010100”; elsif ktemp>=”00001010”thenview2<=”0001”;ktemp<=ktemp-“00001010”; elsif view2<=”0000”;end if;viewstep<=onewhen one=>view3<=ktemp(3 downto 0);viewstep<=takenum;when others=>NULL;end case;end if;end process ctrview;计算器的VHDL语言LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;Entity cal isPort(inclk:in std_logic;num:in std_logic_vector(9 downto 0);plus: in std_logic;subt: in std_logic;mult: in std_logic;mdiv: in std_logic;equal: in std_logic;c: in std_logic;onum1,onum2,onum3:out std_logic_vector(0 to0));end cal;architecture behave of cal istype state is(takenum,hundred,ten,one);signal viewstep: state;signal ktemp: std_logic_vector(7 downto 0);signal flag: std_logic;signal fl: std_logic;signal acc: std_logic_vector(7 downto 0);signalreg: std_logic_vector(7 downto 0);signal keep: std_logic_vector(7 downto 0);signal ans:std_logic_vector(7 downto 0);signal dans: std_logic_vector(3 downto 0);signal numbuff: std_logic_vector(3 downto 0);signal vf: std_logic;signal strdiv: std_logic;signal numclk: std_logic;signal clear:std_logic;signal inplus: std_logic;signal insubt: std_logic;signal inmult: std_logic;signal inmdiv: std_logic;signal inequal: std_logic;signal view1,view2,view3:std_logic_vector(3 downto 0); signal cou: std_logic_vector(1 downto 0);signal clk_gg: std_logic_vector(11 downto 0);signal clk: std_logic;signal clk: std_logic;component numbercoder isport(reset: in std_logic;inclk: in std_logic;innum: in std_logic_vector(9 downto 0);outnum: buffer std_logic_vector(3 downto 0); outflag: out std_logic);end component;component vdecode isport(indata: in std_logic_vector(3 downto 0); outdata: out srd_logic_vector(0 to 6));end component;component diver isport(a: in std_logic_vector(7 downto 0);b: in std_logic_vector(3 downto 0);clk: in std_logic;str: in std_logic;s: in std_logic_vector(3 downto 0);y: in std_logic_vector(3 downto 0););end component;begininum1: numdecoder port map (c,clk,num,numbuff,numclk); clock: process(inclk,c)beginif c=’1’ thenclk_gg(11 downto 0)<=”0”;elsif inclk’event and inclk=’1’ thenclk_gg(11 downto 0)<=clk_gg(11 downto 0)+1;end if;end process clock;clk<=clk_gg(11);pacecal: process(c,clk)beginif c=’1’theninplus<=’0’;insubt<=’0’;inmult<=’0’;inmdiv<=’0’;elsif clk’event and clk=’1’thenif plus=’1’ theninplus<=’1’;insubt<=’0’;inmult<=’0’; inmdiv<=’0’;elsif subt=’1’ theninplus<=’0’;insubt<=’1’;inmult<=’0’; inmdiv<=’0’;elsif mult=’1’ theninplus<=’0’;insubt<=’0’;inmult<=’1’; inmdiv<=’0’;elsif mdiv=’1’ theninplus<=’0’;insubt<=’0’;inmult<=’0’; inmdiv<=’1’;end if;end if;end process pacecal;ctrflag: process(c,clk)beginif c=’1’ thenflag<=’0’;elsif clk’event and clk=’1’ thenif inplus=’1’ or insubt=’1’ or inmult==’1’ or inmdiv=’1’ then flag<=’1’;else flag<=’0’;end if;ctrfirstnum: process(c,clk)beginif c=’1’ thenacc<=”00000000”;elsif numclk’event and numclk=’0’ thenif flag=’0’ thenacc<=acc*”1010”+numbuff;end if;enf if;end process ctrfirstnum;ctrsecondnum: process(c,clk)beginif c=’1’ or clear=’1’ thenreg<=”00000000”;fl<=’0’elsif numclk’event and numclk=’0’ thenif flag=’1’ thenfl<=’1’;reg<=reg*”1010”+numbuff;end if;end if;end process ctrsecondnum;ctrclear: process(c,clk)beginif c=’1’ thenclear<=’0’;elsif clk’event and clk=’1’ thenif plus=’1’ or subt=’1’ thenclear<=’1’;else clear<=’0’;end if;end if;end process ctrclear;ctrinequal: process(c,clk)beginif c=’1’ theninequal<=’0’;elsif clk’event and clk=’1’ thenif plus=’1’ or subt=’1’ or mult=’1’ or mdiv=’1’ or equal=’1’ then inequal<=’1’;else inequal<=’0’;end if;end if;end process ctrinequal;ctrcou: process(c,inequal)beginif c=’1’ thencou<=”00”;elsif inequal’event and inequal=’1’ thenif cou=”10” thencou<=cou;else cou<=cou+1;end if;end if;end process ctrcou;ctrcal: process(c,inequal)beginif c=’1’ thenans<=”00000000”;strdiv<=’0’;elsif inequal’event and inequal=’1’ thenif flag=’1’ thenif inplus=’1’ thenif cou=”10” thenans<=ans+reg;else ans<=acc+reg;end if;elsif insubt=’1’ thenif cou=”10” thenans<=ans-reg;else ans<=acc-reg;end if;elsif inmult=’1’ thenif acc<=00001111” and reg<=”00001111” thenans<=acc(3 downto 0)*reg(3 downto 0);else ans<=”00000000”;end if;elsif inmdiv=’1’ thenstrdiv<=’1’;end if;else strdiv<=’0’;end if;end if;end process ctrcal;d1: div port map (acc,reg(3 downto 0),clk,strdiv,dans); ctrvf: process(c,equal)beginif c=’1’ thenvf<=’0’;elsif equal;event and equal=’1’ thenvf<=’1’;end if;end process ctrvf;ctrkeep: process(c,clk)beginif c=’1’ thenkeep<=”00000000”;elsif clk’event and clk=’0’ thenif flag=’0’ thenkeep<=acc;elsif flag=’1’ and fl=’1’ and vf=’0’ thenkeep<=reg;elsif flag=’1’ and fl=’0’ and vf=’0’ and cou=”10” then keep<=ans;elsif flag=’1’ and vf=’1’ thenif inmdiv=’0’ thenkeep<=ans;elsekeep(3 downto 0)<=dans;end if;end if;end if;end process ctrkeep;ctrview: process(c,clk)beginif c=’1’ thenview1<=”0000”;view2<=”0000”;view3<=”0000”; viewstep<=takenum;elsif clk’event and clk=’1’ thencase viewstep iswhen takenum =>ktemp<=keep;viewstep<=hundred;when hundred =>if ktemp>=”11001000” thenview1<=”0010”; ktemp<=ktemp-“11001000”;elsif ktemp>=”01100100” thenview1<=”0001”; ktemp<=ktemp-“01100100”;else view1<=”0000”;end if;viewstep<=ten;when ten =>if ktemp>=”01011010” thenview2<=”1001”; ktemp<=ktemp-“01011010”;elsif ktemp>=”01010000” thenview2<=”1000”; ktemp<=ktemp-“01010000”;elsif ktemp>=”01000110” thenview2<=”0111”; ktemp<=ktemp-“01000110”;elsif ktemp>=”00111100” thenview2<=”0110”; ktemp<=ktemp-“00111100”;elsif ktemp>=”00110010” thenview2<=”0101”; ktemp<=ktemp-“00110010”;elsif ktemp>=”00101000” thenview2<=”0100”; ktemp<=ktemp-“00101000”;elsif ktemp>=”00011110” thenview2<=”0011”; ktemp<=ktemp-“00011110”;elsif ktemp>=”00010100” thenview2<=”0010”; ktemp<=ktemp-“00010100”;elsif ktemp>=”00001010” thenview2<=”0001”; ktemp<=ktemp-“00001010”; else view2<=”0000”;end if;viewstep<=one;when one =>view3<=ktemp(3 downto 0);viewstep<=takenum;when others =>null;end case;end if;end process ctrview;v1: vdecode port map (view1,onum1);v2: vdecode port map (view2,onum2);v3: vdecode port map (view3,onum3);end c;。
运算器摘要设计一个简单运算器。
由顶层电路、运算器、按键输入、控制信号产生、修正结果、显示等模块构成。
用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)结论 (32)参考文献 (33)前言随着FPGA性能的不断完善,FPGA器件的种类日益丰富,受到世界范围内电子设计人员的普遍欢迎,并占据了较大的市场,其生产厂家也由原来的Xilinx公司一家增加到Altera、Actel、lattice等十几家公司。
本科实验报告课程名称:CPLD/FPGA应用设计实验名称: VHDL方式设计4位加法计数器实验二VHDL方式设计4位加法计数器一、实验目的1、学习时序电路的VHDL描述方法。
2、掌握时序进程中同步、异步控制信号的设计。
3、熟悉EDA的仿真分析和硬件测试技术。
二、实验原理设计一个含计数使能、异步复位和并行预置功能的4位加法计数器,RST是异步复位信号,高电平有效;CLK是时钟信号;当使能信号ENA为“1”时,加法计数,COUT为计数进位输出,OUTY为计数输出。
三、实验仪器Windows xp操作系统;ispDesignEXPERT System软件;1016E开发板。
四、实验任务1、编写4位二进制加法计数器的VHDL程序。
2、在ispDesignEXPERT System上对编码器进行仿真。
3、将输入引脚连接到拨码开关,时钟输入锁定到相应频率的时钟信号,输出连接到发光二极管,下载后在实验板上验证其功能,记录实验结果。
五、实验步骤1、VHDL文本编辑在MUX+PLUS集成环境下,执行“file”中的“new”命令,弹出编辑文本类型的对话框,选择“text edior file”后单击“OK”。
先采用VHDL文本输入设计法实现4位二进制加法计数器的数字逻辑电路,并将文件cnt4.vhd保存到创建的目录下。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt4 isport(clk : in std_logic;rst : in std_logic;ena : in std_logic;outy :out std_logic_vector(3 downto 0);cout :out std_logic);end cnt4;architecture behav of cnt4 issignal cqi : std_logic_vector(3 downto 0);beginp_reg : process(clk,rst,ena)beginif rst ='1'then cqi <="0000";elsif clk'event and clk ='1'thenif ena='1' thencqi<=cqi+1;end if;end if;outy <= cqi;end process p_reg;cout <=cqi(0) and cqi(1) and cqi(2) and cqi(3);end behav;2、编译文件对cnt4.vhd设计文件进行编译,进而实现四位同步二进制加法计数器的数字逻辑电路3、功能时序仿真4位加法计数器功能仿真图4位加法计数器时序仿真图4、引脚锁定5、器件适配在ispDesignEXPERT System Project Navigator主窗口中选中左侧的ispLSI1016E器件,双击右侧的Compile Design选项,进行器件适配。
vhdl计数器实验报告《VHDL计数器实验报告》摘要:本实验利用VHDL语言设计了一个简单的计数器电路,并通过FPGA实现了该计数器。
实验结果表明,VHDL计数器能够准确地实现计数功能,具有较高的稳定性和可靠性。
引言:计数器是数字电路中常见的一种基本电路,用于实现对输入信号的计数和统计。
在本次实验中,我们利用VHDL语言设计了一个简单的计数器电路,并通过FPGA实现了该计数器。
本实验旨在通过实际操作和观察,加深对VHDL语言和计数器电路的理解,提高实验者的实际动手能力和问题解决能力。
实验内容:1. VHDL语言设计计数器电路2. 在FPGA上实现计数器电路3. 调试和测试计数器电路实验步骤:1. 设计计数器电路的VHDL代码,包括计数器的输入输出端口、计数器的计数规则和状态转换规则等。
2. 将VHDL代码综合成逻辑门电路,并下载到FPGA开发板上。
3. 运行FPGA开发板,观察计数器电路的工作情况,调试和测试计数器电路。
实验结果:经过实验,我们成功设计了一个简单的4位二进制计数器,能够准确地实现计数功能。
在FPGA开发板上实现该计数器电路后,我们观察到计数器能够按照预期的规则进行计数,并且在每个计数值上能够稳定地输出正确的结果。
在不同的输入条件下,计数器电路都能够正常工作,具有较高的稳定性和可靠性。
结论:通过本次实验,我们深入了解了VHDL语言的基本语法和计数器电路的设计原理,掌握了VHDL语言设计数字电路的方法和技巧。
同时,我们通过实际操作和观察,加深了对计数器电路的理解,提高了实际动手能力和问题解决能力。
本次实验取得了良好的实验效果,为今后的数字电路实验和项目设计奠定了良好的基础。
基于FPGA的计算器设计引言:随着数字电子技术的不断发展,计算器已经成为人们生活中不可或缺的工具之一、计算器设计是数字电子技术的经典应用之一,也是许多电子工程、计算机科学等专业学科的必修课程。
随着FPGA(Field Programmable Gate Array)技术的快速发展,基于FPGA的计算器设计在教育和工程领域得到了广泛应用。
本文将介绍基于FPGA的计算器的设计思路、硬件架构和关键模块的设计。
一、设计思路:二、硬件架构:1.输入模块:负责接收用户输入的数字和操作符,并将其转化为计算器能够处理的格式。
2.运算模块:负责对输入的数字和操作符进行运算,并生成计算结果。
3.显示模块:负责将计算结果显示在计算器的显示屏上。
4.控制模块:负责控制计算器的各个模块之间的数据流和操作。
三、关键模块的设计:1.输入模块设计:输入模块主要包括键盘和输入转换电路。
键盘用于接收用户输入,输入转换电路负责将键盘输入转化为计算器可以处理的格式(比如将键盘输入的字符转化为二进制数)。
2.运算模块设计:运算模块设计的关键是将不同的操作符映射到不同的算法和电路实现。
比如,加法操作可以通过加法器电路实现,减法操作可以通过加法器和取反器电路实现。
3.显示模块设计:显示模块主要包括显示屏和显示驱动电路。
显示驱动电路负责将计算结果转化为显示屏可以显示的格式(比如将二进制数转化为十进制数)。
4.控制模块设计:控制模块负责协调各个模块的数据流和操作流程。
控制模块可以通过有限状态机(FSM)的方式来实现,根据用户输入的操作符和状态转移条件来决定下一步的操作。
四、实验结果和分析:通过基于FPGA的计算器设计,我们可以实现一个功能强大、灵活易用的计算器。
在实验中,我们可以通过按键输入数字和操作符,计算器会将输入转化为正确的结果并在显示屏上显示出来。
1.灵活性:FPGA芯片的可编程逻辑单元可以根据需求进行更改和扩展,使得计算器可以具有更多的功能和特性。
大连海事大学毕业论文二○一四年六月VHDL设计FPGA数字系统:计算器专业班级: 通信工程10-3班姓名: 马哈得指导老师: 严飞信息科学技术学院摘要本文针对FPGA的计算器数字系统的设计,进行了软件硬件的仿真与实现。
实现了计算器控制系统的最基本的加减法功能设计。
本设计所研究的数字系统是由四个不同的模块完成的,包括键盘输入模块、译码模块、计算主控制模块以及数码管显示模块。
当键盘输入信号时,依次通过这几个模块,完成数据的运算及显示。
其中计算主控制模块完成加减运算,是系统核心模块。
本设计利用EDA技术,用VHDL语言来编程实现四个模块的基本功能,在Quartus II软件中实现模块的设计、编译、综合、优化、仿真直至生成器件之后下载到FPGA目标芯片上。
在ZY11EDA13BE实验系统中完成计算器控制系统的功能的实现,通过键盘等操作输入数值、运算符号,通过数码管及指示灯显示系统运行结果,从而可以更清晰的观察了计算器的运行情况。
关键词:计算器;EDA;FPGA;QuartusIIABSTRACTThis article for FPGA of the calculator digital system design, conducted a software hardware Simulation and Realization. A calculator to achieve the control system the most basic functions designs.This design studied Digital System is composed of added and subtracted of module to complete, including the keyboard input module, decoding module, calculate the main control module and a digital tube display module. When the keyboard input signal passes through these modules, complete data display computing requirements. This calculation control system Math four computing module is the core.This design, with the aid of VHDL language to the programming four modules of the basic functions, is in Quartus II software realize the connection and function modules simulation, comprehensive optimization generation device until after the download to FPGA target chip. In the ZY11EDA13BE experimental system mid complete the calculator control function of the system the realization of, through the keyboard, etc. operation input numerical value, computing symbols, through the digital pipe and indicator shows the operation of the system, and a clear view of the operation.Keywords: Calculator; EDA; FPGA; QuartusII;目录第一章绪论 (1)1.1计算器研究的背景和发展 (1)1.2课题研究任务 (2)1.3文章小结 (2)第二章项目基础 (3)2.1软件与硬件介绍 (3)2.1.1EDA (3)2.1.2EDA的特点及发展 (3)2.2Quartus II (4)2.2.1QUARTUS Ⅱ软件的用户界面 (4)2.2.2QuartusⅡ的开发流程 (5)2.3VHDL语言 (6)2.3.1VHDL发展现状 (6)2.3.2VHDL程序结构 (6)2.3.3VHDL语言的特点 (7)2.4FPGA (8)2.4.1FPGA的概念 (8)2.4.2FPGA的基本特点 (8)2.5ZY11EDA13BE实验系统介绍 (9)2.6本章小结 (10)第三章计算器数字系统设计方案介绍 (11)3.1总体方案设计 (11)3.1.1计算器功能和要求 (11)3.1.2计算器设计流程图 (12)3.2系统设计框图 (13)3.3本章小结 (14)第四章计算器系统主要模块设计 (15)4.1输入模块 (15)4.1.1键盘输入模块 (15)4.1.2译码模块 (15)4.2计算器数字系统运算的实现 (16)4.2.1控制模块 (16)4.2.2加法器 (17)4.2.3减法器 (18)4.3显示模块 (19)4.4计算器控制系统的顶层原理图 (20)4.5本章小结 (21)第五章硬件实现计算器系统主要模块设计 (22)5.1计算器数字系统管脚锁定 (22)5.2实验箱结果展示 (22)5.3本章小结 (25)第六章结束语 (26)参考文献 (27)致谢 (29)VHDL设计FPGA数字系统:计算器第1章绪论1.1 计算器研究的背景和发展在算术运算中,想要节省时间,精力,并排除人为错误的愿望,可能与算术科学本身一样久远!此愿望使得各种以小物件计算的辅助工具的设计和制造得以实现,如卵石,起初零散使用,之后放在控制板上用以计数,随后再以线串珠子并固定于框架上用以计数,名曰算盘。
此工具可能由犹太人种族发明,并随后由印度人使用,并从那里向西传播至整个欧洲,向东至中国和日本[1]。
如图1.1所示。
算盘发展后,在1617年John Napier设计他的编号棒或 Napier骨之前,算盘都没有进一步的发展。
骨制的多样形式出现,这些已与机械计算的开始相接近,但是直到1642年Blaise Pascal才给我们发明了感觉上与今天相似的机械式计算机。
如图1.2所示。
图1.1 中国算盘图1.2 1725年Lépine发明的一个机器和四个Pascal计算器现代电子计算器包含带按钮的键盘用以数字和算术功能。
有的计算器键盘甚至包含00和000键以便输入大数字。
最基本的计算器对每个按键分配唯一一个数字或运算符。
然而,在更复杂的计算器上,一个按钮可以执行多个功能。
如今,计算器通常拥有液晶显示器作为数据的显示输出。
在更多的细节上进行了技术改进。
分数如1/3被显示为小数的近似值,例如四舍五入至0.33333333。
[8]计算器也有将号码存储到内存的能力。
这种基本数据的存储速度非常快。
更复杂的计算器能够存储变量表示的数据。
这些变量也可以用于构造公式。
某些计算器有扩展存储容量的能力,从而可以存储更多的数据;扩展的地址被称为数组索引[2]。
计算器的电源是电池,太阳能电池或电力(老机型)与一个开关或按钮接通。
有些型号甚至没有关闭按钮,但它们提供了一些方法来关闭电源,例如,长时间没有操作、覆盖太阳能电池板,或关闭它们的盖子。
1.2课题研究任务本实验计算器采用VHDL语言来设计实用加减法计算器。
在了Altera公司的Quartus II 软件平台上进行编程、编译、综合优化、仿真,最后下载到FPGA目标芯片上,在ZY11EDA13BE实验系统实现计算器系统的功能。
通过外接键盘输入操作数和运算符,通过数码管和LED指示灯来显示操作数和运算结果。
如此,达到运算目的,可以更清晰的观察计算器的运行情况。
本次通过对加减法计算器数字系统的设计,为更复杂的计算器数字系统的实现提供基础。
1.3 文章小结本章介绍这几世纪以来的计算器发展,还有本次设计的研究任务,为后续的设计打下基础。
第二章项目基础2.1 软件与硬件介绍2.1.1 EDA电子设计自动化(英语:Electronic design automation,缩写:EDA)即电子设计自动化技术,是利用计算机工作平台,从事电子系统和电路设计的一项技术[3]。
EDA的广义定义范围包括:半导体工艺设计自动化、可编程器件设计自动化,电子系统设计自动化,印刷电路板设计自动化,仿真、测试、故障诊断自动化,形式验证自动化……统称为EDA工程。
随着集成电路规模的扩大、半导体技术的发展,电子设计自动化的重要性急剧增加。
这些工具的使用者包括半导体器件制造中心的硬件技术人员,他们的工作是操作半导体器件制造设备并管理整个工作车间。
一些以设计为主要业务的公司,也会使用电子设计自动化软件来评估制造部门是否能够适应新的设计任务。
电子设计自动化工具还被用来将设计的功能导入到类似现场可编程逻辑门阵列的半定制可程式逻辑装置,或者生产全定制的特殊应用积体电路。
硬件描述语言HDL (Hardware Description Language ) 是一种用于设计硬件电子系统的计算机语言,它用软件编程的方式来描述电子系统的逻辑功能、电路结构和连接形式,与传统的门级描述方式相比,它更适合大规模系统的设计[4]。
2.1.2 EDA的特点及发展现在人类社会已经步入了信息时代,各种各样的信息技术在我们的生活当中发挥着越来越重要的作用。
信息时代的高速发展离不开电子设计技术的发展和相关电子产品的进步,而他们的核心就是EDA技术。
EDA代表了当今电子设计技术的最新发展方向,是在电子CAD的技术基础上发展起来的计算机软件系统,以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理技术及智能化技术的最新成果,来进行电子产品的自动设计,主要能辅助进行IC设计,电子电路设计和PCB设计三方面的设计工作。
从70年代开始,EDA依次经历了CAD、CAE和ESDA三个阶段。
有了EDA工具,电子产品从电路的设计、性能的分析到PCB设计的整个过程都可以在计算机上自动处理完成。
这主要是因为EDA技术利用计算机,根据硬件描述语言HDL完成的设计文件,自动地完成逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化、逻辑布局布线、逻辑仿真,完成对于特定目标的适配编译、逻辑映射、编程下载等工作,最终形成集成电子系统或专用的集成芯片。
电子设计人员根据“自顶向下”的设计方法,从系统设计着手,在顶层进行功能方框图的划分和结构设计,用硬件描述语言对高层次的系统进行描述,然后用综合优化工具生成具体门电路的网络表。