基于FPGA十进制同步计数器

合集下载

基于fpga的计数器设计代码

基于fpga的计数器设计代码

基于fpga的计数器设计代码基于FPGA的计数器设计代码介绍:来自电子系统设计实验课程的一个项目,要求编写一段基于FPGA 的计数器设计代码,但是考虑到本实验课程源自一门免费的开源课程,因此无法提供实际的设备来验证此设计代码,但是可以通过模拟环境进行测试以确保实现正确设计功能,本文将介绍如何利用FPGA对计数器进行设计。

实现方法:1.首先需要确定将用哪种FPGA芯片来实现计数器功能,例如Xilinx Spartan-6的FPGA。

2.然后确定使用哪种电路来实现计数器功能,可以使用逻辑器件来实现,例如可以使用多路触发器、多变量单位、或是查找表等电路。

3.接下来就是根据前面两步的确定,开始编写实现计数器设计的代码,例如VHDL语言或Verilog语言。

4.最后进行代码仿真,使用设计的代码来仿真计数器的功能,以确保代码完全正确。

示例代码:下面是一段可以实现计数器设计的代码,采用的是VHDL语言:--计数器设计代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY COUNTER ISPORT (reset : IN STD_LOGIC;clk : IN STD_LOGIC;count : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END COUNTER;ARCHITECTURE RTL OF COUNTER ISBEGINPROCESS(clk, reset)BEGINIF (reset='1') THENcount <= '00000000'; --初始值为0ELSIF (clk='1' and clk'EVENT) THENcount <= count + 1; --正常的计数END IF;END PROCESS;END RTL;以上代码可以实现一个八位的计数器,当reset为高电平时,计数器初始值为0,每次当clk上升沿时,计数器递增1,当计数器到达最大值255时,再次上升时从0开始重复计数。

FPGA实验一:基于原理图的十进制计数器设计

FPGA实验一:基于原理图的十进制计数器设计

实验一:基于原理图的十进制计数器设计一、实验目的:1.熟悉和掌握ISE Foudation软件的使用;2.掌握基于原理图进行FPGA设计开发的全流程;3.理解和掌握“自底向上”的层次化设计方法;4.温习数字电路设计的基础知识。

二、实验原理:本次实验采用的是七段数码管显示译码器和CD4CE同步十进制计数器组合的电路,实验原理图如下:本次实验采用七段数码管的字符显示真值表如下:CD4CE是同步十进制计数器,输入端有异步清零控制端CLR,工作控制使能端CE和时钟输入端C,输出端有BCD码计数值输出端Q3~Q0,进位输出端TC和输出状态标志CEO,其真值表如下图:三、实验过程:1.创建一个新的工程,并为工程新建一个原理图文件,根据实验要求绘制数码管A段LED驱动逻辑电路,并生成原理图模块符号,然后新建一个Test Bench WaveForm文件,进行仿真,查看实验是否符合真值表的内容:数码管A段LED驱动逻辑电路图2.根据步骤1绘制B、C、D、E、F、G段驱动逻辑电路,并生成相应的原理图模块符号,进行仿真,然后再根据实验要求将7个模块进行组合成七段显示译码器原理图:3.调用CD4CE计数器符号和上图中的seg7模块绘制十进制计数器原理图,然后进行仿真验证:4.执行综合,记录其中关于时钟频率、资源消耗等数据:5.根据实验指导书经行锁引脚操作,编辑引脚约束文件:6.生成下载配置文件,下载到开发板进行经行验证。

四、实验思考题:1.分析并说明本次实验所完成的工程文件结构关系。

答:本次实验采用的是自底向上的设计流程,即是先从最底层开始,逐步向上设计,所以本次实验所完成的工程文件的结构关系是一种底层与顶层结构关系。

2.如何分析仿真软件运行出的结果?答:观察实验仿真的结果,与实验要求的真值表进行对比,若符合则表示设计方案正确,否则则表示方案设计错误,需要修改设计方案。

3.在仿真激励信号的设计上组合电路和时序电路分别关注的重点是什么?为什么?答:组合电路关注当前的输入信号,而时序电路不仅要关注当前的输入信号,还需要关注上一时刻的输出的状态。

基于FPGA的计数器的程序的设计方案

基于FPGA的计数器的程序的设计方案

基于FPGA的计数器的程序设计方案1.1 FPGA简介FPGA(Field-Progrmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。

它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

自1985 年Xilinx 公司推出第一片中大规模现场可编程逻辑器件(FP2GA) 至今,FPGA 已经历了十几年的历。

在这十几年的过程中,可编程器件有了惊人的发展:从最初的1200 个可利用门,到今天的25 万可利用门,规模增大了200 多倍; FPGA 供应商也从Xilinx 的一枝独秀,到今天近20 个厂商的分庭抗争;FPGA 从单一的基于SRAM结构到今天各种结构类型的出现,都充分体现了可编程器件这一巨大市场的吸引力。

FPGA 不仅可以解决电子系统小型化、低功耗、高可靠性等问题,而且其开发周期短、开发软件投入少、芯片价格不断降低。

由于目前电子产品生命周期相对缩短,相近功能产品的派生设计增多等特点,促使FPGA 越来越多地取代了ASIC 的市场,特别是对国内众多的科研单位来说,小批量、多品种的产品需求,使得FPGA 成为首选。

1.2 硬件描述语言VHDL特点功能强大、设计灵活。

VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。

它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。

VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。

VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。

支持广泛、易于修改。

由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。

FPGA—基于HDL的十进制计数器设计

FPGA—基于HDL的十进制计数器设计

基于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,正常计数。

基于FPGA的十进制计数器

基于FPGA的十进制计数器

w hen"0110"=>q<= "0111";c <='0';
w hen"0111 "=>q<="1000 ";c <='0';
w hen"1000"=>q<="1001 ";c <='1';
when others=>q<="0000"; c<='0';
end case;
end if;
else q<=q;
d: in std_logic_vector(3 downt_vector(3 downto 0);
c:buffer std_logic );
end count10;
architecture rtl of count10 is
begin
process(ep,et,clk,nld,nrd,d)
4. 实验步骤或程序(经调试后正确的源程序)
见附件 A
5.程序运行结果
十进制计数器
6.出现的问题及解决方法

实验步骤或程序:
十进制计数器程序:
library ieee;
use ieee.std_logic_1164.all;
entity count10 is
port(ep,et,clk,nld,nrd: in std_logic;
end if;
c<=c;
end if;
else q<=q;
c<=c;
end if;
end process;

华中科技大学基于FPGA的十进制加减可逆计数器

华中科技大学基于FPGA的十进制加减可逆计数器

实验名称:十进制加减可逆计数器实验组别:⑨实验人:XJY 班级:光信1102 学号:U201114XXX目标要求:利用实验板实现十进制加减可逆计数器设计,具体要求为:拨码开关键SW1为自动可逆加减功能键,当SW1为HIGH时,计数器实现自动可逆模十加减计数功能,即4个七段数码管上几乎同步显示0—1—2—3—4—…9—8—7—…0—1…的模十自动可逆加减计数结果;当SW1为LOW时,计数器按拨码开关键SW0的选择分别执行加减计数功能。

即当SW0为HIGH时,计数器实现模十加计数功能,即4个七段数码管上几乎同步显示0—1—2—3—4—…9——0—1…的模十加计数结果;当SW0为LOW时,8—7…的模十减计数结果。

实现原理:源码清单:`timescale 1ns / 1ps////////////////////////////////////////////////////////////////////////////////// // Company:// Engineer://// Create Date: 14:24:13 12/09/2013// Design Name:// Module Name: xjy// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://////////////////////////////////////////////////////////////////////////////////// module xjy(input clk,input SW1,input SW0,input clear,input reset,output reg[3:0] sl_reg,output reg [6:0]segdat_reg);reg [26:0] count;reg [3:0] q;reg x;always@(posedge clk)beginif(clear) beginsl_reg<=0;count<=0;endelsecount<=count+1;endalways@(posedge count[24]) //程序运行时用//always@(posedge count[4]) 程序模拟时使用beginif (reset) begin q<=0; x<=0; endelse begincase(SW1)1'd1:begincase(x)1'd0: beginif(q==4'd8) x<=1;q<=q+1;end1'd1: beginif(q==4'd1) x<=0;q<=q-1;endendcaseend1'd0:begincase(SW0)1'd0:beginif(q==4'd0) q<=4'd9;else q<=q-1;end1'd1:beginif(q==4'd9) q<=4'd0;else q<=q+1;endendcaseendendcaseendendalways@(q) // 数码管显示处理begincase(q)4'h0: segdat_reg = 7'b0000001; //04'h1: segdat_reg = 7'b1001111; //14'h2: segdat_reg = 7'b0010010; //24'h3: segdat_reg = 7'b0000110; //34'h4: segdat_reg = 7'b1001100; //44'h5: segdat_reg = 7'b0100100; //54'h6: segdat_reg = 7'b0100000; //64'h7: segdat_reg = 7'b0001111; //74'h8: segdat_reg = 7'b0000000; //84'h9: segdat_reg = 7'b0000100; //9default: segdat_reg = 7'b0111000; //Fendcaseendendmodule测试文件清单:`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////// // Company:// Engineer://// Create Date: 17:46:25 12/09/2013// Design Name: XJY// Module Name: D:/ISE/XJY/xjy/xjy_test.v// Project Name: xjy// Target Device:// Tool versions:// Description://// Verilog Test Fixture created by ISE for module: XJY //// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments:////////////////////////////////////////////////////////////////////////////////// module xjy_test;// Inputsreg clk;reg SW1;reg clear;reg reset;// Outputswire [3:0] sl_reg;wire [6:0] segdat_reg;// Instantiate the Unit Under Test (UUT)XJY uut (.clk(clk),.SW1(SW1),.clear(clear),.reset(reset),.sl_reg(sl_reg),.segdat_reg(segdat_reg));always begin#10; clk=~clk;endinitial begin// Initialize Inputsclk = 0;SW1 = 0;SW0=1;clear =1;reset = 1;// Wait 60 ns for global cleat to finish#60;clear =0;// Wait 60 ns for global reset to finish#60;reset = 0;// Add stimulus hereendEndmodule管脚定义文件:#Created by Constraints Editor (xc3s100e-cp132-4) - 2013/12/10 NET "clk" TNM_NET = clk;TIMESPEC TS_clk = PERIOD "clk" 20 ns HIGH 50%;NET "segdat_reg[6]" LOC = L14;NET "segdat_reg[5]" LOC = H12;NET "segdat_reg[4]" LOC = N14;NET "segdat_reg[3]" LOC = N11;NET "segdat_reg[2]" LOC = P12;NET "segdat_reg[1]" LOC = L13;NET "segdat_reg[0]" LOC = M12;NET "sl_reg[0]" LOC = F12;NET "sl_reg[1]" LOC = J12;NET "sl_reg[2]" LOC = M13;NET "sl_reg[3]" LOC = K14;NET "clear" LOC = K3;NET "clk" LOC = B8;NET "SW1" LOC = L3;NET "clk" SLEW=FAST;NET "reset" LOC=B4;NET "SW0" LOC=P11;NET "SW1" LOC=L3;系统使用说明:clear 为程序开始按钮,定义为开发板的拨码开关SW3reset 为程序清零按钮,拨至低电位后显示清零,定义为拨码开关SW2SW1 为程序功能控制按钮,定义为拨码开关SW1SW0 为程序功能控制按钮,定义为拨码开关SW0系统功能与性能测试结果:实验开始之前将SW3,SW2,SW1,SW0,均调至HIGH实验开始调SW3(clear),SW2(reset)为LOW当SW1为HIGH时,计数器实现自动可逆模十加减计数功能,即4个七段数码管上几乎同步显示0—1—2—3—4—…9—8—7—…0—1…的模十自动可逆加减计数结果;当SW1为LOW时,计数器按拨码开关键SW0的选择分别执行加减计数功能。

同步十进制计数器

同步十进制计数器通常,按计数器的最大计数容量命名计数器时,最大计数容量为N 时,就称为N进制计数器。

当N=2n时,就是前面争论的n位二进制计数器;当N≠2n时,为非二进制计数器。

非二进制计数器中最常用的是十进制计数器,下面争论同步十进制计数器。

图1所示为由4个下降沿触发的JK触发器组成的同步十进制加法计数器的规律电路。

用前面介绍的同步时序规律电路分析方法对该电路进行分析。

图1 同步十进制加法计数器1、列些驱动方程(1) 2、列些触发器的状态方程写出JK触发器的特性方程,然后将各驱动方程带入JK触发器的特性方程,得各触发器的次态方程为(2) 3、列些输出方程(3) 4、列些状态转换表设初态为Q3Q2Q1Q0=0000,带入次态方程和输出方程进行计算,得状态转换表如表1所示。

表 1 图1所示电路的状态表脉冲序号Q3Q2Q1Q4C十进制数0000000100010120230023001103401000450101056011006701110781 00008910011910000000 由表1可见,图1所示同步十进制计数器,当CP端来10个计数脉冲时,计数器电路中的触发器状态就循环一次,进位输出端C给出一个进位高电平,而且触发器的状态所对应的十进制数就是所计数的脉冲个数。

我们知道,4个触发器共有16(24)种状态组合,但表1中只消失了10种状态组合(有效状态),但另外6种状态组合(无效状态)在电路中任然有可能消失。

为了讨论图1所示电路完整的规律功能,必需考虑当触发器的次态状况,直至状态转换表中包含全部的状态组合,如表2所示。

表2 图2所示电路完整的状态表从表2中可以看出,当以无效状态作为初始状态时,经过几个计数脉冲作用后,触发器的状态都进入了有效状态。

如当触发器的初始状态为1010,经过2个计数脉冲后,触发器的状态变为0100,这个状态为有效状态。

在实际工作中,当由于某种缘由,使计数器进入无效状态时,假如能在时钟信号作用下,最终进入有效状态,就称该电路具有自启动力量。

基于HDL的十进制计数器的设计(FPGA)

实验二:基于HDL十进制计数、显示系统设计一、实验目的:1.掌握基于语言的ISE设计全流程;2.熟悉、应用VerilogHDL描述数字电路;3.掌握基于Verilog的组合和时序逻辑电路的设计方法;4.具有数显输出的十进制计数器的设计。

二、实验原理:1.实验内容:设计具有异步复位,同步使能的十进制计数器,其计数结果可以通过七段数码,管发光二极管进行显示。

其系统原理图如下:2.十进制计数器模块端口信号说明:①输入信号:clk----计数器的时钟信号Clc——异步清零信号,当clc=1时,输出复位为0;当clc=0时,正常计数Ena——使能控制信号,当ena=1时,电路正常累加计数,否则电路不工作输出信号。

②输出信号:SUM[3:0]-------- 计数值的个位。

即,在CLK上升沿检测到SUM=9时,SUM将被置0,开始新一轮的计数。

COUT --------计数值的十位进位,即:只有在时钟CLK上升沿测到SUM=9时,COUT将被置1,其余情况下COUT=0;3.自顶向下的设计思路进行模块划分:整个系统要求设计的模块:十进制计数模块和数码管驱动模块,由于实验按键为实现按键防抖,所以在实验时候需要加入消抖模块:电源按键消抖:通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而在闭合及断开的瞬间均伴随有一连串的抖动,为了产生这种现象而作的措施就是按键消抖。

三、实验过程:按照实验原理的设计思想,做出了以下设计代码:十进制计数器部分:module cnt10(clr,clk,ena,sum,cout);input clr,clk,ena;output[3:0] sum;output cout;reg[3:0] sum;reg cout;always @(posedge clk or posedge clr)beginif(clr)beginsum<=4'b0000;cout<=0;endelse if(ena)beginif(sum==4'b1001)beginsum<=4'b0000;cout <= 1;endelse if(sum<4'b1001)beginsum <= sum+4'b0001;cout<=0;endendendEndmodule数码管驱动模块代码:module led(out_y,sum);output [6:0] out_y;input[3:0] sum;reg [6:0] out_y;always @(sum)begincase(sum)4'b0000:out_y=7'b0111111;4'b0001:out_y=7'b0000110;4'b0010:out_y=7'b1011011;4'b0011:out_y=7'b1001111;4'b0100:out_y=7'b1100110;4'b0101:out_y=7'b1101101;4'b0110:out_y=7'b1111101;4'b0111:out_y=7'b0000111;4'b1000:out_y=7'b1111111;4'b1001:out_y=7'b1101111;default:out_y=7'b00000000;endcaseendendmodule消抖模块部分实验已经给出,最后综合模块代码:module int(clk_50,clk,rest,ena,out_y,cout );input clk_50,clk,rest,ena;output [6:0] out_y;output cout;wire [3:0] out;wire clk_out;wire [6:0] out_y;debounce_module u1(clk_50,rest,clk,clk_out); cnt10 u2(rest,clk_out,ena,out,cout);led u3(out_y,out);Endmodule根据实验要求综合:1.2.相应的引脚约束文件为:NET "clk" LOC = “V16” | PULLDOWN; NET "clk_50" LOC = "C9" ;NET "clr" LOC = "N17" ;NET "cout" LOC = "C11" ;NET "data_out<0>" LOC = "D5" ;NET "data_out<1>" LOC = "C5" ;NET "data_out<2>" LOC = "B6" ;NET "data_out<3>" LOC = "E7" ;NET "data_out<4>" LOC = "F7" ;NET "data_out<5>" LOC = "A4" ;NET "data_out<6>" LOC = "B4" ;NET "ena" LOC = "H18" ;NET "clk" CLOCK_DEDICATED_ROUTE=FALSE; 3.时序仿真为:十进制计数器仿真如下:最后例化后的结果为:思考题比较实验一与实验二的实验过程,说明原理图输入法与HDL输入法的不同的应用环境答:实验一中应用的是原理图完成十进制计数器的数显,工作量相对较大,需要绘制8张原理图,其中还不包括消抖模块。

同步十进制计数器

同步十进制加法计数器一实验目的(1)学会Pspice软件的使用,会用Pspice软件对电路进行仿真。

(2)掌握时序电路的设计方法。

(3)提高分析、动手解决实际问题的能力。

二实验环境(1)软件环境:WindowsXP操作系统,Pspice软件。

(2)硬件环境:Pentium 以上的计算机。

(3)JK触发器4片、双输入单输出与门芯片4片、三输入单输出芯片1片、时钟信号源2个、高电平信号1个。

三实验原理同步时序电路的设计过程可由图1-1描述。

首先将实际逻辑问题进行抽象——确定输入、输出变量及电路的状态数,对变量逻辑赋值,对状态编号,从而得到一个反应时序问题的状态装换图。

去掉重复状态(若有重复的话),且对状态编码,则得到状态转换图的最简形式。

对图化简得到电路的状态方程与输出方程,选定触发器类型后,则有状态方程求出驱动方程。

最后根据驱动与输出方程画出逻辑原理图、实验电路图。

根据实验电路图连线、调试并验证电路功能。

检查电路能否自启动,若不能则应修改设计或预置初值解决。

确定触发器类型检查自启动图1-1 时序电路的设计过程四实验内容与步骤1、根据时间问题当数字每满十置零一次,根据BCD码原则需要用四位二进制来表示,因此,需要选择4个触发器,其状态表如表1-2所表示:表1-2同步十进制加法器状态表2、根据状态表画出的该计数器的状态图如下:图1-3 同步十进制计数器状态图3、确定状态方程:本实验中选择使用JK触发器,其特性方才为Q n+1=J Q n+K Q n ,由于所设计电路为同步时序电路,故其时钟方程为:CP0=CP1=CP2=CP3=CP由于电路的进位输出和次态Q3n+1Q2n+1Q1n+1Q0n+1唯一取决于电路的现态Q3n Q2n Q1n Q0n 的取值,故可以根据表1-2画出表示进位输出函数和次态函数的卡诺图,如图1-4所示。

由于计数器工作时不会出现1010、1011、1100、1101、1110和1111这六个状态,所以可以将Q3n Q2n Q1n Q0n、Q3n Q2n Q1n Q0n、Q3n Q Q n Q1n Q0n、Q3n Q2n Q1n Q0n 、Q3n Q2n Q1n Q0n 和Q3n Q2n Q1n Q0n这六个最小项作为随意项处理,在卡诺图中用“×”表示。

十进制同步加法计数器


性能测试
测试环境
为保证测试结果的准确性和可靠 性,需要搭建一个标准的测试环 境,包括适当的电源、时钟源、
输入信号和输出负载等。
测试方法
按照规定的测试方法,对计数器的 各项性能指标进行测试,如计数范 围、计数速度、功耗和集成度等。
测试数据记录
详细记录测试过程中的各项数据, 如输入信号的频率、电源电压、输 出信号的状态等。
THANK YOU
感谢各位观看
发。
十进制同步加法计数器是一种同步计数 器,它可以在时钟信号的控制下进行加
法运算,并输出十进制数的计数值。
Hale Waihona Puke 02十进制同步加法计数器的工作原理
同步计数器的概念
同步计数器
一种数字逻辑电路,能够按照给 定的时钟信号进行计数操作。
工作原理
在每个时钟周期内,同步计数器 对输入的时钟信号进行检测,并 根据时钟信号的变化进行计数操 作。
05
十进制同步加法计数器的性能分析
性能指标
计数范围
计数速度
计数器的最大计数值和最小计数值,即其 能计数的十进制数的范围。
计数器完成一次计数操作所需的时间,通 常以纳秒或微秒为单位。
功耗
集成度
计数器在工作过程中消耗的电能,通常以 毫瓦或瓦为单位。
计数器内部电路的规模和复杂度,通常以 门电路的数量来表示。
进位输出
当计数器达到9态时,会产生一个 进位输出信号,表示需要将这个 进位值加到更高位的计数器中。
回零操作
在每个时钟周期结束时,计数 器会自动回零,即回到0态,准
备进行下一次计数操作。
03
十进制同步加法计数器的设计
设计步骤
确定计数器的进制
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

十进制同步计数器
一、实验目的
1.学习十进制同步计数器的Verilog硬件设计
2.学会并掌握Quartus II软件的使用
3.学会并掌握modelsim仿真软件的使用
二、实验原理
进制计数器具有电路结构简单、运算方便等特点,但是日常生活中我们所接触的大部分都是十进制数,特别是当二进制数的位数较多时,阅读非常困难,还有必要讨论十进制计数器。

在十进制计数体制中,每位数都可能是0,1,2,…,9十个数码中的任意一个,且“逢十进一”。

根据计数器的构成原理,必须由四个触发器的状态来表示一位十进制数的四位二进制编码。

第2个计数脉冲来到后,其状态为0010。

以下类推,可以得到如表1所示的状态表。

但需注意:在第9个脉冲来到后,亦即计数器处于1001态时,低电平封住了F2的置1端,Q1的高电平又使K4=1,故第十个计数脉冲来到后,F2、F3状态不变,F1、F4同时置0,计数器跳过多余的6个状态,完成一次十进制计数循环。

表1 同步十进制加法计数器状态表
为了满足十进制加法计数器的原理,本实验用Verilog程序在FPGA/CPLD 中来实现。

首先设计一个程序,程序为脉冲输入,设输出的四位码为q[3:0],十进制计数值为count,脉冲上升沿时q值+1,直到q=9时count=1,q置零重新开始计数直至下一个q=9,count=2,依次循环。

三、实验任务
1.根据实验目的编写verilog程序
2.将设计好的Verilog译码器程序在Quartus II上进行编译
3.对程序进行适配、仿真,给出其所有信号的时序仿真波形图(注意仿真波形
输入激励信号的设置)。

本实验要求自己设置clr值,理解清零的意义
四、实验步骤:
1.建立工作库文件和编辑设计文文件
任何一项设计都是一项Project(工程),而把一个工程下的所有文件放在一个文件夹内是一个非常好的习惯,以便于我们整理,利用和提取不同工程下的文件,而此文件夹将被EDA软件默认为Work Library(工作库),所以第一步先根据自己的习惯,建立个新的文件夹。

(1)新建文件夹:在E盘建立并保存工程,文件夹取名myproject,工程取名为cnt10_1
(2)输入源程序:打开Quartus II,选择菜单File-->New-->Design Files-->VerilogHDL File-->OK(如下图所示)
代码如下:
module cnt10_1(clr, clk, q, cout);
input clr, clk;
output[3:0] q;
output cout;
reg[3:0] q;
reg cout;
always @(posedge clk)
begin
if (clr) q = 0;
else begin
if (q == 9) q = 0;
else q = q + 1;
if (q == 0) cout = 1;
else cout = 0;
end
end
endmodule
(3)保存文件:完成一步就保存一步是一个好习惯,这样即使出现意外情况,也不至于以前的努力付诸东流。

选择File-->Save as,选择保存路径,即刚才新建的文件夹myproject,文件名应与实体名保持一致,即cnt10_1,点击保存后会跳出“Do you want to create a new project with this file?”选择“是”,则进入如下界面
点击Next,进入“工程设置”对话框,如图所示
第一行表示工程所在的文件夹,第二行为工程名,可以与顶层文件的实体名保持一致,也可以另取别的名字,第三行为当前工程顶层文件的实体名。

点击next,进入ADD FILE对话框,如图所示,单击Add All 按钮,将工程
相关的所有VHDL文件加进工程,也可以单击“Add...”选择性加入,按此步骤建立工程,工程已经自动将所有文件加进去了,可以直接点击next,当先直接建立工程时,需要自己添加。

(4)选择目标芯片:我们选用的是CycloneIII系列的EP3C55F484C8,在Family栏选择芯片系列——CycloneIII,在窗口右边的三个下拉列表框选择过滤条件,分别选择Package为FBGA、Pin count为484和Speed grade为8,点击Next,如图所示
(5)工具设置:进入EDA工具设置窗口,有三个选项,分别是选择输入的HDL类型和综合工具、选择仿真工具、选择时序分析工具,这是除Quartus II 自含的所有设计工具以外的外加的工具,如果不作选择的,表示仅选择Quartus II自含的所有设计工具,本次不需要其他的设计工具,可以直接点击Next
(6)结束设置:进入“工程设置统计”窗口,列出了与此工程相关的设置情况,
设置完成,点击Finish。

2.编译
配置好后就可以进行编译了,点击Processing Start Compilation命令,启动全程编译编译成功后的界面如图所示
3.时序仿真
(1)打开波形编辑器:File-->New-->Verification/Debugging Files-->Vector Waveform-->OK,即出现空白的波形编辑器,如图所示
(2)设置仿真时间区域:Edit-->End Time在Time栏中输入50,单位选择“us”,点击确定并保存波形文件
(3)将工程cnt10_1的端口信号名选入波形编辑器中:View-->Utility windows-->Node Finder,在Filter框中选Pins:all(通常是默认选项),然后点击List,则显示出了所有引脚,如图所示
将重要的端口名拖进波形编辑器后关闭窗口
(4)编辑输入波形:首先进行总线数据格式设置和参数设置:点击信号左边的+号,能展开此总线中的所有信号;如果双击此+号左边的信号标记,将弹出对该信号数据格式设置的Node Properties对话框,在该对话框的Radix下拉列表中有四种选择,这里可选择二进制Binary表达方式。

其次输入波形数据:用鼠标在图所示信号名的某一数据区拖拉出来一块蓝色区域,然后单击左侧工具栏的问号(?)按钮,在弹出窗口输入数据,继而在不同区域设置不同数据。

本设计不需要输入数据,脉冲及输入。

(5)仿真
仿真器参数仿真:选择Assignment→Settings命令,在Settings窗口下选择Category→ Simulator Settings。

在右侧的Simulation mode下拉列表中选择Timing,即选择时序仿真,并选择仿真激励文件名cnt10_1.vwf。

选择Simulation Period栏,确认选中了“Run simulation until all vector stimuli are used”。

(6)启动仿真器:Processing-->Start Simulation ,直至出现Simulation was successful,仿真结束,然后会自动弹出“Simulation Report”如图所示
4.应用RTL电路图观察器
Tools-->Netlist Viewers-->RTL Viewer,结果如图所示
四、实验总结
FPGA的学习是一个循序渐进的过程。

一开始接触到Qurtus ii的时候觉得很困难,尤其是仿真,初次仿真的时候对参数的设置没有清晰的认识。

通过对实验的一步步探究,开始逐渐了解软件的使用方法和技巧,并熟悉了仿真的方法和参数设置。

经过几周的学习,我觉得学习应该脚踏实地,FPGA的学习也一样。

首先要做的是学习软件的使用,然后把课本上的知识应用在软件上,自己动手做一下程序,最好提前安装一下QuartusII,并练习程序编写,这样会对后续的深入学习有很大帮助。

相关文档
最新文档