实验五 含异步清零和同步使能4位加法计数器的VHDL设计
EDA-设计含异步清零和同步时钟使能的加法计数器
专业班级:学号:姓名:EDA 技术实验报告实验项目名称:设计含异步清零和同步时钟使能的加法计数器实验日期:2012.6.5 实验成绩:实验评定标准:一、实验目的学习计数器的设计,仿真和硬件测试,进一步熟悉VHDL设计技术。
二、实验器材Quartus2软件、电脑一台三、实验内容(实验过程)<一> 实验内容一:在quartus 2上对例5进行编辑、编译、综合、适配、仿真。
说明例中各语句的作用,详细描述各事例的功能特点,给出其所有信号的时序仿真模型。
<二> 实验内容二:自己选择合适的电路模式,然后进行引脚锁定以及硬件下载测试,引脚锁定后进行编译、下载、硬件测试实验。
将实验过程和实验结果写进实验报告。
<三> 详细内容如下:1.进行文本编辑2.编译,综合,仿真四、实验程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity cnt10 isport ( clk,rst,en: in std_logic ;cq: out std_logic_vector(3 downto 0); cout:out std_logic);end cnt10;architecture behav of cnt10 isbeginprocess(clk,rst,en)variable cqi:std_logic_vector(3 downto 0); beginif rst='1' then cqi:=(others =>'0');elsif clk'event and clk='1' thenif en='1' thenif cqi<9 then cqi :=cqi+1;else cqi:=(others =>'0');end if;end if;end if;if cqi=9 then cout<='1';else cout<='0';end if;cq<=cqi;end process;end behav;五、实验仿真、结果及分析:<一>实验仿真:<二> 结果和分析:当rst清零端为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。
设计含异步使能清0和同步时钟使能的加法计数器
综合课程设计实验设计含异步使能清0和同步时钟使能的加法计数器1.实验目的1.计数器的设计2.QUARTUS 2中SIGNALTAP 2实时测试技术3.FPGA配置芯片的使用4.继续熟悉实验的软硬件平台2.实验步骤与结果1.设计含异步使能清0和同步时钟使能的加法计数器源代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 ISPORT(CLK,RST,EN:IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT: OUT STD_LOGIC);END CNT10;ARCHITECTURE BEHAV OF CNT10 ISBEGINPROCESS(CLK,RST,EN )VARIABLE CQI :STD:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF RST=’1’ THEN CQI:=(OTHERS=>’0’); --复位信号ELSIF CLK’EVENT AND CLK=’1’ THENIF EN=’1’ THEN --使能信号IF CQI<9 THEN CQI:=CQI+1;ELSE CQI:=(O THERS=>’0’);END IF;END IF;IF CQI=9 THEN COUT<=’1’; --进位ELSE COUT<=’0’;END IF;CQ<=CQI;END PROCESS;END BEHAV;实验结果:键2低电平时允许计数,键1高电平时允许计数,数码管最后一位正确计数0到9,当有进位时,发光管D1显示进位信号。
2.使用嵌入式逻辑分析仪SIGNALTAP2 进行实时测试按如图设置SIGNALTAP 2获得实验波形:可以看到CQ的波形为锯齿状的3.将计数器设计文件烧到实验板上FPGA的配置器件EPCS1中,实现掉电保护实验结果:掉电重启以后实验板上程序的功能正常。
含异步清规和同步使能的加法计数器
实验三含异步清零和同步使能的加法计数器一、实验目的1、了解二进制计数器的工作原理。
2、进一步熟悉QUARTUSII软件的使用方法和VHDL输入。
3、时钟在编程过程中的作用。
二、实验原理二进制计数器中应用最多、功能最全的计数器之一,含异步清零和同步使能的加法计数器的具体工作过程如下:在时钟上升沿的情况下,检测使能端是否允许计数,如果允许计数(定义使能端高电平有效)则开始计数,否则一直检测使能端信号。
在计数过程中再检测复位信号是否有效(低电平有效),当复位信号起作用时,使计数值清零,继续进行检测和计数。
其工作时序如图3-1所示:图3-1 计数器的工作时序三、实验内容本实验要求完成的任务是在时钟信号的作用下,通过使能端和复位信号来完成加法计数器的计数。
实验中时钟信号使用数字时钟源模块的1HZ信号,用一位拨动开关K1表示使能端信号,用复位开关S1表示复位信号,用LED模块的LED1~LED11来表示计数的二进制结果。
实验LED亮表示对应的位为‘1’,LED灭表示对应的位为‘0’。
通过输入不同的值模拟计数器的工作时序,观察计数的结果。
实验箱中的拨动开关、与FPGA的接口电路,LED灯与FPGA的接口电路以及拨动开关、LED与FPGA的管脚连接在实验一中都做了详细说明,这里不在赘述。
数字时钟信号模块的电路原理如图3-2所示,表3-1是其时钟输出与FPGA的管脚连接表。
图3-2 数字时钟信号模块电路原理表3-1 数字时钟输出与FPGA的管脚连接表按键开关模块的电路原理如图3-3所示,表3-2是按键开关的输出与FPGA的管脚连接表。
图3-3 按键开关模块电路原理信号名称FPGA I/O名称核心板接口管脚号功能说明S[0] Pin_AF5 JP1_91 ‘S1’SwitchS[1]Pin_AH6 JP1_93 ‘S2’SwitchS[2]Pin_AH7 JP1_95 ‘S3’SwitchS[3]Pin_AH8 JP1_97 ‘S4’SwitchS[4]Pin_AG10 JP1_99 ‘S5’SwitchS[5]Pin_AG11 JP1_101 ‘S6’SwitchS[6]Pin_AH14 JP1_90 ‘S7’SwitchS[7] Pin_AG7 JP1_92 ‘S8’SwitchS[8]Pin_AG8 JP1_94 ‘S9’SwitchS[9]Pin_AF9 JP1_96 ‘S10’SwitchS[10]Pin_AH10 JP1_98 ‘S11’SwitchS[11] Pin_AH11 JP1_100 ‘S12’Switch表3-2 按键开关与FPGA的管脚连接表四、实验步骤1、打开QUARTUSII软件,新建一个工程。
含异步清0和同步时钟使能的4位加法计数器 EDA技术与Verilog HDL实验报告
含异步清0和同步时钟使能的4位加法计数器一.实验目的熟悉在QuartusII下设计含异步清0和同步时钟使能的4位加法计数器。
二.实验内容在QuartusII下设计含异步清0和同步时钟使能的4位加法计数器,并编译、仿真验证其功能。
三.程序清单计数器顶层文件设计:10进制计数器文本输入:module CNT10(clk,rst,en,load,cout,dout,data);input clk,en,rst,load;input [3:0] data;output[3:0] dout;output cout;reg [3:0] q1;reg cout;assign dout = q1;always @(posedge clk or negedge rst)beginif (!rst) q1<=0;else if(en)beginif (!load) q1<=data;else if(q1<9) q1<=q1+1;else q1<=4'b0000;endendalways @(q1)if (q1==4'h9) cout= 1'b1;else cout= 1'b0;endmodule60位计数器文本输入:module CNT60(CLK,EN,RST,LOAD,COUT1,COUT2,DOUT1,DOUT2,DATA);input CLK,EN,RST,LOAD;input [3:0] DATA;output[3:0] DOUT1;output[2:0] DOUT2;output COUT1;output COUT2;reg [3:0] Q1;reg [2:0] Q2;reg COUT1;reg COUT2;assign DOUT1 = Q1;assign DOUT2 = Q2;always @(negedge CLK or negedge RST) beginif(!RST) Q1<=0;else if (EN) beginif (!LOAD) Q1<=DATA;else if (Q1<9) Q1<=Q1+1;else Q1<=4'b0000;endendalways @(Q1)if (Q1==4'h9) COUT1=1'b1;elseCOUT1=1'b0;always @(negedge COUT1 or negedge RST)beginif(!RST) Q2<=0;else if (EN) beginif (!LOAD) Q2<=DATA;else if (Q2<5) Q2<=Q2+1;else Q2<=4'b0000;endendalways @(Q2)if ((Q1==4'h9)&&(Q2==3'h5)) COUT2=1'b1;elseCOUT2=1'b0;endmodule60位计数器图形输入:四.实验步骤1、新建一个名称为CNT10的工程,并在该文件夹中新建一个CNT10.v的文件。
4位加法计数器的VHDL描述
0
十进制整数
35
十进制整数
10E3
十进制整数
16#D9#
十六进制整数
8#720#
八进制整数
2#11010010# 二进制整数
1.3 4位加法计数器的另一种表达方式
【例5-2】 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY CNT4 IS PORT ( CLK : IN STD_LOGIC ; Q : OUT STD_LOGIC_VECTOR(3 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;
4位加法计数器的VHDL描述
1.2 整数、自然数和正整数数据类型
整数常量的书写方式示例如下:
1
十进制整数
1.3 4位加法计数器的另一种表达方式 4位加法计数器由两大部分组成:
图5-1 4位加法计数器RTL电路
4位加法计数器的VHDL描述
1.3 4位加法计数器的另一种表达方式
图5-2 4位加法计数器工作时序
4位加法计数器的VHDL描述
1.3 4位加法计数器的另一种表达方式
数据类型: 整数类型INTEGER、自然数类型、正整数类型POSITIVE。
EDA技术实用教程
4位加法计数器的VHDL描述
1.1 4位加法计数器
含异步清零和同步时钟使能的4位加法器
含异步清零和同步时钟使能的4位加法器宁波⼯程学院电信学院EDA系统设计与实践实验报告实验名称含异步清零和同步时钟使能的4位加法器班级电科(系统设计)08-2 姓名学号 0840*******组员姓名实验⽇期2011-5-12指导⽼师实验四含异步清零和同步时钟使能的4位加法器⼀.实验⽬的学习计数器的设计,仿真和硬件测试。
进⼀步熟悉VHDL的编程⽅法。
⼆.实验内容本实验的内容是Quartus 11建⽴⼀个含计数使能、异步复位的4位加分计数器,SmartSOPC试验箱上进⾏硬件测试,由KEY1控制技术使能端ena并由LED指⽰,KEY2控制复位端rst并由LED2指⽰。
计数值由数码管指⽰。
三.实验原理Rst是异步清零信号,⾼电平有效。
Ema为是能端,能开始与暂停程序,当ena为0时,能所存信号。
四.实验步骤(1)破解Quartus 11;(2)建⽴⼯程:启动Quartus 11,建⽴空⽩⼯程。
命名为giui;(3)创建源程序⽂件:新建VHDL源程序⽂件giui,输⼊程序代码并保存,进⾏编译,若在编译过程中发现错误,则找出并更正,直⾄编译成功。
(4)编译并运⾏:编译并运⾏程序或者原理图,编译⽆误后,进⾏引脚锁定;(5)外部连接⽅式跟第2节相似。
五.实验程序⼀.在⼀个数码管上显⽰0~Flibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity giui isport(clk48:in std_logic;key_2bit:in std_logic;dig_4bit:out std_logic_vector(3 downto 0);seg:out std_logic_vector(7 downto 0));end giui;architecture m1 of giui issignal num1:std_logic_vector(3 downto 0);signal cnt:std_logic_vector(23 downto 0);signal t: std_logic;signal q:std_logic;beginfre:process(clk48,cnt)beginif clk48'event and clk48='1' thencnt<=cnt+1;end if;q<=cnt(23);end process fre;coun:process(q)beginif q'event and q='1' thenif t='1' then num1<="0000";elsenum1<=num1+1;end if;end if;end process;SEG<= "11000000" when num1="0000" else "11111001" when num1="0001" else "10100100" when num1="0010" else"10110000" when num1="0011" else"10011001" when num1="0100" else"10010010" when num1="0101" else"10000010" when num1="0110" else"11111000" when num1="0111" else"10000000" when num1="1000" else"10010000" when num1="1001" else"10001000" when num1="1010" else"10000011" when num1="1011" else"01000110" when num1="1100" else"10100001" when num1="1101" else"10000110" when num1="1110" else"11111111";dig_4bit<="1110" when t='1' else"1111" when t='0';end m1;⼆.4位加法器Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sun_adder isport(clk:in std_logic;key:in std_logic;led1:out std_logic;dig:out std_logic_vector(3 downto 0);seg:out std_logic_vector(7 downto 0)); end sun_adder;architecture a of sun_adder issignal tmp:std_logic_vector(23 downto 0); signal tmp1:std_logic_vector(10 downto 0); signal address,pp:std_logic_vector(3 downto 0); signal p:std_logic_vector(1 downto 0);signal tt,t,q,q1: std_logic;signal num1,num2,num3,num4:std_logic_vector(3 downto 0);beginprocess(clk)beginif clk'event and clk='1' then tmp<=tmp+1;tmp1<=tmp1+1;end if;end process;q<=tmp(23);q1<=tmp1(10);process(q1)beginif q1'event and q1='1' then case p iswhen "00"=>pp<="1110";when "01"=>pp<="1101";when "10"=>pp<="1011";when others=>pp<="0111";end case;dig<=pp;case pp iswhen "1110"=>address<=num1;when "1101"=>address<=num2;when "1011"=>address<=num3;when others=>address<=num4;end case;p<=p+1;end if;end process;process(key)beginIf key'event and key='1' thent<= not t;end if;end process;process(q)beginif q'event and q='1' thenif t='1' then num1<="0000";num2<="0000";num3<="0000";num4<="0000";else num1<=num1+1;if num1="1001" then num1<="0000";tt<='1';if num2="1001" then num2<="0000";if num3="1001" then num3<="0000";if num4="1001" then num4<="0000";else num4<=num4+1; end if;else num3<=num3+1; end if;else num2<=num2+1; `1212212345123451233123`12341234123412341312end if; else num1<=num1+1;tt<='0'; end if; end if;end if;end process;seg<= "11000000" when address="0000" else"11111001" when address="0001" else"10100100" when address="0010" else"10110000" when address="0011" else"10011001" when address="0100" else"10010010" when address="0101" else"10000010" when address="0110" else "11111000" when address="0111" else "10000000" when address="1000" else "10010000" when address="1001" else "11111111";led1<='0' when tt='1' else'1' when tt='0';end a;六.实验现象。
VHDL4位计数器的设计
*******bcd译码器******library ieee;use ieee.std_logic_1164.all;entity decoder isport(bcd: in std_logic_vector(3 downto 0);y: out std_logic_vector(7 downto 0));end entity;architecture rtl of decoder isbeginprocess (bcd)begincase bcd iswhen "0000" => y<="11000000"; --0: h g f e d c b a when "0001" => y<="11111001"; --1when "0010" => y<="10100100"; --2when "0011" => y<="10110000"; --3when "0100" => y<="10011001"; --4when "0101" => y<="10010010"; --5when "0110" => y<="10000010"; --6when "0111" => y<="11111000"; --7when "1000" => y<="10000000"; --8when "1001" => y<="10010000"; --9when others => y<="11111111";end case;end process;end rtl;***********多路选择控制************library ieee;use ieee.std_logic_1164.all;entity mux isport (input_a:in std_logic_vector(3 downto 0); input_b:in std_logic_vector(3 downto 0);input_c:in std_logic_vector(3 downto 0);input_d:in std_logic_vector(3 downto 0);sel:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end entity mux;architecture rtl of mux isbeginprocess(sel)isbeginif(sel="00")theny<=input_a;elsif(sel="01")theny<=input_b;elsif(sel="10")theny<=input_c;elsey<=input_d;end if;end process;end rtl;************分频************library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clk4ms isport (clk:in std_logic;y:buffer std_logic);end entity clk4ms ;architecture rtl of clk4ms issignal a:STD_LOGIC_VECTOR(17 DOWNTO 0); beginprocess(clk)isbeginif(clk'event and clk='1')thenif(a="10111011100000000") thena<="000000000000000000";y<=not y;elsea<=a+'1';end if;end if;end process;end rtl;************计数器************library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt isport (clk,clr,en:in std_logic;a:out std_logic_vector(3 downto 0);b:out std_logic_vector(3 downto 0);c:out std_logic_vector(3 downto 0);d:out std_logic_vector(3 downto 0));end entity cnt ;architecture rtl of cnt issignal dout_0,dout_10,dout_100,dout_1000:std_logic_vector(3 downto 0); beginprocess(clr,clk,en)isbegina<=dout_0;b<=dout_10;c<=dout_100;d<=dout_1000;if clr='1' thendout_0<="0000";dout_10<="0000";dout_100<="0000";dout_1000<="0000";elsif(en='1')thenif(clk'event and clk='1')thenif(dout_0="1001")then ---计数dout_0<="0000";elsedout_0<=dout_0+'1';end if;elsif(clk'event and clk='1' and dout_0="1001")thenif(dout_10="1001") then ---计数dout_10<="0000";elsedout_10<=dout_10+'1';end if;elsif(clk'event and clk='1' and dout_0="1001" and dout_10="1001")thenif(dout_100="1001") then ---计数dout_100<="0000";elsedout_100<=dout_100+'1';end if;elsif(clk'event and clk='1' and dout_0="1001" and dout_10="1001" and dout_100="1001")thenif(dout_1000="1001") then ---计数dout_1000<="0000";elsedout_1000<=dout_1000+'1';end if;end if;end if;end process;end rtl;************位选************LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY wei ISPORT(clk4ms:IN STD_LOGIC;q:BUFFER STD_LOGIC_VECTOR(1 DOWNTO 0);d:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY wei;ARCHITECTURE rtl OF wei ISBEGINPROCESS(clk4ms) ISBEGINIF(clk4ms 'EVENT AND clk4ms='1') THEN IF(q="11") THENq<="00";ELSEq<=q+'1';END IF;IF(q="00") THENd<="1000";ELSIF(q="01") THENd<="0100";ELSIF(q="10") THENd<="0010";ELSEd<="0001";END IF;END IF;END PROCESS;END ARCHITECTURE rtl;**********总程序*********LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY ZONG ISPORT( clr :IN STD_LOGIC;clk :IN STD_LOGIC;CLK4M:IN STD_LOGIC;en:IN STD_LOGIC;Y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ZONG ;ARCHITECTURE a OF ZONG ISCOMPONENT cnt isport (clk,clr,en:in std_logic;a:out std_logic_vector(3 downto 0);b:out std_logic_vector(3 downto 0);c:out std_logic_vector(3 downto 0);d:out std_logic_vector(3 downto 0));END COMPONENT;COMPONENT MUX isport (input_a:in std_logic_vector(3 downto 0); input_b:in std_logic_vector(3 downto 0);input_c:in std_logic_vector(3 downto 0);input_d:in std_logic_vector(3 downto 0);sel:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end COMPONENT;COMPONENT DECODER isport(bcd:in std_logic_vector(3 downto 0);y: out std_logic_vector(7 downto 0));end COMPONENT;COMPONENT WEI isport(clk4ms:in std_logic;d:out std_logic_vector(3 downto 0));end COMPONENT;COMPONENT CLK4MS isport(clk:in std_logic;y:out std_logic);end COMPONENT;SIGNAL aa,bb,cc,dd:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL mm:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL ss:STD_LOGIC;signal ww:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINu1 : cnt PORT MAP(clk,clr,en,aa,bb,cc,dd);u2 : mux PORT MAP(aa,bb,cc,dd,ww,mm);u3 :decoder PORT MAP(mm,y);u4 : wei PORT MAP(ss,ww,dig);u5 : clk4ms PORT MAP(clk4m,ss);END a;。
VHDL四位加法器实验报告
硬件描述语言实验:四位加法器实验实验人姓名:王昭学号: 2010482062实验地点: B3-216 实验三:-- Quartus II VHDL Template-- Basic Shift Registerlibrary ieee;use ieee.std_logic_1164.all;entity adder4 isport(a ,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 entity;architecture rtl of adder4 issignal c0,c1,c2 : std_logic;begins(0) <= a (0) xor b(0) xor ci;c0<= (a(0) and b(0)) or (a(0) and ci) or (b(0) and ci);s(1)<=a(1) xor b(1) xor c0;c1<=(a(1) and b(1)) or (a(1) and c0) or (b(1) and c0);s(2)<=a(2) xor b(2) xor c1;c2<= (a(2) and b(2)) or (a(2) and c1) or (b(2) and c1);s(3)<=a(3) xor b(3) xor c2;co<= (a(3) and b(3)) or (a(3) and c2) or (b(3) and c2);end rtl;实验原理:a和b为两个四位的数,定义三个信号量,c0,c1,c2;低位进位si=0;s(0)=a(0)+b(0)+si;进位为c0;s(1)=a(1)+b(1)+c0;进位为c1;s(2)=a(2)+b(2)+c1;进位为c2;s(3)=a(3)+b(3)+c2;进位为co;低位进位si都为0;如果a+b的值大于15时,则co为1,s=a+b-16;如果不是大于15,则相加时则s=a+b的值,co=0;经仿真可以验证此四位加法器正确。
VHDL语言完成4位十进制计数器、4位锁存器、测频控制器的设计
电子设计自动化实验实验名称综合性实验二、硬件描述语言的层次化设计实验设备(1)EDA实验箱(型号 ),(2)计算机,(3)EDA软件(QuartusII)实验目的1、熟悉EDA软件(QuartusII)的硬件描述语言输入设计方法;2、掌握VHDL语言的层次化设计方法和仿真分析方法;3、了解功能仿真、时序仿真和时序参数分析的意义。
实验内容1、用VHDL语言完成4位十进制计数器、4位锁存器、测频控制器的设计,包括编译、综合、仿真;**2、采用层次化设计的方法,用VHDL语言的元件例化语句写出4位十进制频率计的顶层文件,并分别给出其测频功能和时序仿真分析波形图,并加以分析;**3、用EDA实验箱进行硬件验证,并分析测量结果;建议硬件测试实验电路采用电路结构,待测信号F_IN接clock0;测频控制时钟CLK接clock2;**4、在2基础上将其扩展为8位十进制频率计,或带译码输出的4位十进制频率计。
实验报告要求根据以上实验内容写出实验报告:1、简述4位频率计模块的工作原理及其设计、编译、仿真分析过程;2、给出模块设计文件、仿真测试文件、仿真结果波形图及其分析报告;3、简述硬件验证过程和验证结果。
1、简述4位频率计模块的工作原理根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期作准备的计数器清0信号。
这3个信号可以由一个测频控制信号发生器产生,即TESTCTL,它的设计要求是,TESTCTL的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。
当CNT_EN高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要产生一个锁存信号LOAD,在该信号上升沿时,将计数器在前1秒钟的计数值锁存进各锁存器REG4B中,并由外部的7段译码器译出,显示计数值。
设计含异步清零和同步时钟使能的加法计数器
附表1:广州大学学生实验报告开课学院及实验室:物理与电子工程学院-电子楼317室2016年 4 月21 日学院物电年级、专业、班姓名Jason.P 学号实验课程名称EDA技术实验成绩实验项目名称设计含异步清零和同步时钟使能的加法计数器指导教师一、实验目的:学习计数器的设计、仿真和硬件测试,进一步熟悉VerilogHDL设计技术。
二、实验内容:含异步清0和同步时钟使能的4位加法器(1)实验原理:上图是一含计数使能、异步复位的4位加法计数器,书中例3-15是其VerilogHDL描述。
由图2-1所示,图中间是4位锁存器;rst是异步清信号,高电平有效;clk是锁存信号;D[3:0]是4位数据输入端。
当ENA为‘1’时,多路选择器将加1器的输出值加载于锁存器的数据端;当ENA为‘0’时保持上一次的输出。
(2)实验步骤:(2)-1按照发给大家的文件“Quartus II 9.0基本设计流程-VerilogHDL.ppt”所讲述的步骤,在QuartusII上对例3-15(第四版)(第五版p124例5-15)进行编辑、编译、综合、适配、仿真。
说明例2-1各语句的作用,详细描述示例的功能特点,给出其所有信号的时序仿真波形。
(2)-2引脚锁定以及硬件下载测试:若目标器件是EP3C40Q240C8N,建议选实验电路模式5,用键8(PIO7)控制RST;用键7控制ENA;计数溢出COUT接发光管D8;OUTY是计数输出接数码1;时钟CLK接clock2,通过跳线选择4Hz信号。
引脚锁定后进行编译、下载和硬件测试实验。
将实验过程和实验结果写进实验报告。
三、实验HDL描述:module CNT10(CLK,RST,EN,LOAD,COUT,DOUT,DATA)input CLK,EN,RST,LOAD; //定义输入信号input[3:0] DATA; //定义4位的并行加载数据DATAoutput[3:0] DOUT; //定义4位的计数输出数据DOUToutput COUT; //定义进位输出信号COUTreg[3:0] Q1; //定义4位的寄存器型中间变量Q1reg COUT;assign DOUT = Q1; //将内部寄存器的计数结果输出至DOUTalways @(posedge CLK or negedge RST) //时序过程beginif(!RST) Q1 <= 0; //RST=0时,对内部寄存器单元异步清0else if(EN)begin //同步使能EN=1,则允许加载或计数if(!LOAD) Q1 <= DATA; //当LOAD=0,向内部寄存器加载数据else if(Q1<9) Q1 <=Q1+1; //当Q1小于9时,允许累加else Q1 <=4'b0000; //否则一个时钟后清零返回初值endendalways @(Q1) //组合过程if (Q1==4'h9) COUT = 1'b1;else COUT = 1'b0;endmodule四、仿真结果:图1图2由图1的时序波形可见,当EN=0时,DOUT的输出数据3保持了一段时间;当EN=1,且在时钟CLK的上升沿时间范围LOAD=0时,4位输入数据DATA=0被加载,在LOAD=1后作为计数器的计数初值(图1);当EN=1,LOAD=1时,输入的数据不被加载;RST在任意时刻均有效,即使CLK非上升沿时,计数也能即刻清0(图2:计数到3后清0);当计数到9时,COUT输出进位1,如图2所示。
实验五 四位二进制加法计数器VHDL设计
实验五四位二进制加法计数器VHDL设计一、实验目的:进一步掌握引脚锁定、硬件下载及芯片测试方法。
掌握开发板的使用。
二、实验仪器:PC机,FPGA开发板,万用表,接线若干。
三、实验内容:1、设计内容如下两张图所示:2、注意开关如处在常态,输出值为‘1’;按下开关的输出值为‘0’。
完成上面的设计,并下载观察实验现象。
开关有抖动吗?3、将20MHz 的输入频率,分频后作为计数器的时钟。
设计电路,并下载观察实验现象。
4、管脚锁定及下载的方法如5~9。
5、选定器件。
点击QuartusII菜单Assignments下的“Device”,出现选择器件系列及器件型号选择窗口。
按照实验中所给的器件型号选择器件系列及器件型号。
(请按照开发板上实际的芯片选择芯片系列,以及芯片型号)选好器件后,重新全程编译。
6、查找管脚号。
观察开发板和外围电路。
确认电路的连接方法。
观察CLK 的管脚号,并记录。
确定数码管所接的端口,记录管脚号。
7、锁定管脚。
选择菜单Assignments下的Pins出现下图。
在Location下选择对应管脚的管脚号。
将CLK锁定在开发板规定的管脚号上。
将输出端锁定在所选定的管脚号上。
所有的引脚锁定后,再次全程编译。
8、在菜单菜单Tools下选择programmer打开编程窗口,观察箭头所指的信息。
如果显示“No Hardware”,点击左边的“Hardware Setup”,双击USB-Blaster。
如下图所示。
点击“Close”,关闭上面的窗口。
此时QUARTUSII的窗口应该为:选中Program/Configure下方的框(出现勾)。
点击左边的“Start”,开始下载。
当显示100%时,下载成功。
9、硬件测试。
观察实验现象。
适当进行操作,实验现象又是什么?四、实验报告要求:1.写出你实验时的芯片系列及芯片型号2.实验箱连接在PC机的什么口上?3.简要说明实验过程中遇到的问题,及解决方法。
含异步清0和同步时钟使能的4-位加法计数器-报告
含异步清0和同步时钟使能的4-位加法计数器-报告-CAL-FENGHAI.-(YICAI)-Company One1EDA设计课程实验报告实验题目:含异步清0和同步时钟使能的4 位加法计数器学院名称:专业:班级:姓名:高胜学号小组成员:指导教师:一、实验目的学习计数器的设计,仿真和硬件测试,进一步熟悉VHDL 的编程方法。
二、设计任务及要求1.设计总体要求:利用Quartus II建立一个含技术使能、异步复位的4位加法计数器,在SmartSOPC试验箱上进行硬件测试,由KEY1控制技术使能端ena并由LED1指示,KEY2控制复位端rst 并由LED2指示。
计数值由数码管指示。
2.设计基本要求:(1)进行正常的加法计数功能。
(2)由四个数码管显示其计数情况。
三、系统设计1、整体设计方案含异步清零与同步时钟使能计数器由译码显示电路、脉冲发生电路和16进制计数器这3个基本电路组成的。
此次设计要实现的功能有:正常的计数,异步清零,同步使能功能。
整体设计系统框图如图1所示:图1 含异步清零与同步时钟使能计数器系统结构图2、功能模块电路设计(1)各模块设计:译码显示电路模块框图(见图2):图2 译码显示电路系统输入输出模块框图脉冲发生电路模块框图(见图3):图3 秒脉冲发生电路系统输入输出模块框图16位进制计数电路系模块框图(见图4):图4 16位进制计数电路系统输入输出模块框图秒脉冲发生电路产生脉冲输入到16位计数器电路,计数器电路响应脉冲计数然后将计数响应输入到译码显示电路,译码显示电路响应,这时实验箱上8个数码管的后4位将进行从0到F计数的循环显示。
整体输入输出模块框图(见图5):图5 含异步清零与同步时钟使能计数器系统输入输出模块框图(2)模块逻辑表达(见表一和表二)功能 clk rst ena dout[3:0] 异步清零 X 0 X 0 0 0 0表一 16进制计数器的真值表表二译码显示电路的真值表(3)算法流程图译码显示电路流程图(见图6):图6 译码显示电路算法流程图16位计数器流程图(见图7):图7 16位计数器电路算法流程图(4)Verilog源代码译码显示电路代码:module dec(d,seg,dig); //定义模块名与输入输出input[3:0] d;output[7:0] seg;output[3:0] dig; //定义输入输出与数据类型reg[7:0] seg_r; //定义一个reg类型数据assign dig=4'b0000; //给dig赋值0assign seg=seg_r; //将reg类型数据与wire类型数据进行转换always @(d) //检测目标信号dbegincase(d) //case语句,目标公式为d4'b0000:seg_r=8'hc0; //当4位的d数据变化时对应的rge数据类型的seg_r数值4'b0001:seg_r=8'hf9;4'b0010:seg_r=8'ha4;4'b0011:seg_r=8'hb0;4'b0100:seg_r=8'h99;4'b0101:seg_r=8'h92;4'b0110:seg_r=8'h82;4'b0111:seg_r=8'hf8;4'b1000:seg_r=8'h80;4'b1001:seg_r=8'h90;4'b1010:seg_r=8'h88;4'b1011:seg_r=8'h83;4'b1100:seg_r=8'hc6;4'b1101:seg_r=8'ha1;4'b1110:seg_r=8'h86;4'b1111:seg_r=8'h8e;default:seg_r=8'h0; //其余d的显示的数据seg_r显示为0endcase //结束case语句end //结束always语句endmodule //结束程序16进制计数器电路代码:module jsqt(clk,rst,ena,dout); //定义模块名与输入输出input clk,rst,ena;output[3:0] dout; //定义输入输出与数据类型reg[3:0] dout_r; //定义一个reg数据类型assign dout=dout_r; //将reg类型数据与wire类型数据进行转换always @(posedge clk or negedge rst) //检测目标信号时钟或异步信号beginif(rst==0) //检测信号rst是否恒等于0dout_r=4'b0000; // 给reg数据类型的dout_r赋值0else if(ena==1) //检测信号ena是否恒等于1dout_r=dout_r+1; //数据dout_r加1end //结束always语句endmodule //结束程序四、系统调试1、仿真调试(1)仿真代码译码显示电路仿真代码:`timescale 1ns/1nsmodule dec_tp; //测试模块的名字reg[3:0] d; //测试输入信号定义为reg型wire[7:0] seg; //测试输出信号定义为wire型wire[3:0]dig; //测试输出信号定义为wire型parameter DELY=100; //延时100秒dec u1(d,seg,dig); //调用测试对象assign dig=4'b0000; //给dig赋值0initial begin //激励波形设定d=4'b0;#DELY d=4'b0001;#DELY d=4'b0010;#DELY d=4'b0011;#DELY d=4'b0100;#DELY d=4'b0101;#DELY d=4'b0110;#DELY d=4'b0111;#DELY d=4'b1000;#DELY d=4'b1001;#DELY d=4'b1010;#DELY d=4'b1011;#DELY d=4'b1100;#DELY d=4'b1101;#DELY d=4'b1110;#DELY d=4'b1111;#DELY $finish;endinitial $monitor($time,,,"seg=%d,dig=%d,d=%b",seg,d,dig); //输出格式i定义endmodulemodule dec(d,seg,dig); //命名模块名字input[3:0] d;output[7:0] seg;output[3:0] dig; //定义输入与输出reg[7:0] seg_r; // 定义seg_r的reg型数据assign dig=4'b0000; //给dig赋值0assign seg=seg_r; //将reg型数据转化为wire型数据always @(d) //检测d的数据是否变化begincase(d) //七段译码4'b0000:seg_r = 8'hc0; //显示04'b0001:seg_r = 8'hf9; //显示14'b0010:seg_r = 8'ha4; //显示24'b0011:seg_r = 8'hb0; //显示34'b0100:seg_r = 8'h99; //显示44'b0101:seg_r = 8'h92; //显示54'b0110:seg_r = 8'h82; //显示64'b0111:seg_r = 8'hf8; //显示74'b1000:seg_r = 8'h80; ///显示84'b1001:seg_r = 8'h90; //显示94'b1010:seg_r = 8'h88; //显示a4'b1011:seg_r = 8'h83; //显示b4'b1100:seg_r = 8'hc6; //显示c4'b1101:seg_r = 8'ha1; //显示d4'b1110:seg_r = 8'h86; //显示e4'b1111:seg_r = 8'h8e; ///显示fendcase //结束case语句end //结束always语句endmodule //结束程序16进制计数器仿真代码:`timescale 1ns/1nsmodule jsqt_tp; //测试模块的名字reg clk,rst,ena; //测试输入信号定义为reg型wire[3:0] dout; //测试输出信号定义为wire型parameter DELY=100; //延时100秒jsqt u1(clk,rst,ena,dout); //调用测试对象initial begin //激励波形设定clk=0;rst=1;ena=1;#DELY clk=1;rst=1;ena=1;#DELY clk=0;rst=1;ena=1;#DELY clk=1;rst=1;ena=1;#DELY clk=0;rst=1;ena=1;#DELY clk=1;rst=1;ena=1;#DELY clk=0;rst=1;ena=1;#DELY clk=1;rst=1;ena=1;#DELY clk=0;rst=1;ena=1;#DELY $finish;endinitial$monitor($time,,,"dout=%d,rst=%b,ena=%b,clk=%b",dout,rst,ena,clk); //输出格式i定义endmodulemodule jsqt(clk,rst,ena,dout); //定义模块名与输入输出input clk,rst,ena;output[3:0] dout; //定义输入输出与数据类型reg[3:0] dout_r; //定义一个reg数据类型assign dout=dout_r; //将reg类型数据与wire类型数据进行转换always @(posedge clk or negedge rst) //检测目标信号时钟或异步信号beginif(rst==0) //检测信号rst是否恒等于0dout_r=4'b0000; // 给reg数据类型的dout_r赋值0else if(ena==1) //检测信号ena是否恒等于1dout_r=0; //给dout_r赋初值dout_r=dout_r+4’b1; //数据dout_r加1end //结束always语句endmodule //结束程序(2)仿真波形图译码显示仿真波形图(见图8):图8 译码显示部分仿真波形图16进制计数器仿真波形图(见图9):图9 16进制计数器仿真波形图(3)波形分析由图6-1与图6-2可以看出给4位dig赋值0,每延迟100秒可以看见4位的d变化与8位seg产生的数据与代码上的编程相符合。
VHDL-4位计数器的设计
*******bcd译码器******library ieee;use ieee.std_logic_1164.all;entity decoder isport(bcd: in std_logic_vector(3 downto 0);y: out std_logic_vector(7 downto 0));end entity;architecture rtl of decoder isbeginprocess (bcd)begincase bcd iswhen "0000" => y<="11000000"; --0: h g f e d c b a when "0001" => y<="11111001"; --1when "0010" => y<="10100100"; --2when "0011" => y<="10110000"; --3when "0100" => y<="10011001"; --4when "0101" => y<="10010010"; --5when "0110" => y<="10000010"; --6when "0111" => y<="11111000"; --7when "1000" => y<="10000000"; --8when "1001" => y<="10010000"; --9when others => y<="11111111";end case;end process;end rtl;***********多路选择控制************library ieee;use ieee.std_logic_1164.all;entity mux isport (input_a:in std_logic_vector(3 downto 0); input_b:in std_logic_vector(3 downto 0);input_c:in std_logic_vector(3 downto 0);input_d:in std_logic_vector(3 downto 0);sel:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end entity mux;architecture rtl of mux isbeginprocess(sel)isbeginif(sel="00")theny<=input_a;elsif(sel="01")theny<=input_b;elsif(sel="10")theny<=input_c;elsey<=input_d;end if;end process;end rtl;************分频************library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clk4ms isport (clk:in std_logic;y:buffer std_logic);end entity clk4ms ;architecture rtl of clk4ms issignal a:STD_LOGIC_VECTOR(17 DOWNTO 0); beginprocess(clk)isbeginif(clk'event and clk='1')thenif(a="100000") thena<="0000000";y<=not y;elsea<=a+'1';end if;end if;end process;end rtl;************计数器************library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt isport (clk,clr,en:in std_logic;a:out std_logic_vector(3 downto 0);b:out std_logic_vector(3 downto 0);c:out std_logic_vector(3 downto 0);d:out std_logic_vector(3 downto 0));end entity cnt ;architecture rtl of cnt issignal dout_0,dout_10,dout_100,dout_1000:std_logic_vector(3 downto 0); beginprocess(clr,clk,en)isbegina<=dout_0;b<=dout_10;c<=dout_100;d<=dout_1000;if clr='1' thendout_0<="0000";dout_10<="0000";dout_100<="0000";dout_1000<="0000";elsif(en='1')thenif(clk'event and clk='1')thenif(dout_0="1001")then ---计数dout_0<="0000";elsedout_0<=dout_0+'1';end if;elsif(clk'event and clk='1' and dout_0="1001")thenif(dout_10="1001") then ---计数dout_10<="0000";elsedout_10<=dout_10+'1';end if;elsif(clk'event and clk='1' and dout_0="1001" and dout_10="1001")thenif(dout_100="1001") then ---计数dout_100<="0000";elsedout_100<=dout_100+'1';end if;elsif(clk'event and clk='1' and dout_0="1001" and dout_10="1001" and dout_100="1001")thenif(dout_1000="1001") then ---计数dout_1000<="0000";elsedout_1000<=dout_1000+'1';end if;end if;end if;end process;end rtl;************位选************LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY wei ISPORT(clk4ms:IN STD_LOGIC;q:BUFFER STD_LOGIC_VECTOR(1 DOWNTO 0);d:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY wei;ARCHITECTURE rtl OF wei ISBEGINPROCESS(clk4ms) ISBEGINIF(clk4ms 'EVENT AND clk4ms='1') THEN IF(q="11") THENq<="00";ELSEq<=q+'1';END IF;IF(q="00") THENd<="1000";ELSIF(q="01") THENd<="0100";ELSIF(q="10") THENd<="0010";ELSEd<="0001";END IF;END IF;END PROCESS;END ARCHITECTURE rtl;**********总程序*********LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY ZONG ISPORT( clr :IN STD_LOGIC;clk :IN STD_LOGIC;CLK4M:IN STD_LOGIC;en:IN STD_LOGIC;Y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ZONG ;ARCHITECTURE a OF ZONG ISCOMPONENT cnt isport (clk,clr,en:in std_logic;a:out std_logic_vector(3 downto 0);b:out std_logic_vector(3 downto 0);c:out std_logic_vector(3 downto 0);d:out std_logic_vector(3 downto 0));END COMPONENT;COMPONENT MUX isport (input_a:in std_logic_vector(3 downto 0); input_b:in std_logic_vector(3 downto 0);input_c:in std_logic_vector(3 downto 0);input_d:in std_logic_vector(3 downto 0);sel:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end COMPONENT;COMPONENT DECODER isport(bcd:in std_logic_vector(3 downto 0);y: out std_logic_vector(7 downto 0));end COMPONENT;COMPONENT WEI isport(clk4ms:in std_logic;d:out std_logic_vector(3 downto 0));end COMPONENT;COMPONENT CLK4MS isport(clk:in std_logic;y:out std_logic);end COMPONENT;SIGNAL aa,bb,cc,dd:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL mm:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL ss:STD_LOGIC;signal ww:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINu1 : cnt PORT MAP(clk,clr,en,aa,bb,cc,dd);u2 : mux PORT MAP(aa,bb,cc,dd,ww,mm);u3 :decoder PORT MAP(mm,y);u4 : wei PORT MAP(ss,ww,dig);u5 : clk4ms PORT MAP(clk4m,ss);END a;。
四位全加器的VHDL设计
一位全加器的数据流(逻辑)描述
• Library ieee; • Use ieee.std_logic_1164.all; • Use ieee.std_logic_unsigned.all; • Entity fulladder is • Port (A,B,CI:in std_logic; • S,CO:out std_logic); • End fulladder; • • • • • Architecture dataflow of fulladder is Begin S<= CI xor A xor B; CO<= (A and B) or (CI and A) or (CI and B); End dataflow;
4位全加器的设计,先设计4个1位的全加器,然后将低位的 进位输出与高位的进位输入相连,将要进行加法运算的两个4 位数的每一位分别作为每一个1位全加器的输入,进行加法运 算,所有的1位全加器的输出组成一个4位数,即输入的两个 4位数之和,最高位的全加器产生的进位输出即两个4位数求 和的进位输出。(如图)
一位全加器真值表
一位全加器的辑表达式
• • • • S=A⊕B⊕Cin Co=AB+BCin+ACin 其中A,B为要相加的数,Cin为进位输 入;S为和,Co是进位输出;
Library ieee; Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all; Entity fulladder Is Port(Ci,a,b : IN std_logic; s,Co : OUT std_logic); End fulladder; Architecture m1 Of fulladder Is Signal tmp: std_logic_vector(1 downto 0); Begin tmp<=('0' & a) + b + Ci; s<=tmp(0); Co<=tmp(1); End m1;
四位全加器的VHDLVerilogHDL实现
四位全加器的VHDL/VerilogHDL实现加法器的分类(一)半加器能对两个1位二进制数进行相加而求得和及进位的逻辑电路称为半加器。
或:只考虑两个一位二进制数的相加,而不考虑来自低位进位数的运算电路,称为半加器。
图1为半加器的方框图。
图2为半加器原理图。
其中:A、B分别为被加数与加数,作为电路的输入端;S为两数相加产生的本位和,它和两数相加产生的向高位的进位C一起作为电路的输出。
根据二进制数相加的原则,得到半加器的真值表如表1所列。
信号输入信号输出A B S C0 0 0 00 1 1 01 0 1 01 1 0 1表1 半加器的真值表由真值表可分别写出和数S,进位数C的逻辑函数表达式为:(1)C=AB (2)由此可见,式(1)是一个异或逻辑关系,可用一个异或门来实现;式(2)可用一个与门实现。
仿真结果如图3所示:图3 半加器仿真图(二)全加器除本位两个数相加外,还要加上从低位来的进位数,称为全加器。
图4为全加器的方框图。
图5全加器原理图。
被加数Ai 、加数Bi从低位向本位进位Ci-1作为电路的输入,全加和Si 与向高位的进位Ci作为电路的输出。
能实现全加运算功能的电路称为全加电路。
全加器的逻辑功能真值表如表2中所列。
表2 全加器逻辑功能真值表多位全加器连接可以是逐位进位,也可以是超前进位。
逐位进位也称串行进位,其逻辑电路简单,但速度也较低。
五、加法器的VHDL实现(一)半加器VHDL语言描述语句为:so<=a xor b;co<=a and b程序设计:library ieee;use ieee.std_logic_1164.all;entity h_adder isport (a,b:in std_logic;so,co:out std_logic); ――定义输入、输出端口end h_adder;architecture bh of h_adder isbeginso<=a xor b; ――“异或”运算co<=a and b; ――“与”运算end bh;(二)全加器1位全加器可由两个半加器组成,在半加器的基础上,采用元件调用和例化语句,将件连接起来,而实现全加器的VHDL编程和整体功能。
含异步清0和同步时钟使能的4位加法计数器
含异步清0和同步时钟使能的4位加法计数器含异步清0和同步时钟使能的4位加法计数器⼀、实验⽬的学习计数器的设计、仿真和硬件测试,进⼀步熟悉VHDL的编程⽅法⼆、实验内容本实验的内容是QuartusII建⽴⼀个含计数使能、异步复位的4位加法计数器,并执⾏仿真测试。
最后在SmartSOPC实验箱上进⾏硬件测试,有KEY1控制计数使能端ENA并有LED1指⽰,KEY2控制复位端并由LED2指⽰。
进位输出有LED8指⽰,计数值由数码管指⽰。
时钟CLK有分频模块int-div分频得到4HZ的信号。
三、实验原理实验图是⼀含计数使能、异步复位和计数值并⾏预置功能4位加法计数器,例1是其VHDL描述。
由实验图所⽰,图中间是4位锁存器;rst 是异步清信号,⾼电平有效;clk是锁存信号;D[3..0]是4位数据输⼊端。
当ENA为'1'时,多路选择器将加1器的输出值加载于锁存器的数据端;当ENA为'0'时将"0000"加载于锁存器。
四、实验步骤(1)启动QuartusII建⽴⼀个空⽩⼯程,然后命名为cnt-4b.qbf。
(2)新建VHDL源程序⽂件cnt4b.vhd,输⼊程序代码并保存,进⾏综合编译,若在编译过程中发现错误,则找出并更正错误,直到编译成功为⽌。
(3)建⽴波形仿真软件并进⾏仿真验证。
(4)将光盘中EDA⽬录下的int-div.bsf、int-div.vhd和decl7s.bsf、decl7s.vhd(5)新建图形设计⽂件(顶层模块)命名为cnt-4b.bdf并保存。
(6)选择⽬标器件并对相应的引脚进⾏锁定,在这⾥所选择的器件为Altera公司的Cyclone系列的EP1C12Q240C8芯⽚,引脚锁定⽅法如图,将未使⽤管脚设置为三态输⼊(⼀定要设置,否则可能会损坏芯⽚)。
(7)将cnt-4b.qbf.设置为顶层实体。
对该⼯程⽂件进⾏全程编译处理,若在编译过程中发现错误,则找出并更正错误,直到编译成功为⽌。
【实验三】含异步清0和同步时钟使能的4位加法计数器
实验数据记录
思考题 1. 在例 4-3-1 中是否可以不定义信号 CQI 而直接 用输出端口信号完成加法运算 ,即 “OUTY<=OUTY+1”?
实验内容
END IF; END IF; COUT<=CQI(0) AND AND CQI(3);
实验要求
1. 说明例5-1各语句的含义,以及该例的整体功 能。在MAXPLUS II上进行编辑、编译、综合、 适配、仿真。 2. 设计10进制计数器的程序进行编辑、编译、综 合、适配、仿真;并进行引脚锁定及硬件测试。 建议选实验电路模式5,用数码1显示译码输出 (PIO19---PIO16),D8 (PIO15)作为 进位输出,键8、键7(PIO7---PIO6)两位 控制输入,硬件验证译码器的工作性能。
实验原理
ENA为‘1’时允许计数,当ENA为‘0’时停止计数。 计数器输出为“1111”时(十进制计数器,输出为 “ 1001”) ,进位信 COUT 为“ 1” ,否则 COUT 输 出 为“0”。
实验内容
程序5-2: IF RST='1'THEN CQI<="0000"; ELSIF CLK'EVENT AND CLK='1' THEN IF ENA='1' THEN IF CQI<"1001" THEN CQI <=CQI+1; ELSE CQI<="0000"Leabharlann END IF;EDA实验
【实验三】含异步清0和同步时钟使能的4 位加法计数器
实验目的
掌握简单逻辑电路的设计方法。 学习使用VHDL语言进行含异步清零和同步加 载与时钟使能的计数器的设计。
EDA课程设计之含异步清0和同步时钟使能的加法计数器
实验2 含异步清0和同步时钟使能的加法计数器(1) 实验目的:学习计数器的设计、仿真和硬件测试,进一步熟悉VHDL设计技术。
(2) 实验原理:实验程序为例3-3,实验原理在第二章,设计流程参考第二章。
【例3-3】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 ISPORT (CLK,RST,EN : IN STD_LOGIC;CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT : OUT STD_LOGIC );END CNT10;ARCHITECTURE behav OF CNT10 ISBEGINPROCESS(CLK, RST, EN)VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF RST = '1' THEN CQI := (OTHERS =>'0') ;ELSIF CLK'EVENT AND CLK='1' THENIF EN = '1' THENIF CQI < 9 THEN CQI := CQI + 1;ELSE CQI := (OTHERS =>'0');END IF;END IF;END IF;IF CQI = 9 THEN COUT <= '1';ELSE COUT <= '0';END IF;CQ <= CQI;END PROCESS;END behav;(3) 实验内容1:在QuartusⅡ上对例3-3进行编辑、编译、综合、适配、仿真。
说明例中各语句的作用,详细描述示例的功能特点,给出其所有信号的时序仿真波形。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五含异步清零和同步使能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。
注意文件的扩展名要选为.vhd,而且要求工程名、文件名和设计实体名必须相同。
10选器件:ACEX1K,EP1K30TC144-3(旧)或Cyclone,EP3C40Q240C8目标芯片。
11编译;
12建立波形文件,然后保存,其文件名必须与工程名一致;【波形设置:①设置仿真时间为10us:②设置输入信号的波形:时钟周期设置为200ns,其他输入信号的波形设置参看图5-4。
】
13仿真,观察输出波形是否正确;
14时序分析:分析芯片所能达到的最高时钟频率。
【打开时序分析器,然后执行菜单命令:analysis/register performance/start,可以看到最高时钟频率为55.55MHZ】
(三)异步清0和同步时钟使能的4位加法计数器的VHDL设计
参照实验(一)、(二),完成异步清0和同步时钟使能的4位10进制加法计数器的设计。
五、思考题
1解释同步复位和异步复位的概念,同步的含义是什么?。
2在异步复位4位计数器的设计中,是否可以不定义信号CQI,而直接用输出端口信号完成加法运算,即OUTY<=OUTY+1?为什么?如果可以,需要修改什么?
3修改实验中的设计代码,用进程语句实现进位信号COUT的输出。
4设计一个1位十进制计数器(二进制是4位),要求含有异步复位和计数使能控制,有进位输出。
写出VHDL设计代码并仿真。
如何设计2位十进制计数器?
六、拓展:8位自启动环形计数器
[实验原理]
数字逻辑电路中,用来存放二进制数据或代码的电路称为寄存器。
寄存器是由具有存储功能的触发器组合构成的。
按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。
基本寄存器只能并行送入数据,需要时也只能并行输出,移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,串行输入、并行输出。
在实际应用中,环形计数器实际上就是一个最简单的移位寄存器,它把最后一个触发器的输出值移位到前一个触发器中。
对于n位二进制代码的移位寄存器,为构成环形计数器可
将寄存器FF
n-1的输出Q
n-1
接到寄存器FF
的输入端D
,把各个寄存器相连使信号由左向右移
位,并由Q
n-1返回到Q
,在多数情况下,寄存器中只有一个信号1,只要有时钟脉冲作用,
1就在移位寄存器循环,环形计数器中各个触发器的Q端,将轮流地出现矩形脉冲。
应用DFF 设计的环形计数器电路图如图1所示。
图18位自启动环形计数器电路图。