vhdl加法计数器
vhdl BCD码加法器
实验一BCD码加法器一、实验目的了解BCD 码的构成。
了解BCD 码加法器的原理和设计实现方法。
巩固Quartus II 的使用。
二、实验内容与要求通过键盘输入两组4BIT的二进制数据,按照二进制加法器原理进行加和,求出和合进位,并通过电路静态数码LED显示灯输出显示,完成编译、综合、适配、仿真、实验箱上的硬件测试。
三、实验平台(1)硬件:计算机、GX-SOC/SOPC-DEV-LABCycloneII EP2C35F672C8核心板(2)软件:Quartus II四、实验原理BCD码是二进制编码的十进制码,也就是用4位二进制数来表示十进制中的0~9这十个数。
由于4位二进制数有0000~1111共16种组合,而十进制数只需对应4位二进制数的10种组合,故从4位二进制数的16种组合中取出10种组合来分别表示十进制中的0~9,则有许多不同的取舍方式,于是变形成了不同类型的BCD码。
当BCD码相加的值小于等于9时,结果仍旧是正确的BCD码;当两个码相加的结果大于9时,必须作加6的修正处理,对于大于19的值作加12的修正处理,对于大于29的值作加18的修正处理。
然后根据仿真进行实验及验证。
六、仿真截图七、硬件实现八、程序代码1LIBRARY Ieee;USE Ieee.Std_Logic_1164.all;ENTITY f_ADDER IsPort (x: In Std_Logic;y: In Std_Logic;cin: In Std_Logic;cout: Out Std_Logic;sum: Out Std_Logic);END f_ADDER;ARCHITECTURE fd1 Of f_ADDER Is Component HADDERPort( a,b: In Std_Logic;co,so: Out Std_Logic);END Component;Component oraPort(a,b: In Std_Logic;c: Out Std_Logic);END Component;Signal d,e,f: Std_Logic;BeginU1: HADDERPort Map(a=>X,b=>Y,Co=>d,so=>e);U2:HADDERPort Map(a=>e,b=>cin,Co=>f,so=>sum);U3:ora Port Map(a=>d,b=>f,c=>cout);END ARCHITECTURE fd1;2LIBRARY Ieee;USE Ieee.Std_Logic_1164.all;ENTITY HADDER IsPort (a,b: In Bit;Co, So: Out Bit);END HADDER;ARCHITECTURE fh1 Of HADDER Is BEGINSo <= (a Xor b);Co <= (a And b);END fh1;3LIBRARY Ieee;USE Ieee.Std_Logic_1164.all;ENTITY ora IsPort ( a: in Std_Logic;b: in Std_Logic;c: out Std_Logic);END ora;ARCHITECTURE org OF ora ISBEGINc <= a Or b;END org;4Library ieee;Use ieee.std_logic_1164.all;Entity Qadd isPort (a:in std_logic_VECTOR(7 DOWNTO 0);b:in std_logic_VECTOR(7 DOWNTO 0);--cin:in std_logic;s:out std_logic_VECTOR(7 DOWNTO 0));End Qadd;Architecture one of Qadd isSignal c0,c1,c2,c3,c4,c5,c6,c7 : std_logic;Component f_ADDERPort (x: In Std_Logic;y: In Std_Logic;cin: In Std_Logic;cout: Out Std_Logic;sum: Out Std_Logic);END Component;Beginu1 :F_ADDERPort map(sum=>s(0),cout=>c0,X=>a(0),Y=>b(0),cin=>'0'); u2 :F_ADDERPort map(sum=>s(1),cout=>c1,X=>a(1),Y=>b(1),cin=>c0 ); u3 : F_ADDERPort map(sum=>s(2),cout=>c2,X=>a(2),Y=>b(2),cin=>c1 ); u4 : F_ADDERPort map(sum=>s(3),cout=>c3,X=>a(3),Y=>b(3),cin=>c2 ); u5 : F_ADDERPort map(sum=>s(4),cout=>c4,X=>a(4),Y=>b(4),cin=>c3 ); u6 : F_ADDERPort map(sum=>s(5),cout=>c5,X=>a(5),Y=>b(5),cin=>c4 ); u7 :F_ADDERPort map(sum=>s(6),cout=>c6,X=>a(6),Y=>b(6),cin=>c5 ); u8 : F_ADDERPort map(sum=>s(7),cout=>c7,X=>a(7),Y=>b(7),cin=>c6 ); END;九、实验总结。
VHDL各种计数器程序全新
1. 具有CLK,Q端口的简单加法计数器,要程序和最后的RTL图;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 ISPORT ( CLK : IN STD_LOGIC;Q : OUT INTEGER RANGE 15 DOWNTO 0);END;ARCHITECTURE behav OF CNT4 ISSIGNAL D,Q1 : INTEGER RANGE 15 DOWNTO 0;BEGINPROCESS (CLK)BEGINIF CLK'EVENT AND CLK='1'THEN Q1<=D;END IF;END PROCESS;D<=Q1+1;Q<=Q1;END behav;2. 具有异步清零aclr,CLK,Q端口的加法计数器,要程序和最后的RTL图;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL ;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 ISPORT ( CLK,ACLR : IN STD_LOGIC;Q : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)); END ;ARCHITECTURE behav OF CNT4 ISSIGNAL Q1 : STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINPROCESS (CLK,ACLR)BEGINIF ACLR='0' THENQ1<=(OTHERS=>'0');ELSIF CLK'EVENT AND CLK='1' THENQ1<=Q1+1;END IF;END PROCESS;Q<=Q1;END behav;3. 具有同步清零sclr,CLK,Q端口的加法计数器,要程序和最后的RTL图;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL ;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 ISPORT ( CLK,SCLR : IN STD_LOGIC;Q : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)); END ;ARCHITECTURE behav OF CNT4 ISSIGNAL Q1 : STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINPROCESS (CLK,SCLR)BEGINIF CLK'EVENT AND CLK='1' THENIF SCLR='1' THENQ1<=(OTHERS=>'0');ELSEQ1<=Q1+1;END IF;END IF;END PROCESS;Q<=Q1;END behav;4. 具有异步置位apre,CLK,Q端口的加法计数器,要程序和最后的RTL图;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 ISPORT(CLK :IN STD_LOGIC;APRE:IN STD_LOGIC;Q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END;ARCHITECTURE behav OF CNT4 ISSIGNAL Q1 :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK,APRE)BEGINIF APRE='1' THENQ1<="0001";ELSIF CLK'EVENT AND CLK='1' THENQ1<=Q1+1;END IF;END PROCESS;Q<=Q1;END behav;5. 具有同步置位spre,CLK,Q端口的加法计数器,要程序和最后的RTL图;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 ISPORT(CLK :IN STD_LOGIC;SPRE:IN STD_LOGIC;Q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END;ARCHITECTURE behav OF CNT4 ISSIGNAL Q1 :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK,SPRE)BEGINIF CLK'EVENT AND CLK='1' THENIF SPRE='1' THENQ1<="0001";ELSEQ1<=Q1+1;END IF;END IF;Q<=Q1;END behav;6. 具有异步清零aclr,异步置位apre,CLK,Q端口的加法计数器,要程序和最后的RTL 图;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 ISPORT(CLK :IN STD_LOGIC;ACLR:IN STD_LOGIC;APRE:IN STD_LOGIC;Q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END;ARCHITECTURE behav OF CNT4 ISSIGNAL Q1 :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK,APRE,ACLR)BEGINIF ACLR='1' THENQ1<="0000";ELSEIF APRE='1' THENQ1<="0001";ELSIF CLK'EVENT AND CLK='1' THENQ1<=Q1+1;END IF;END PROCESS;Q<=Q1;END behav;7. 具有同步使能ENB,CLK,Q端口的加法计数器,要程序和最后的RTL图;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 ISPORT(CLK :IN STD_LOGIC;ENB :IN STD_LOGIC;Q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END;ARCHITECTURE behav OF CNT4 ISSIGNAL Q1 :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK,ENB)BEGINIF CLK'EVENT AND CLK='1' THENIF ENB='1' THENQ1<=Q1+1;END IF;END IF;END PROCESS;Q<=Q1;END behav;8. 具有异步清零aclr,异步置位apre,同步使能ENB,CLK,Q端口的加法计数器,要程序和最后的RTL图;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 ISPORT(CLK :IN STD_LOGIC;ACLR:IN STD_LOGIC;ENB :IN STD_LOGIC;APRE:IN STD_LOGIC;Q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END;ARCHITECTURE behav OF CNT4 ISSIGNAL Q1 :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK,APRE,ACLR,ENB)BEGINIF ACLR='1' THENQ1<="0000";ELSEIF APRE='1' THENQ1<="0001";ELSIF CLK'EVENT AND CLK='1' THENIF ENB='1' THENQ1<=Q1+1;END IF;END IF;END IF;END PROCESS;Q<=Q1;END behav;1.生活如意,事业高升。
vhdl通用十进制加法器
湖南人文科技学院课程设计报告课程名称:VHDL语言与EDA课程设计设计题目:通用十进制加法器系别:通信与控制工程系专业:电子信息工程班级:学生姓名:学号:起止日期:指导教师:教研室主任:指导教师评语:指导教师签名:年月日成绩评定项目权重成绩1、设计过程中出勤、学习态度等方面0.22、课程设计质量与答辩0.53、设计报告书写及图纸规范程度0.3总成绩教研室审核意见:教研室主任签字:年月日教学系审核意见:主任签字:年月日摘要随着科技的发展,通用十进制加法器的应用已广泛融入到现实生活中。
EDA 技术的应用引起电子产品及系统开发的革命性变革。
本文采用EDA技术设计,并以VHDL语言为基础制作的通用十进制加法器。
该系统借助于强大的EDA工具和硬件描述语言可实现两个一位以上的十进制数的加法,在输入两个十进制数之后,给出两个数的相加结果。
本设计充分利用VHDL“自顶向下”的设计优点以及层次化的设计概念,提高了设计的效率。
设计主要步骤:首先利用QUARTUS‖来编辑、编译、仿真各个模块;然后以原理图为顶层文件建立工程,再进行引脚锁定、编译、下载,最后采用杭州康芯电子有限公司生产的GW48系列/SOPC/EDA实验开发系统,进行硬件测试。
关键词:通用十进制加法器;EDA技术;VHDL语言; QUARTUS‖目录设计要求 (1)1、方案论证与对比 (1)1.1方案一 (1)1.2方案二 (1)1.3 方案的对比与选择 (2)2、设计原理 (2)3、通用十进制加法器的主要硬件模块 (3)3.1 4位BCD码全加器模块 (3)3.2八加法器的实现框图 (3)4、调试与操作 (4)4.1通用十进制加法器的功能仿真 (4)4.2模式选择与引脚锁定 (4)4.2.1模式选择 (4)4.2.2引脚锁定 (5)4.3设备与器件明细表 (6)4.4调试 (6)4.4.1软件调试 (6)4.4.2硬件调试 (6)5、总结与致谢 (7)5.1总结与思考 (7)5.2致谢 (7)附录 (8)附录一 (8)附录二 (9)参考文献 (11)通用十进制加法器设计要求1、用VHDL 硬件描述语言设计4位的BCD 码全加器;2、以4位BCD 码全加器为模块设计两位十进制数的加法。
VHDL设计FPGA数字系统:计算器.docx
1.3文章小结
本章介绍这几世纪以来的计算器发展,还有本次设计的研究任务,为后续的设计打下基础。
第二章项目基础
2.1软件与硬件介绍
2.1.1 EDA
电子设计自动化(英语:Electronic design automation,缩写:EDA)即电子设计自动化技术,是利用计算机工作平台,从事电子系统和电路设计的一项技术[3]。
硬件描述语言HDL (Hardware Description Language )是一种用于设计硬件电子系统的计算机语言,它用软件编程的方式来描述电子系统的逻辑功能、电路结构和连接形式,与传统的门级描述方式相比,它更适合大规模系统的设计[4]。
2.1.2 EDA的特点及发展
现在人类社会已经步入了信息时代,各种各样的信息技术在我们的生活当中发挥着越来越重要的作用。信息时代的高速发展离不开电子设计技术的发展和相关电子产品的进步,而他们的核心就是EDA技术。
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.
vhdl 计数器的使用
实验四计数器的使用一、实验目的熟悉步长可变的加减计数器的工作原理、设计过程和实现方法。
二、实验内容与要求学习用VHDL设计步长可变的加减计数器电路,完成编译、综合、适配、仿真和实验箱上的硬件测试,通过LED数码管显示输入输出各部分数据。
三、实验原理通过输入一组4BIT二进制数据,控制计数方式,即步长,决定每个脉冲到来时计数器增加的数值,同时还有一个单BIT的控制位,选择加计数或者减计数,并通过电路显示各部分数据(输入及输出)。
拨码开关置为MODEL_SEL5-8,全部置为ON,通过USB下载;全部置为OFF,则通过LAB_JTAG_PS_AS接口下载。
DISP_SEL8,处于“ON”状态,这样可以使用静态共阳数码管DISP_SEL1,DISP_SEL2处于“OFF”状态,通过F1,F2的十六进制的输入,在静态共阳数码管DP1B,DP2B上显示输出。
F1,F2预置数据,通过计数器,总的计数值控制电平宽度,其中一组控制高电平,一组控制低电平。
在DP1B上显示的是0-F的步长可变的加减计数器。
四、实验平台(1)硬件:计算机、GX-SOC/SOPC-DEV-LABCycloneII EP2C35F672C8核心板(2)软件:Quartus II软件五、六、仿真截图七、硬件实现八、程序代码1--10 位计数SCAN TOP_LEVEL程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;ENTITY ACOUNT100 ISPORT(clk,clr,en,en6:IN STD_LOGIC ;count1 : out std_logic ;ledseg : out std_logic_vector(6 downto 0);ledcom :out std_logic_vector(5 downto 0)); END;ARCHITECTURE ONE OF ACOUNT100 IS COMPONENT clkgen ISPORT(clkin:IN STD_LOGIC ;clkout: OUT STD_LOGIC);END COMPONENT;COMPONENT COUNT10a ISPORT(clk,clr,en:IN STD_LOGIC ;q:OUT STD_LOGIC_vector(3 downto 0);count1:OUT STD_LOGIC);end COMPONENT;COMPONENT bcd_7seg isport(bcd_led :in std_logic_vector(3 downto 0);--input bcdledseg : out std_logic_vector(6 downto 0));--output to 7 segmentend COMPONENT;COMPONENT mx isport(s:in std_logic;a,b:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0));end COMPONENT;COMPONENT comcoun isport(clk : in std_logic;--synchronouse clockenable : in std_logic;--scan clockcomclk : out std_logic_vector(2 downto 0));--output countend COMPONENT;COMPONENT com_encode isport(s :in std_logic;--input countledcom :out std_logic_vector(5 downto 0));--output encodeend COMPONENT ;signal clk1,c10: std_logic;signal q1,q2,bcd: std_logic_vector(3 downto 0);BEGINU1:clkgen PORT MAP(CLKIN=>CLK,CLKOUT=>CLK1);U2:COUNT10a PORT MAP(clk=>CLK1,clr=>clr,en=>en,q=>q1,count1=>c10);U3:COUNT10a PORT MAP(clk=>CLK1,clr=>clr,en=>c10,q=>q2,count1=>count1); U4:MX PORT MAP(S=>CLK1,A=>q1,b=>q2,q=>bcd);U5:bcd_7seg PORT MAP(bcd_led=>bcd,ledseg=>ledseg);U6:com_encode PORT MAP(s=>clk1,ledcom=>ledcom );end;2---clkgen.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;ENTITY clkgen ISPORT(clkin:IN STD_LOGIC ;clkout: OUT STD_LOGIC);END;ARCHITECTURE even OF clkgen ISconstant N:Integer:=50000000;--constant N:Integer:=10;SIGNAL coun:integer range 0 to N;SIGNAL clk1:STD_LOGIC;BEGINPROCESS(clkin)BEGINIF(clkin'EVENT AND clkin='1')THENIF(coun=N)THENcoun<=0;clk1<=Not clk1;elsecoun<=coun+1;END IF;END IF;END PROCESS;clkout<=clk1;END even;3--10 位计数器程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COUNT10a ISPORT(clk,clr,en:IN STD_LOGIC;count1:OUT STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COUNT10a ;ARCHITECTURE rtl OF COUNT10a ISSIGNAL qs:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL ca:STD_LOGIC;BEGINPROCESS(clk)BEGINIF(clk'EVENT AND clk='1')THENIF(clr='1')THENqs<="0000";ELSIF(en='1')THENIF(qs="1001")THENqs<="0000";ca<='0';ELSIF(qs="1000")THEN --在计数到8时,即让进位赋值1,--由于信号会产生一个滞后,使得实际ca在9时出现qs<=qs+1;ca<='1';ELSEqs<=qs+1;ca<='0';END IF;END IF;END IF;END PROCESS;PROCESS(ca,en)BEGINq<=qs;count1<=ca AND en;END PROCESS;END rtl;4library ieee;use ieee.std_logic_1164.all;entity mx isport(s:in std_logic;a,b:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0));end mx;architecture rtl of mx isbeginq<= a WHEN s = '0' ELSE b ;end rtl;5--七段显示扫描电路--comcoun.vhd 7 segment com scan counterlibrary ieee ;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity comcoun isport(clk : in std_logic;--synchronouse clockenable : in std_logic;--scan clockcomclk : out std_logic_vector(2 downto 0));--output countend comcoun;architecture behavior of comcoun issignal q : std_logic_vector(2 downto 0);--internal counted signal beginfscan:process(clk)beginif (clk'event and clk='1') thenif (enable='1') thenif q>=1 thenq<="000";--initial counterelseq<=q+1;--countingend if;end if;end if;end process fscan;comclk<=q; --output internal countend behavior;6library ieee ;use ieee.std_logic_1164.all;entity bcd_7seg isport(bcd_led :in std_logic_vector(3 downto 0);--input bcdledseg : out std_logic_vector(6 downto 0));--output to 7 segment end bcd_7seg;architecture behavior of bcd_7seg isbeginwith bcd_led selectledseg<="0111111" when "0000",--0,3f"0000110" when "0001",--1,06"1011011" when "0010",--2,5b"1001111" when "0011",--3,4f"1100110" when "0100",--4,66"1101101" when "0101",--5,6d"1111101" when "0110",--6,7d"0100111" when "0111",--7,27"1111111" when "1000",--8,7f"1101111" when "1001",--9,6f"1110111" when "1010",--A"1111100"when "1011", --b"0111001"when "1100",--c"1011110" when "1101",--d"1111001"when "1110",--E"1110001" when "1111",--F"0000000" when others;end behavior;7--计数译码电路-- 6 共阴--com_encode.vhd 7 segment com encoderlibrary ieee ;use ieee.std_logic_1164.all;entity com_encode isport(s :in std_logic;--input countledcom :out std_logic_vector(5 downto 0));--output encode end com_encode;architecture behavior of com_encode isbeginledcom<="000001" when s='0' else"000010" ;end behavior;九、实验总结。
VHDL加法器设计1
VHDL 加法器设计设计要求:采用QuartusII 集成开发环境利用VHDL 硬件描述语言设计传播进位加法器,直接进位加法器,线形进位加法器,平方根进位加法器,并比较这四种加法器的性能。
为了便于比较性能,将四种加法器都设定为28位。
一、全加器设计全加器是上述四种加法器的基础部件,首先应当设计一位全加器。
设计原理:i i i iS ABC ABC ABC ABC A B C=+++=⊕⊕0i i C AB BC AC =++VHDL 程序:仿真结果:--一位全加器设计library ieee;use ieee.std_logic_1164.all; entity fulladd isport ( A: in std_logic;B: in std_logic; cin:in std_logic; sumbit:out std_logic; cout:out std_logic );end fulladd;architecture behav of fulladd is beginsumbit<=(A xor B) xor cin;cout<=(a and b) or (cin and a) or (cin and b); end behav;二、传播进位加法器设计实际上加法器就是是全加器的级联,其中的每个FA网络为一个全加器(采用上文所述的全加器)VHDL代码:--传播进位加法器library ieee;use ieee.std_logic_1164.all;use work.all;entity carry_propogate_adder isport (A: in std_logic_vector(27 downto 0);B: in std_logic_vector(27 downto 0);cin:in std_logic;sum:out std_logic_vector(27 downto 0);cout:out std_logic);end carry_propogate_adder;architecture behav of carry_propogate_adder issignal ct:std_logic_vector(28 downto 0);component fulladd isport (A: in std_logic;B: in std_logic;cin:in std_logic;sumbit:out std_logic;cout:out std_logic);end component;beginct(0)<=cin;cout<=ct(28);G1: for i in 0 to 27 generatel1:fulladd port map (A(i),B(i),ct(i),sum(i),ct(i+1));end generate G1;end behav;功能仿真:延时测定:由图中的两个时间bar 的差值可看出,sum 值和cout 值几乎同时计算出,其Tdelay=28.332ns (cin 无关)三、直接进位加法器设计 设计原理:首先将AB 输入转换为PG 输入,若每级的P 输入都是‘1’则直接将Ci 传给Co ,否则像传播进位加法器一样计算其AB-PG 转换网络原理:Fa 全加器原理:P A B G AB=⊕=o i iC G PC S P C =+=⊕VHDL 代码:-- FA 子单元 library ieee;use ieee.std_logic_1164.all;entity Fa isport (Pi,Gi,Ci:in std_logic; Coi,Si:out std_logic); end Fa;architecture Fabehav of Fa is beginCoi<=Gi or (Pi and Ci);Si<=Pi xor Ci; end Fabehav; --ABtoPG 转换网络 library ieee;use ieee.std_logic_1164.all;entity PGNet isport(Ai,Bi:in std_logic; Pi,Gi:out std_logic); end PGNet;architecture PGbehav of PGNet is beginPi<=Ai xor Bi;Gi<=Ai and Bi; end PGbehav; --传播进位加法器 library ieee;use ieee.std_logic_1164.all; entity bypass_adder is port(A,B:in std_logic_vector(27 downto 0); Ci:in std_logic; Sum:out std_logic_vector(27 downto 0); Co:out std_logic );end bypass_adder;architecture adderbehav of bypass_adder is component Fa is port (Pi,Gi,Ci:in std_logic; Coi,Si:out std_logic ); end component; component PGNet is port(Ai,Bi:in std_logic; Pi,Gi:out std_logic ); end component;signal P,G:std_logic_vector(27 downto 0); signal C:std_logic_vector(28 downto 0); signal BP:std_logic; begin C(0)<=Ci; G1: for i in 0 to 27 generate l1: PGNet port map(A(i),B(i),P(i),G(i)); end generate G1; G2: for i in 0 to 27 generate l2:Fa port map (P(i),G(i),C(i),C(i+1),Sum(i)); end generate G2; BP<='1' when P="11111111111111111111111111111111" else '0'; Co<=Ci when BP='1' else C(8); end adderbehav;功能仿真:延时仿真:当通过直接进位网络(图中testp值全部为1时),进位信号有一定提前,但由于计算所有的P值本身也需要一定时间,所以改善并不明显。
vhdl加法器二位BCD码加法器的VHDL源程序如下
vhdl加法器二位BCD码加法器的VHDL源程序如下导读:就爱阅读网友为您分享以下“二位BCD码加法器的VHDL源程序如下”资讯,希望对您有所帮助,感谢您对的支持!二位BCD码加法器的VHDL源程序如下:ibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity bcdadd is ---------------------实体部分port(key:in std_logic;---------------定义key输入口a0,a1,b0,b1:in integer range 0 to 9; -----定义两个加数的输入口a0l,a1l,b0l,b1l,s0l,s1l,s2l:out std_logic_vector(6 downto 0);----定义七个输出数码管s:out std_logic);----定义Key指示灯输出口end;architecture one of bcdadd is ----------结构体部分signal one:integer range 0 to 18; ----定义两个数的个位相加之后的信号signal ten:integer range 0 to 19; -----定义两个数的十位相加之后的信号signal co1,co2:integer range 0 to 1; ----定义个位和十位的进位信号signal s0,s1:integer range 0 to 15;beginp1:process(one,ten,a0,b0,a1,b1,co1)----第一个进程,进行加运算beginone<=a0+b0; --------------------个位相加之和if one>9 then --------------------和大于9,进位为1 co1<=1;s0<=one-10; -----------------------个位的值else -----------------------和小于9,进位为0co1<=0;s0<=one; -------------------------个位的值end if;ten<=a1+b1+co1;----------------------十位相加值和,加数包括个位来的进位if ten>9 then -------------------和大于9,进位为1co2<=1;s1<=ten-10;-------------------十位的值else ----------------------------------和小于9,进位为0co2<=0;s1<=ten;-----------------------十位的值end if;end process p1;p2:process(a0,a1,b0,b1) ----------第二个进程,两个加数的输出数码管显示译码begincase a0 is ----------------------被加数的个位显示译码when 0=>a0l<=“1000000”;when 1=>a0l<=“1111001”;when 2=>a0l<=“0100100”;when 3=>a0l<=“0110000”;when 4=>a0l<=“0011001”;第1页共4页when 5=>a0l<=“0010010”; when 6=>a0l<=“0000010”; when 7=>a0l<=“1111000”; when 8=>a0l<=“0000000”; whenothers=>a0l<=“ZZZZZZZ”; end case; case a1 is ------------------------------被加数的十位显示译码when 0=>a1l<=“1000000”; when 1=>a1l<=“1111001”; when 2=>a1l<=“0100100”; when 3=>a1l<=“0110000”; when 4=>a1l<=“0011001”; when 5=>a1l<=“0010010”; when 6=>a1l<=“0000010”; when 7=>a1l<=“1111000”; when 8=>a1l<=“0000000”; when 9=>a1l<=“0010000”; when others=>a1l<=“ZZZZZZZ”; end case; case b0 is-----------------------------加数的个位显示译码when 0=>b0l<=“1000000”; when 1=>b0l<=“1111001”; when 2=>b0l<=“0100100”; when 3=>b0l<=“0110000”; when 4=>b0l<=“0011001”; when 5=>b0l<=“0010010”; when 6=>b0l<=“0000010”; when8=>b0l<=“0000000”; when 9=>b0l<=“0010000”; when others=>b0l<=“ZZZZZZZ”; end case; case b1 is ----------------------------加数的十位显示译码when 0=>b1l<=“1000000”; when 1=>b1l<=“1111001”; when 2=>b1l<=“0100100”; when 3=>b1l<=“0110000”; when 4=>b1l<=“0011001”; when 5=>b1l<=“0010010”; when 6=>b1l<=“0000010”; when 7=>b1l<=“1111000”; when 8=>b1l<=“0000000”; when 9=>b1l<=“0010000”; when others=>b1l<=“ZZZZZZZ”;第2页共4页end case;end process p2;p3:process(key,s0,s1,co2,a0,a1,b0,b1) --------第三个进程,和的显示译码以及输入大于9是的出beginif key=…0‟ or a0>9 or b0>9 o r a1>9 or b1>9 then --当key等于0或者两个输入中的任何一个位大于9,和的数码显示均为“Z”状态s0l<=“ZZZZZZZ”;s1l<=“ZZZZZZZ”;s2l<=“ZZZZZZZ”;elsecase s0 is-------------------------------和的个位显示译码when 0=>s0l<=“1000000”;when 1=>s0l<=“1111001”;when 2=>s0l<=“0100100”;when 3=>s0l<=“0110000”;when 4=>s0l<=“0011001”;when 5=>s0l<=“0010010”;when 6=>s0l<=“0000010”;when 7=>s0l<=“1111000”;when 8=>s0l<=“0000000”;when 9=>s0l<=“0010000”;wh en others=>s0l<=“ZZZZZZZ”; end case;case s1 is--------------------------------和的十位显示译码when 0=>s1l<=“1000000”;when 1=>s1l<=“1111001”;when 2=>s1l<=“0100100”;when 3=>s1l<=“0110000”;when 4=>s1l<=“0011001”;when 5=>s1l<=“0010010”;when 6=>s1l<=“0000010”;when 7=>s1l<=“1111000”;when 8=>s1l<=“0000000”;when 9=>s1l<=“0010000”;when others=>s1l<=“ZZZZZZZ”; end case;case co2 is --------------------------和的百位显示译码when 0=>s2l<=“1000000”;when 1=>s2l<=“1111001”;end case;end if;end process p3;第3页共4页p4:process(key) -------------第四个进程,设置key的指示灯beginif key=…1‟ then s<=…1‟ ; else s<=…0‟;end if;end process p4;end;第4页共4页百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网,您的在线图书馆。
maxplus2 cpld vhdl 流水灯的设计 十进制加法计数器的设计 奇偶校验电路的
实验六流水灯的设计(文本输入方式)[实验目的]1.学习设计一个流水灯程序,并在实验板上验证;2.学习使用VHDL语言进行逻辑设计输入;3.学习设计仿真工具的使用方法;[实验说明]该流水灯除了输入有:时钟端、使能端和清零端,输出为8个led指示灯。
清零端为低电平时回到最初始状态,输出为O1灯亮,为高电平时无作用;使能端低电平时流水灯停止,高电平时流水灯继续流动;时钟端为系统时钟输入,要求8个led指示灯每秒变化一次,向右流动,变化顺序依次为O1灯亮→O2灯亮→O3灯亮→ O4灯亮→ O5灯亮→ O6灯亮→ O7灯亮→返回O1。
电路逻辑功能实现后,可将该逻辑功能下载到CPLD中。
注意选择:清零端选1脚,使能端选拨码开关,时钟端选83脚、输出线8根(接发光二极管指示[实验要求]1用VHDL语言实现流水灯2设计仿真文件,进行软件验证3通过下载线下载到实验板上进行验证4若初始状态为O8灯亮,流水灯向左流动,试重新设计并下载验证[实验报告要求]1写出VHDL编程语言源文件2给出软件仿真和硬件测试结果3通过下载线下载到实验板上进行验证4写出学习总结参考程序见下页:library ieee;use ieee.std_logic_1164.all;entity liushuideng isport(ena,clk_in,clr: in std_logic;y: out std_logic_vector(7 downto 0));end liushuideng;architecture a of liushuideng issignal clk: std_logic;beginclock:process(clk_in) --输入的时钟为4Mvariable clock_buffer:std_logic; ----定义一个标准逻辑变量clock_buffervariable count_time:integer range 0 to 1999999; ---定义一个整型变量count_time beginif clk_in'event and clk_in='1' thenif count_time=1999999 thencount_time:=0;clock_buffer:=not clock_buffer; --每计2M次数时翻转一次elsecount_time:=count_time+1;end if;end if;clk<=clock_buffer; --输出的时钟为1HZend process;process(clr,clk,ena)variable q: std_logic_vector(7 downto 0); ----定义一个标准逻辑矢量的变量qbeginif(clr='0')thenq:="11111110"; ----按下清零键让它回到O1灯亮elseif clk'event and clk='1' then ---时钟的上升沿if ena='1' then ---ena为高开始移位,ena为低停止移位q:=q(6 downto 0)&q(7); --向右移动移位end if;end if;end if;y<=q;end process;end a;实验七十进制加法计数器的设计(文本输入方式)[实验目的]1.学习设计一个十进制加法计数器程序,并在实验板上验证;2.熟练掌握VHDL语言进行逻辑设计输入;3.学习设计仿真工具的使用方法;[实验说明]该计数器输入有:时钟端、使能端和清零端,输出为1个数码管。
vhdl 加法器
ADD4, 8, 164-, 8-, 16-Bit Cascadable Full Adders with Carry-In, Carry-Out, and OverflowAArchitectures SupportedADD4, ADD8, and ADD16 add two words and a carry-in (CI), producing a sum output and carry-out (CO) or overflow (OFL). ADD4 adds A3 – A0, B3 – B0, and CI producing the sum output S3 – S0 and CO (or OFL). ADD8 adds A7 – A0, B7 – B0, and CI, producing the sum output S7 – S0 and CO (or OFL). ADD16 adds A15 – A0, B15 – B0 and CI, producing the sum output S15 – S0 and CO (or OFL).Unsigned Binary Versus Twos ComplementADD4, ADD8, ADD16 can operate on either 4-, 8-, 16-bit unsigned binary numbers or 4-, 8-, 16-bit twos-complement numbers, respectively. If the inputs are interpreted as unsigned binary, the result can be interpreted as unsigned binary. If the inputs are interpreted as twos complement, the output can be interpreted as twos complement. The only functional difference between an unsigned binary operation and a twos-complement operation is how they determine when “overflow” occurs. Unsigned binary uses CO, while twos-complement uses OFL to determine when “overflow” occurs. To interpret the inputs as unsigned binary, follow the CO output. To interpret the inputs as twos complement, follow the OFL output.Unsigned Binary OperationFor unsigned binary operation, ADD4 can represent numbers between 0 and 15, inclusive; ADD8 between 0 and 255, inclusive; ADD16 between 0 and 65535, inclusive. CO is active (High) when the sum exceeds the bounds of the adder.OFL is ignored in unsigned binary operation.T wos-Complement OperationFor twos-complement operation, ADD4 can represent numbers between -8 and +7, inclusive; ADD8 between -128 and +127, inclusive; ADD16 between -32768 and +32767, inclusive. OFL is active (High) when the sum exceeds the bounds of the adder. CO is ignored in twos-complement operation.ADD4, 8, 16Spartan-II, Spartan-IIE No Spartan-3No Virtex, Virtex-ENo Virtex-II, Virtex-II Pro, Virtex-II Pro X NoXC9500, XC9500XV , XC9500XL Primitive CoolRunner XPLA3Primitive CoolRunner-IIPrimitiveADD8 Implementation Spartan-II, Spartan-IIE, Virtex, Virtex-E Libraries GuideADD8 Implementation Spartan-3, Virtex-II, Virtex-II Pro, Virtex-II Pro XADD4 Implementation XC9500/XV/XL, CoolRunner XPLA3, CoolRunner-II Libraries GuideADD8 Implementation XC9500/XV/XL, CoolRunner XPLA3, CoolRunner-II UsageThis design element is schematic or inference only -- no instantiation.VHDL Inference Code (ADD4)architecture Behavioral of ADD issignal sum: std_logic_vector(WIDTH-1 downto 0);signal zeros: std_logic_vector(WIDTH-1 downto 0) := (others => '0'); beginprocess (CI, A, B, sum)beginsum <= ('0' & A) + ('0' & B) + (zeros & CI);S <= sum(WIDTH-1 downto 0);CO <= sum(WIDTH);end process;end Behavioral;Verilog Inference Code (ADD4)always @ (A or B or CI)begin{CO,sum} <= A + B + CI;end Libraries Guide。
第5章 计数器VHDL描述
调整进制
PROCESS (clr,clk) BEGIN IF(clr=‗1‘) THEN Count_B<=―00000000‖; q <= ‗0‘; ELSIF (clk'EVENT AND clk = ‗1‘ ) THEN IF (Count_B = ―00001111‖) THEN Count_B<=―00000000‖; else Count_B<=count_B + 1;
END IF; END IF; END PROCESS;
一、基本计数器的设计
计数器是数字系统的一种基本部件,是典 型的时序电路。计数器的应用十分广泛, 常用于数/模转换、 计时、频率测量等。
加法计数器VHDL源程序:
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 counbasict IS BEGIN
同步复位
PROCESS (clock) BEGIN if clock =‗1‘ and clock‘EVENT then if reset = ‗1‘ then sout <= ‗0‘; tmp <= ‗0‘; else sin sout <= sin; tmp tmp <= not tmp; clock reset end if; END IF; END PROCESS;
简单时序电路的VHDL描述
计数器的VHDL设计
Q数据格式是十六进制 ,是Q(3), Q(2), Q(1), Q(0),如十 六进制数值A,即成员:涂进,谢冰泽,谢希泽
计数器的VHDL设计
4位二进制加法计数器设计
输入端口:计数时钟信号CLK,数据类型是二进制逻辑位BIT
输 出 端 口 : Q 的 端 口 模 式 BUFFER , 数 据 类 型 定 义 为 整 数 类 型
INTEGER
VHDL 规定加减法等算术操作符对应的操作数的数据类型只能是
INTEGER(除非使用重载函数)
整数类型
整数数据类型INTEGER的元素包含正 整数、负整数和零 使用整数时,VHDL综合器要求必须使 用关键词RANGE构成句子 整数的表达不加引号,逻辑位或二进 制数据必须加引号 自然数类型NATURAL是整数类型的子 类型,包含0和正整数 正整数类型POSITIVE是整数类型的子 类型,比NATURAL少一个0 INTEGER,NATURAL,POSITIVE定义在 VHDL标准程序包STANDARD中
程序
计数器的其他VHDL表达方式
运算符重载,赋予新的数据类型操作功能,允许 不同数据类型间用此运算符进行运算 VHDL的IEEE库的STD_LOGIC_UNSIGNED程序包预 定的操作符:加,减,乘,等于,大于等于,小 于等于,大于,小于,不等于(/=),逻辑与等
完成加1操作的纯组合电路加法器
VHDL加法器
VHDL加法器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY F_ADDER ISPORT(ain,bin,cin:IN STD_LOGIC;sum,cout:OUT STD_LOGIC);END ENTITY F_ADDER;ARCHITECTURE BEHAVIOR OF F_ADDER ISSIGNAL D:STD_LOGIC;BEGIND<=(ain XOR bin);sum<=cin XOR D;cout<=(cin AND D) OR (ain AND bin);END ARCHITECTURE BEHAVIOR;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER8 ISPORT( a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);c:IN STD_LOGIC;s:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);co:OUT STD_LOGIC);END ENTITY ADDER8;ARCHITECTURE BEHAVIOR1 OF ADDER8 ISCOMPONENT F_ADDERPORT(ain,bin,cin:IN STD_LOGIC;sum,cout:OUT STD_LOGIC);END COMPONENT;--SIGNAL m:STD_LOGIC_VECT0R(7 DOWNTO 0);--SIGNAL s:STD_LOGIC_VECT0R(7 DOWNTO 0);SIGNAL wire: STD_LOGIC_VECTOR(8 DOWNTO 0);BEGINwire(0)<=c;co<=wire(8);gen:FOR i IN 7 DOWNTO 0 GENERATEu1:F_ADDER PORT MAP(ain=>a(i),bin=>b(i),cin=>wire(i),cout=>wire(i+1),sum=>s(i) );END GENERATE gen;--u1:F_ADDER PORT MAP(ain=>a(0),bin=>b(0),cin=>c,cout=>d,sum=>s(0));--u2:F_ADDER PORT MAP(ain=>a(1),bin=>b(1),cin=>m(i),cout=>e,sum=>s(1));--u3:F_ADDER PORT MAP(ain=>a(2),bin=>b(2),cin=>m(i),cout=>f,sum=>s(2));--u4:F_ADDER PORT MAP(ain=>a(3),bin=>b(3),cin=>m(i),cout=>g,sum=>s(3));--u5:F_ADDER PORT MAP(ain=>a(4),bin=>b(4),cin=>m(i),cout=>h,sum=>s(4));--u6:F_ADDER PORT MAP(ain=>a(5),bin=>b(5),cin=>m(i),cout=>i,sum=>s(5)); --u7:F_ADDER PORT MAP(ain=>a(6),bin=>b(6),cin=>m(i),cout=>j,sum=>s(6)); --u8:F_ADDER PORT MAP(ain=>a(7),bin=>b(7),cin=>m(i),cout=>co,sum=>s(7)); --su<=s;END ARCHITECTURE BEHAVIOR1;。
第十三章 1 8位并行预置加法计数器设计 VHDL语言 教学课件 ppt
四位二进制并行加法器的设计思想:
(1)将加数A、被加数B、和S扩展成5位, 即将加数、被加数、和与0相并置,运算之后分 别为AA,BB,SINT;
(2)按照全加器的方法将并置运算后的加数、 被加数和接收低位进位相加赋值给并置运算后的 和,即SINT<=AA+BB+CIN,其中CIN为接收低位 进位输入端;
THEN—ELSE语句结构,使得很容易地实 现了nmi、float、int和peripheral 4个中断 请求信号的能按优先顺序分别进行处理, 程序中使用了类属语句,使此中断处理器 可根据实际情况容易地改变地址位宽;程 序中还使用了数据类型转换函数 CONV_STD_LOGIC_VECTOR(X,Y)。
例13-4:文件名:stack.vhd LIBRARY IEEE; USE IEEE.STD LOGIC 1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity stack is generic(n:INTEGER:=8;
——堆栈元素的字长 k:INTEGER:=8);
程序中有两个进程,一个是数据写入进程 WRITE,该进程设置条件为wr=’0’的 IF_THEN不完整的条件语句,锁存器阵列, wr作为锁存控制信号,当wr=’0’时,在满足 条件(cs=’0’ and rd=’1’)时将外部8位数据din 锁进指定地址adr的RAM单元中;而当满足
条件(rd=’0’ and cs=’0’ and wr=’1’)时, 此SRAM将指定地址adr的RAM单元中的数 据向dout端口输出,否则该端口呈高阻态。
数据的重要器件,它由锁存器阵列构成,它的 界面端口由地址线、数据输入线、数据输出线、 片选线、写入允许线和读出允许线组成。
三位的十进制加法计数器的VHDL语言
三位的十进制加法计数器的VHDL语言--VHDL程序如下:LIBRARY ieee;UsE ieee。
std_logic_1164。
all;ENTITY cnt1000 IsPORT(clk : IN STD_LOGIC;clr : IN STD_LOGIC;en : IN STD_LOGIC;count : OUT I NTEGER RANGE 0 TO 999; co :OUT STD_LOGIC);END cnt1000;ARCHITECTURE a OF cnt1000 IsSIGNAL s : INTEGER RANGE 0 TO 999;BEGINPROCESS (clk, clr)BEGINIF clr = '0’ THENs 〈= 0;ELSIF (clk'EVENT AND clk = '1’) THENIF en = '1' THENIF s<999 THENs <= s + 1;ELSE s<=0;END IF;ELSEs <= s;END IF;IF s = 999 THEN co 〈='1’;ELSE co <=’0';END IF;END IF;END PROCESS;count 〈= s;END a;摘要:根据教学实践, 介绍了VHDL 硬件描述语言进行工程设计的优点。
他既是一种与实际技术相独立的语言, 不束缚于某一特定的模拟程序或数字装置上,也不把设计方法强加于设计者,他允许设计者在其使用范围内选择工艺和方法,描述能力极强, 覆盖了逻辑设计的诸多领域和层次,并支持众多的硬件模型;也是一种在数字电路教学中全新的理论联系实际的教学方法和全新的培养学生实际动手能力的有效工具。
同时简要地说明VHDL 硬件描述语言的支撑软件M ax+ Plus.并结合实例详细阐明VHDL 语言在M ax+ Plus 软件的环境下对数字电路的设计、应用方法及使用时需注意的几个方面事项。
VHDL一般加法计数器设计
一般加法计数器设计
【例4-22】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT (CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
一般加法计数器设计
1.1 相关语法说明
1. 变量 VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0)
2. 省略赋值操作符(OTHERS=>X) SIGNAL d1 : STD_LOGIC_VECTOR(4 DOWNTO 0); VARIABLE a1 : STD_LOGIC_VECTOR(15 DOWNTO 0); ... d1 <= (OTHERS=>'0'); a1 := (OTHERS=>'0') ;
d1 <= (1=>e(3),3=>e(5), OTHERS=>e(1) ); f <= e(1) & e(5) & e(1) & e(3) 器设计
1.2 程序分析
图4-14 例4-22的RTL电路(Synplify综合)
一般加法计数器设计
1.2 程序分析
1.0μs
1.5μs
检测是否小于9
--大于9,
计数值清零
END IF;
END IF;
END IF;
IF CQI = 9 THEN COUT <= '1'; --计数大于9,输出进位信号
VHDL双向十进制加减法计数器(代码和截图)
);
end entity;
architecture rtl of vh is
SIGNAL temp:std_logic_vector(3 downto 0);
begin
process (clk)
begin
if(we='1')then
temp<=d;
elsif(clk'event and clk='1')then
if(dir='0')then
if(temp<9)then
temp<=temp+'1';
co<=ห้องสมุดไป่ตู้0';
else
temp<="0000";
co<='1';
end if;
elsif(dir='1')then
if(temp>0)then
temp<=temp-'1';
co<='0';
else
temp<="1001";
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
entity vh is
port
(
clk: in std_logic;
dir: in std_logic;
we: in std_logic;
d : in std_logic_vector(3 downto 0);
co<='1';
实验五 含异步清零和同步使能4位加法计数器的VHDL设计
实验五含异步清零和同步使能4位加法计数器的VHDL设计一、实验目的1掌握计数器的VHDL设计方法;2掌握异步复位和同步复位和使能的概念;3掌握寄存器性能的分析方法(即分析芯片所能达到的最高时钟频率)。
二、实验内容1异步复位4位加法计数器的设计;2同步复位4位加法计数器的设计。
3异步清0和同步时钟使能的4位加法计数器三、实验原理复位:给计数器一个初值叫复位,如果所给初值为0,则称复位为清零。
异步复位:复位跟时钟无关,只要复位信号的复位电平出现,计数器立即复位,如图5-1所示;同步复位:复位跟时钟有关,当复位信号的复位电平出现时,计数器并不立即复位,而是要等到时钟沿到来时才复位,如图5-2所示。
异步复位4位加法计数器的VHDL设计代码见教材P122-P123,仿真波形如图5-3所示。
同步复位4位加法计数器的VHDL部分代码如下,仿真波形如图5-4所示。
.图5-1异步复位图5-2同步复位图5-3异步复位计数器仿真波形图5-4同步复位计数器仿真波形四、实验步骤(一)异步复位4位加法计数器的设计1建立一个设计工程,工程名为CNT4B;2打开文本编辑器,建立一个VHDL设计文件,其VHDL代码见教材P164中的例6-20,文件名存为CNT4B.VHD。
注意文件的扩展名要选为.vhd,而且要求工程名、文件名和设计实体名必须相同。
3选器件:ACEX1K,EP1K30TC144-3(旧)或Cyclone,EP3C40Q240C8目标芯片。
4编译;5建立波形文件,然后保存,其文件名必须与工程名一致;【波形设置:①设置仿真时间为10us:②设置输入信号的波形:时钟周期设置为200ns,其他输入信号的波形设置参看图6-3。
】6仿真,观察输出波形是否正确;7时序分析:分析芯片所能达到的最高时钟频率。
【打开时序分析器,然后执行菜单命令:analysis/register performance/start,可以看到最高时钟频率为100.00MHZ】(二)同步复位4位加法计数器的设计8建立一个设计工程,工程名为CNT4B_SYS;9打开文本编辑器,建立一个VHDL设计文件,其VHDL代码参看异步计数器代码和实验原理中的参考代码,文件名存为CNT4B_SYS.VHD。
10进制加减计数器状态机的VHDL设计
10进制加减计数器状态机的VHDL设计一、【设计目的】学习并掌握Quartus II 开发系统的基本操作。
掌握用Quartus II进行文本输入法进行电路设计、编译和仿真方法。
掌握CPLD/FPGA的开发流程。
掌握EDA实验开发系统的使用。
掌握状态机的原理。
掌握简单状态机的VHDL设计方法掌握计数器的设计方法。
掌握带有复位和和时钟使能的10进制计数器的原理。
掌握通用计数器的设计方法。
学习使用VHDL进行时序逻辑电路的设计。
学习利用真值表编写VHDL程序。
学习掌握7段数码显示译码器设计的原理。
掌握VHDL语言方式设计7段数码显示译码器。
学习掌握8位数码管动态扫描显示电路的原理。
掌握VHDL语言设计8位数码管动态扫描显示电路学习VHDL语言设计较复杂的电路方法。
二、【设计任务】设计要求用VHDL语言设计一个状态机,要求具有以下状态和功能中的四种或者四种以上:A.复位功能B.8、10或者16进制加法计数C.8、10或者16进制减法计数D.数码管以任何方式闪动E.8个LED灯以任何方式闪动F.蜂鸣器发声或者播放一段音乐G.并用两位数码管将结果显示出来本次设计选用的功能状态为:A.复位功能B.十进制加法计数C.十进制减法计数D.数码管闪动E.8个led灯闪动F.并用两位数码管将结果显示出来功能实现说明Clk为50MHz的时钟信号输入;rst为复位控制按键(低电平有效);en(0-2)通过三个按键分别控制3种状态(低电平有效)。
1.当en(0)=`0`时,启动加法计数并将结果动态显示到两位数码管上,同时另外的两位数码管的6段以相反方向按顺序闪烁2.当en(1)=`0`时,启动减法计数并将结果动态显示到两位数码管上,同时另外的两位数码管的6段以相反方向按顺序闪烁,闪烁方向与加法的相反;3.当en(2)=`0`时,启动LED闪烁功能,LED灯按顺序逐个流水闪动;4.当rst=`0`时,复位清零;三、【设计代码】library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-----------------------------------------------------------------------------ENTITY cnt16 ISPORT (clk : IN std_logic; --50MHz时钟信号输入rst : IN std_logic; ---复位功能输入en : IN std_logic_vector(2 DOWNTO 0); ---状态选择输入led8 : OUT std_logic_vector(7 DOWNTO 0); --各段数据输出com8 : OUT std_logic_vector(7 DOWNTO 0)); ---各位数据输出END cnt16;-----------------------*****对各个信号进行定义****------------------------------------- ARCHITECTURE arch OF cnt16 ISsignal cnt : std_logic_vector(25 downto 0 );signal data : std_logic_vector(3 downto 0);signal led8_xhdl : std_logic_vector(7 downto 0);signal com8_xhdl : std_logic_vector(7 downto 0);signal coud1 : std_logic_vector(3 downto 0);signal coud2 : std_logic_vector(3 downto 0);signal s1 : std_logic;signal s2 : std_logic;signal s3 : std_logic;signal coud : std_logic_vector(3 downto 0);signal first : std_logic_vector(3 downto 0); --0000signal second : std_logic_vector(3 downto 0); --0000 0000 0000 1001 signal jinwei: std_logic;------------------------------------------------------------------------------------------------------------- beginled8<=led8_xhdl;com8<=com8_xhdl;----------------------- *****状态控制部分*************--------------------------------------------- process(en)beginif en="110"then ----状态控制,低电平有效s1<='1';s2<='0';s3<='0';else if en="101"thens2<='1';s1<='0';s3<='0';else if en="011"thens3<='1';s1<='0';s2<='0';end if;end if;end if;end process;-------------------------------------------------------------------------------------------------------------------------------**********时钟分频部分********----------------------------------process(clk,rst)beginif(rst='0')thencnt<="00000000000000000000000000";elsif(clk'event and clk='1')thencnt<=cnt+1; -----来一个时钟信号cnt加1end if;end process;----------------------------------------------------------------------------------------------------------------------*****-加减计数器的个位-*******------------------------------- process(cnt(24),rst,s1,s2)beginif(rst='0')thenfirst<="0000";jinwei<='0';elsif(cnt(24)'event and cnt(24)='1')then ---每隔(1/50)*48=0.96s计数一次if (s1='1')thenif(first="1001")then ---10进制计数first<="0000";jinwei<='1';elsejinwei<='0';first<=first+1; ---加法计数end if;else if(s2='1')thenif(first="0000")thenfirst<="1001";jinwei<='1';elsejinwei<='0';first<=first-1; ---减法计数end if;end if;end if;end if;end process;-------------------------------------------------------------------------------------------------------------------*********-加减计数器的十位*******-------------------------- process(jinwei,rst,s1,s2)beginif(rst='0')thensecond<="0000";elsif(jinwei'event and jinwei='1')then ---每来1个位产生的进位信号则十位加(减)1if (s1='1')thenif(second="1001")thensecond<="0000";elsesecond<=second+1;end if;else if(s2='1')thenif(second="0000")thensecond<="1001";elsesecond<=second-1;end if;end if;end if;end if;end process;------------------------------------------------------------------------------------------------------------------------------------------------*****闪动数码管的计数***--------------------------------------- process(cnt(23),rst,s1,s2)beginif(rst='0')thencoud<="0000";else if(cnt(23)'event and cnt(23)='1')then ----每隔(1/50)*46=0.92s计数一次if(s1='1')thenif(coud="0101")thencoud<="0000";elsecoud<=coud+1;end if;else if(s2='1')thenif(coud="0000")thencoud<="0101";elsecoud<=coud-1;end if;end if;end if;end if;end if;end process;--------------------------------------------------------------------------------------------------------------------------***码变换****---------------------------------------------process(coud,rst)begincase coud iswhen"0000" => coud1<="1010";coud2<="1010";when"0001" => coud1<="1011";coud2<="1111";when"0010" => coud1<="1100";coud2<="1110";when"0011" => coud1<="1101";coud2<="1101";when"0100" => coud1<="1110";coud2<="1100";when"0101" => coud1<="1111";coud2<="1011";when others => coud1<="0000";coud2<="0000";end case;end process;--------------------------------------------------------------------------------------------****************显示部分***************--process(rst,s1,s2,s3,cnt(17 downto 16),cnt(25 downto 23))beginif(rst='0')thencom8_xhdl<="11110000";led8_xhdl <= "00000000";else if s1='1'or s2='1'then ----计数以及数码管闪动部分的扫描case cnt(17 downto 16) iswhen"10" => com8_xhdl<="11111110";data<=first;when"01" => com8_xhdl<="11111101";data<=second;when"00" => com8_xhdl<="01111111";data<=coud1;when"11" => com8_xhdl<="10111111";data<=coud2;end case;case data isWHEN "0000" =>led8_xhdl <= "00111111"; --0WHEN "0001" =>led8_xhdl <= "00000110"; --1WHEN "0010" =>led8_xhdl <= "01011011"; --2WHEN "0011" =>led8_xhdl <= "01001111"; --3WHEN "0100" =>led8_xhdl <= "01100110"; --4WHEN "0101" =>led8_xhdl <= "01101101"; --5WHEN "0110" =>led8_xhdl <= "01111101"; --6WHEN "0111" =>led8_xhdl <= "00000111"; --7WHEN "1000" =>led8_xhdl <= "01111111"; --8WHEN "1001" =>led8_xhdl <= "01101111"; --9WHEN "1010" =>led8_xhdl <= "00000001";WHEN "1011" =>led8_xhdl <= "00000010";WHEN "1100" =>led8_xhdl <= "00000100";WHEN "1101" =>led8_xhdl <= "00001000";WHEN "1110" =>led8_xhdl <= "00010000";WHEN "1111" =>led8_xhdl <= "00100000";WHEN OTHERS =>led8_xhdl <= "00000011";END CASE;else if s3='1'then ----8个LED灯闪动的扫描,闪动周期为0.92s-1s case cnt(25 downto 23) iswhen"000" => com8_xhdl<="11111110";led8_xhdl<="10000000" ;when"001" => com8_xhdl<="11111101";led8_xhdl<="10000000" ;when"010" => com8_xhdl<="11111011";led8_xhdl<="10000000" ;when"011" => com8_xhdl<="11110111";led8_xhdl<="10000000" ;when"100" => com8_xhdl<="11101111";led8_xhdl<="10000000" ;when"101" => com8_xhdl<="11011111";led8_xhdl<="10000000" ;when"110" => com8_xhdl<="10111111";led8_xhdl<="10000000" ;when"111" => com8_xhdl<="01111111";led8_xhdl<="10000000" ;end case;end if;end if;end if;end process;end arch;。
EDA技术及应用-实验5-4位加法计数器
实验五4位加法计数器
一、实验目的
1.掌握时钟信号、进程和BUFFER端口的运用;
2.了解计数器的设计、仿真和硬件测试,进一步熟悉VHDL语句、语法及应用等。
二、实验内容
运用Quartus II 集成环境下的VHDL文本设计方法设计4位加法计数器,进行波形仿真和分析、引脚分配并下载到实验设备上进行功能测试。
三、实验步骤及参考程序
参考程序如下:
entity CNT4 is
port( clk:in bit;
q:buffer integer range 15 downto 0);
end;
architecture bhv of CNT4 is
begin
process(clk)
begin
if clk'event and clk='1' then
q<=q+1;
end if;
end process;
end bhv;
四、实验扩展及思考
1.分析程序中各语句的功能和特点;
2.比较各种端口类型以及如何应用;
3.试设计一个含异步清0和同步时钟使能的4位加法计数器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6、编写一个4位加法计数器VHDL源程序,要求:复位信号reset低电平清零,变高后在clk上升沿开始工作,输入时钟信号为clk,输出为q。
(以十二进制为例)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY counter ISPORT(clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY priorityencoderARCHITECTURE rtl OF counter ISSIGNAL count: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINq<=cout;PROCESS(clk,reset)ISBEGINIF(reset=’0’)THENcout<="0000";ELSIF(clk’EVENT AND clk=’1’)THENIF(cout="1011")THENcout<="0000"ELSEcout<=cout+’1’;END IF;END IF;END PROCESS;END ARCHITECTURE rtl;4位二进制并行加法器的源程序ADDER4B.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER4B IS --4位二进制并行加法器PORT(CIN:IN STD_LOGIC;--低位进位A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--4位加数B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--4位被加数S:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--4位和CONT:OUT STD_LOGIC);END ADDER4B;ARCHITECTURE ART 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位,为进位提供空间SINT<=AA+BB+CIN ;S<=SINT(3 DOWNTO 0);CONT<=SINT(4);END ART;8位二进制加法器的源程序ADDER8B.VHDLIBRARY IEEE;USE IEEE_STD.LOGIC_1164.ALL;USE IEEE_STD.LOGIC_UNSIGNED.ALL:ENTITY ADDER8B IS--由4位二进制并行加法器级联而成的8位二进制加法器PORT(CIN: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);COUT:OUT STD_LOGIC);END ADDER8B;ARCHICTURE ART OF ADDER8B ISCOMPONENET ADDER4B--对要调用的元件ADDER4B的界面端口进行定义PORT(CIN:IN STD_LOGIC;A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);S:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CONT:OUT STD_LOGIC);END COMPONENT ;SIGNAL CARRY_OUT:STD_LOGIC;--4位加法器的进位标志BEGINU1:ADDER4B --例化(安装)一个4位二进制加法器U1PORT MAP(CIN=>CIN,A=>A(3 DOWNTO 0),B=>B(3DOWNTO0),S=>S(3 DOWNTO 0),COUT=>CARRY_OUT);U2:ADDER4B --例化(安装)一个4位二进制加法器U2PORT MAP(CIN=>CARRY_OUT,A=>A(7 DOWNTO 4),B=>B(7 DOWNTO 4),S=>S (7 DOWNTO 4);CONT=>CONT);END ART;六进制计数器的源程序CNT6.VHD(十进制计数器的源程序CNT10.VHD与此类似)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT6 ISPORT (CLK:IN STD_LOGIC;CLR:IN STD_LOGIC;ENA:IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CARRY_OUT:OUT STD_LOGIC );END CNT6;ARCHITECTURE ART OF CNT6 ISSIGNAL CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK,CLR,ENA)BEGINIF CLR='1' THEN CQI<="0000";ELSIF CLK'EVENT AND CLK='1' THENIF ENA='1' THENIF CQI=“0101” THEN CQI<=“0000”;ELSE CQI<=CQI+'1';END IF;END IF;END IF;END PROCESS;PROCESS(CQI)BEGINIF CQI=“0000” THEN CARRY_OUT<='1';ELSE CARRY_OUT<='0';END IF;END PROCESS;CQ<=CQI;END ART;十进制计数器LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;ENTITY count10 ISPORT(clk: IN STD_LOGIC;seg: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END count10;ARCHITECTURE a1 OF count10 ISsignal sec: STD_LOGIC; signal q : STD_LOGIC_VECTOR(21 DOWNTO 0);signal num: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINprocess(clk) ----get 1 hz clock pulsebeginif clk'event and clk='1' then q<=q+1; end if;sec<=q(21); --get 1 hz clock pulseend process;timing: process(sec) beginif sec'event and sec='1' thenif num<9 then num<=num+1; else num<="0000"; end if;end if;end process;B1: block --bcd-7segsBegin --gfedcbaseg<= "0111111" when num=0 else"0000110" when num=1 else"1011011" when num=2 else"1001111" when num=3 else"1100110" when num=4 else"1101101" when num=5 else"1111101" when num=6 else"0000111" when num=7 else"1111111" when num=8 else"1101111" when num=9 else"0000000";end block;END a1;四位全加器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity add isport(a,b:in std_logic_vector(3 downto 0);cin:in std_logic;s:out std_logic_vector(3 downto 0);cout:out std_logic);end add;architecture beh of add isbeginprocess(a,b,cin)ariable x:std_logic_vector(3 downto 0);variable m,n,l:integer;beginm:=conv_integer(a);n:=conv_integer(b);l:=m+n+conv_integer(cin);x:=conv_std_logic_vector(l,4);s<=x(3 downto 0);cout<=x(3);end process;end beh;10位计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 ISPORT ( CLK ,clr : IN STD_LOGIC ;CQ : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 ));END ENTITY CNT10;ARCHITECTURE ONE OF CNT10 ISBEGINPROCESS ( CLK , clr )V ARIABLE LCQ : STD_LOGIC_VECTOR ( 3 DOWNTO 0 ); BEGINIF RST = …1‟ THEN LCQ := “0000”;ELSIF CLK‟EVENT AND CLK = …1‟ THENIF LCQ < 9 THEN LCQ := LCQ + 1;ELSE LCQ := “0000” ;END IF; END IF;CQ <= LCQ ;END PROCESS;END ARCHITECTURE ONE;八位串行二进制全加器use ieee.std_logic_1164.all;entity product_adder_subtracter isport(a,b:in std_logic_vector(7 downto 0);s:out std_logic_vector(8 downto 0));end;architecture behavioral of product_adder_subtracter isbeginbehavior:process(a,b) isvariable carry_in:std_logic;variable carry_out:std_logic;variable op2:std_logic_vector(b'range);beginop2:=b;end if;for index in 0 to 7 loopcarry_in:=carry_out;s(index)<=a(index) xor op2(index)xor carry_in ;carry_out:=(a(index)and op2(index))or(carry_in and (a(index) xor op2(index)));end loop;s(8)<=a(7) xor op2(7) xor carry_out;end process;end;8、根据已给出全加器VHDL程序,试写出一个四位逐位进位加法器的VHDL源程序。