基于FPGA十进制同步计数器
- 格式:doc
- 大小:524.50 KB
- 文档页数:8
基于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开始重复计数。
实验一:基于原理图的十进制计数器设计一、实验目的: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的计数器的程序设计方案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的进一步推广和广泛应用奠定了基础。
基于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,正常计数。
实验名称:十进制加减可逆计数器实验组别:⑨实验人: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十进制计数、显示系统设计一、实验目的: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这六个最小项作为随意项处理,在卡诺图中用“×”表示。
实验一十进制计数器的设计与仿真一、实验目的熟悉QuartusⅡ的Verilog HDL文本设计流程全过程,学习计数器的设计、仿真和硬件测试。
二、实验原理该程序设计是带有异步复位、同步计数使能、可预置型功能全面的十进制计数器。
(1)第一个条件句if(!RST)构成的RST接于寄存器下方的异步清0端CLR。
(2)第二个条件句if(EN)构成EN接于寄存器左侧的使能端ENA。
(3)第三个条件句if(LODA)构成LODA接于上面的多路选择器,使之控制选择来自DATA的数据,还是来自另一多路选择器的数据。
(4)不完整的条件语句与语句Q1<=Q1+1构成了加1加法器和4位寄存器。
(5)语句(Q1<9)构成了小于比较器,比较器的输出信号控制左侧多路选择器。
(6)第二个过程语句构成了纯组合电路模块,即一个等式比较器,作进位输出。
三、实验设备与软件平台实验设备:计算机、FPGA硬件平台是Cyclone系列FPGA软件平台:Quartus II 9.1 (32-Bit)、5E+系统四、实验内容编写Verilog程序描述一个电路,实现以下功能:设计带有异步复位、同步计数使能和可预置型的十进制计数器。
具有5个输入端口(CLK、RST、EN、LOAD、DATA)。
CLK输入时钟信号;RST 起异步复位作用,RST=0,复位;EN是时钟使能,EN=1,允许加载或计数;LOAD 是数据加载控制,LOAD=0,向内部寄存器加载数据;DATA是4位并行加载的数据。
有两个输出端口(DOUT和COUT)。
DOUT的位宽为4,输出计数值,从0到9;COUT是输出进位标志,位宽为1,每当DOUT为9时输出一个高电平脉冲。
五、实验步骤设计程序:module CNT10 (CLK,RST,EN,LOAD,COUT,DOUT,DATA);input CLK;input EN;input RST;input 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) begin if (!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;Endmodule设计流程:1.编辑和输入设计文件(1)、新建一个文件夹如D:\CNT10 ,本工程所有文件将存放在此目录中。
同步可逆十进制计数器Verilog代码1. 引言同步可逆十进制计数器是一种常见的数字电路设计,用于在数字系统中实现计数功能。
本文将详细介绍同步可逆十进制计数器的设计和实现,包括Verilog代码的编写和功能的实现。
2. 设计原理同步可逆十进制计数器是一种基于时钟信号的计数器,通过时钟信号的边沿触发来实现计数功能。
每当时钟信号的边沿到达时,计数器将自动加一,并将结果输出。
当计数器达到最大值时,会自动回到初始值重新计数。
3. Verilog代码实现以下是一个基本的同步可逆十进制计数器的Verilog代码示例:module synchronous_counter(input wire clk, // 时钟信号output wire [3:0] count // 计数输出);reg [3:0] count_reg; // 计数寄存器always @(posedge clk) beginif (count_reg == 9) begincount_reg <= 0;end else begincount_reg <= count_reg + 1;endendassign count = count_reg;endmodule4. Verilog代码解析4.1 模块定义首先,我们定义了一个模块synchronous_counter,该模块具有一个输入信号clk 和一个输出信号count。
4.2 寄存器定义我们使用reg关键字定义了一个 4 位的寄存器count_reg,用于保存当前的计数值。
4.3 时钟边沿触发在always @(posedge clk)块中,我们使用posedge关键字来指示时钟的上升沿触发。
也可以使用negedge来指示时钟的下降沿触发。
4.4 计数逻辑在时钟的上升沿触发时,我们检查当前的计数值。
如果计数值等于 9,则将计数值重置为 0;否则,将计数值加一。
4.5 输出赋值最后,我们使用assign关键字将计数寄存器的值赋给输出信号count。
基于FPGA的十进制计数器的设计与实现
周庆芳
【期刊名称】《教育界》
【年(卷),期】2016(000)021
【摘要】本文通过对可编程逻辑器件FPGA的相关基础知识的学习与理论研究,进行十进制加法器的设计,通过仿真测试验证了所做设计功能的正确性,并下载到EDA实验箱进行了在线测试,阐述了可编程逻辑器件的基本设计方法。
【总页数】1页(P190-190)
【作者】周庆芳
【作者单位】曲靖师范学院
【正文语种】中文
【相关文献】
1.用FPGA设计十进制计数器
2.基于FPGA的十进制计数器的设计与实现
3.基于FPGA的可编程定时器/计数器8253的设计与实现
4.基于MAX+PLUS Ⅱ的十进制计数器的设计
5.基于集成计数器74LS161设计的六十进制计数器
因版权原因,仅展示原文概要,查看原文内容请购买。
十进制计时器设计一、实验目的:熟悉Quartus II的开发环境和开发流程,掌握Verilog文本设计流程,并使用Verilog编写一个十进制计时器,在Altera-Modelsim软件上仿真,验证十进制计时器的功能是否正确。
二、实验原理:十进制计数器的CLK为计数的信号,上升沿有效;RST为计数器复位信号;EN为时钟使能信号,当EN处于高电平时,计数器在CLK有效时开始计数;DATA为4位并行的数据输入端;DOUT为4位并行的数据输出端;Load为计数器的数据加载控制信号,当Load处于低电平时,数据输入端DATA 的数据被加载至数据输出端DOUT;Cout为计数器的进位输出。
三、实验步骤:3.1创建项目(1)新建一个文件夹存放EDA项目设计的相关文件。
本项设计的内容为十进制计数器,并且文件名不能使用中文,因此文件夹取名为CNT10,存放的路径为C:\Users\pp\Desktop\CNT10。
其次,项目的顶层文件名设置必须与编辑代码中的顶层模块名一致。
(2)将设计文件加入工程中。
单击File name栏后的控件,将与工程相关的Verilog文件加入工程;若没有编写相关Verilog文件,便单击Next进入下一步。
(3)选择目标芯片。
根据项目开发的硬件平台,选择与之相应的FPGA芯片。
首先在Device Family下拉列表中选择Cyclone系列,在引脚数目pin count中选择144,可快速筛选出符合条件得芯片型号。
(4)EDA工具设置。
此窗口中有三项选择:Design Entry/Synthesis用于选择输入的HDL类型和综合工具;Simulation用于选择仿真工具;Timing Analysis用于选择时序分析工具。
若不作选择,则默认选择Quartus II自含的EDA设计工具。
3.2 Verilog文本输入选择File->New命令,在New窗口中选择Verilog HDL File命令建立Verilog 文本,设置文件名为cnt10.v并存放在C:\Users\pp\Desktop\CNT10文件夹的根目录下。
《FPGA原理及应用》实验报告书(6)7段显示译码器的设计题目学院专业自动化姓名学号指导教师2015年 10-12月1.实验目的(1)进一步熟悉和掌握Qartus II的使用方法;(2)进一步掌握FPGA实验箱使用方法;(3)学习和掌握电路原理图的设计流程;(4)深化理解VHDL语言的使用方法2.实验内容使用Qartus II的元件库,通过VHDL语言进行设计7段显示译码器,并使用FPGA实验箱对程序进行硬件下载,验证。
3.实验条件开发软件:Qartus II 8.0实验设备:FPGA实验箱拟用芯片:Altera EP3C55F484C84.实验设计1)系统原理根据7段显示译码器的设计原理,7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制的译码显示,最方便的方法就是利用译码程序在FPGA/CPLD中来实现。
例3-5作为7段译码器,输处信号LED7S的7位分别接数码管的7个段,例如当LED7S输出为“1101101”时,数码管的7个段:g、f、e、d、c、b、a分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示“5”。
注意,这里没有考虑表示喜爱哦书店的发光管,如果要考虑,需要增加段h。
7段显示译码管字形对应输出输入2)程序如下所示为7段显示译码器程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LED ISPORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);LED7S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) );END ENTITY LED;ARCHITECTURE bhv OF LED ISBEGINPROCESS(A)BEGINCASE A(3 DOWNTO 0) ISWHEN "0000"=>LED7S<="0111111";WHEN "0001"=>LED7S<="0000110";WHEN "0010"=>LED7S<="1011011";WHEN "0011"=>LED7S<="1001111";WHEN "0100"=>LED7S<="1100110";WHEN "0101"=>LED7S<="1101101";WHEN "0110"=>LED7S<="1111101";WHEN "0111"=>LED7S<="0000111";WHEN "1000"=>LED7S<="1111111";WHEN "1001"=>LED7S<="1101111";WHEN "1010"=>LED7S<="1011000";WHEN "1011"=>LED7S<="1001100";WHEN "1100"=>LED7S<="1100010";WHEN "1101"=>LED7S<="1101001";WHEN "1110"=>LED7S<="1111000";WHEN "1111"=>LED7S<="0000000";WHEN OTHERS=> NULL;END CASE;END PROCESS;END bhv;1电路波形图工程编译完成后,必须对其功能和时序性质进行仿真测试。
FPGA实验指导及记录实验一基于FPGA的计数器的设计1、实验目的:(1)掌握QuartusⅡ软件的设计流程(2)学习原理图设计方法和波形仿真方法2、实验任务:采用原理图法设计一个十进制计数器,完成时序仿真和硬件实现。
3、实验步骤:(1)新建工程双击QuartusⅡ9.1(64-Bit)图标,打开软件,选择File→New Project Wizard,如图1-1所示,单击Next,进入图1-2所示对话框,完成工程存储文件夹建立、工程名、顶层实体名的设置。
(注:可通过单击…浏览按键新建存储文件夹,文件夹放置于D盘或E盘根目录下,目录中不能有中文名称,取名最好具有可读性。
)本例存储在E盘cnt_10文件夹中,文件名和顶层实体名均为cnt_10。
图1-1新建工程向导图1-2 新建文件夹/工程名/顶层实体单击Next,进入文件添加窗口,本例还没有设计文件,直接单击Next进入下一步设置,如图1-3所示,进行器件型号选择,本例采用EP3C16Q240C8,(建议先在Family 中选择CycloneⅢ系列,然后在右侧过滤选项中选择pin count 240缩小选择范围)。
单击Next进入下一步,设置设计/仿真/时序分析工具,本例不需要,直接单击Next,进入下一步。
观察设置细节,单击Finish完成设计。
图1-3 器件型号选择图1-4 完成工程设置(2)新建设计文件选择File→New,打开如图1-5所示对话框,选择Block Diagrom原理图设计文件,打开原理图设计文件。
双击空白处,打开symbol对话框,选择74390,单击OK后,拖动鼠标可放置于原理图任意空白处。
进一步添加输入端input/输出端output,添加完成后如图1-8所示。
图1-5 新建原理图文件图1-6 选择74390图1-7添加输入/输出端 图1-8 放置所需元器件将鼠标放置于器件端口处,鼠标即会变为“+”字型,此时可拖动鼠标进行连线。
****大学实验报告课程名称: FPGA技术实验名称:基于原理图的十进制计数器设计姓名: *****学号: *****班级:电子1202指导教师: ***********大学****学院制实验二基于 HDL 十进制计数、显示系统设计一、实验原理1、实验容:设计具有异步复位、同步使能的十进制计数器,其计数结果可以通过七段数码管、发光二极管等进行显示。
2、模块端口信号说明输入信号:Clk_50m ---系统采样时钟clk -------待计数的时钟clr ---------异步清零信号,当 clr=1,输出复位为 0,当 clr=0,正常计数ena---------使能控制信号,当 ena=1,电路正常累加计数,否则电路不工作输出信号:q[6: 0]---------驱动数码管,显示计数值的个位cout -----------1bit 数据,显示计数值向十位的进位COM-----------共阳级数码管,公共端(接地,参考开发板原理图)3、以自顶向下的设计思路进行模块划分:整个系统主要设计的模块是:十进制计数模块和数码管驱动模块,由于实验板的按键为实现硬件防抖,则需要将按键输入的时钟 clk,先通过消抖模块消抖后,再输出至后续使用.1)十进制计数器模块设计输入:CLK -------待计数的时钟CLR ---------异步清零信号,当 CLR =1,输出复位为 0,当 CLR =0,正常计数ENA---------使能控制信号,当 ENA=1,电路正常累加计数,否则电路不工作输出:SUM[3:0]---------- 计数值的个位。
即,在 CLK 上升沿检测到 SUM=9 时, SUM 将被置0,开始新一轮的计数。
COUT ------------计数值的十位进位,即:只有在时钟 CLK 上升沿检测到 SUM=9 时,COUT 将被置 1,其余情况下 COUT=0;在设计中可以使用 always, if-else-if语句实现,设计中注意不要在两个以上的 always模块中对同一个变量进行赋值,否则会产生多重赋值源( multi-source)的问题。
十进制同步计数器
一、实验目的
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,并练习程序编写,这样会对后续的深入学习有很大帮助。