基于FPGA的数字秒表设计

本文作者:admin       点击: 2007-12-12 00:00
前言:
引言

FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,是一种高密度的可编程逻辑器件。

电子设计自动化( EDA) 技术使得设计者可以利用硬件描述语言和EDA技术的工具软件实现系统硬件功能。EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来。EDA技术是以大规模可编程逻辑器件及集成电路为设计载体,依赖计算机在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description Language)为系统逻辑描述手段完成的设计文件,自动完成逻辑编译、逻辑化简、逻辑分割、逻辑综合、布局布线,以及逻辑优化和仿真测试,最终形成集成电子系统或专用集成芯片的一门技术。超高速硬件描述语言Verilog HDL,是对数字系统进行抽象的行为与功能描述到具体的内部线路结构描述, 利用EDA工具可以在电子设计的各个阶段、各个层系进行计算机模拟验证, 保证设计过程的正确性, 可大大降低设计成本, 缩短设计周期。

QuartusII是Altara公司推出的一个基于Altara器件进行逻辑电路设计的体系结构化的完整集成环境。本文以QuartusII6.0 为设计平台,以现场可编程门阵列(FPGA)器件为核心,以Verilog为设计语言设计了一个数字秒表,并使用QuartusII6.0的综合器和仿真器对系统进行了编译和仿真,得出了正确的仿真结果。最后以Altera DE2开发板为实验平台,下载到开发板上进行验证。文中也给出了设计源代码。

一、系统总体设计

本秒表系统具有复位、暂停、秒表计时等功能。如图为数字秒表示意图。
clk为系统工作时钟,采用Altera DE2上的50M时钟信号,经过分频器产生秒表计时周期为0.01s的时钟,再经过计数器,分别对秒表的百分位、十分位、秒、秒十位、分、分十位进行计数。onoff为启动/暂停控制信号,当它为0时,启动计时,当它为1时,计时暂停。clr为复位信号,当该信号有效时,计数器和译码清零,此时数码管显示输出为00:00:00。
在总体电路图中,根据设计要求,需要两个输入控制信号onoff和clr。由于开发板上除了拨动开关就是瞬时的按键开关,且按键开关平时都呈高电平,按一下为低电平。故在实际测试时采用了拨动开关SW0来控制秒表的启动/暂停,通过KEY0来控制秒表的清零。

二、系统各模块设计

在设计电路时,要遵循从上到下的设计原则。首先从系统设计入手,在顶层进行功能划分和结构设计,顶层模块的每个层次模块均可完成一个较为独立的功能,次模块在调试成功后可生成一个默认符号,以供上一层模块调用。本系统由4个模块组成,分别是分频电路模块、模10计数模块、模6计数模块和动态译码显示模块。
2.1 分频电路模块CLKGEN
本设计最小计时单位为0.01s,设计时需获得一个比较精确的100Hz(周期为0.01s)的计时脉冲。由于最终的设计结果要下载到可编程逻辑器件中测试,因此可利用Altera DE2开发板的50M晶振时钟。将50M时钟信号CLK送到分频器CLKGEN进行50万分频后,得到100Hz的频率由NEWCLK输出。采用Verilog语言编程,编译无误通过后创建默认文件符号CLKGEN以供上层电路调用。程序实现如下:
module CLKGEN(clk,newclk);
input clk;//50M时钟信号
output newclk;//分频器输出100Hz信号
reg newclk;
reg [18:0] cnter;
always @(posedge clk)
  begin
  if(cnter<499999) 
   begin
    cnter=cnter+1;
    newclk=1'b0;
      end
  else
    begin
    cnter=0;//计数到500000清零
        newclk=1'b1;
      end
  end
endmodule
2.2 模10模6计数模块CNT10、CNT6
本设计中有4个十进制计数器和2个六进制计数器模块,十进制计数器用来对百分秒、十分秒、1秒和1分进行计数,当到9的时候,实现进位;2个六进制计数器则用来对十秒和十分进行计数,当到5的时候实现进位,满足显示时间范围为0.01秒到59.99秒。采用Verilog语言编程,编译无误通过后创建默认文件符号CNT10以供上层电路调用。其中十进制计数器CNT10程序实现如下:
module CNT10(clk,rst,onoff,outy,cout);
input clk,rst,onoff;//onoff用来控制计时的暂停/启动
output [3:0] outy;
output cout;
reg [3:0]outy;
reg cout;
always @(posedge clk or posedge rst or posedge onoff)
  begin 
    if(rst) outy='b0000;
    else if (onoff) outy=outy;
         else
           begin
             if(outy<'b1001)
               begin 
                 outy=outy+1;
                 cout='b0;
               end
             else
               begin 
                 outy='b0000;
                 cout='b1;
               end
           end
 end
endmodule
六进制计数器程序与此类似。
2.3 动态译码显示模块DISP
显示部分直接采用实验板上的6个共阳极数码管HEX0~HEX5。因此需要将4位BCD码译成7段数码管的编码(0~9),此处采用Verilg语言编程,编译无误后创建默认文件符号DISP以供上层电路调用。程序实现如下:
module DISP(clk,rst,din,hex);
input clk;
input rst; 
input [3:0]din;
output [6:0]hex;
reg [6:0]hex;
always @(posedge clk or posedge rst)
begin
  if(rst)
    hex=7'b1000000;
  else 
    begin
      case(din)
        4'b0000:hex=7'b1000000;//0段码的输出
        4'b0001:hex=7'b1111001;//1段码的输出
        4'b0010:hex=7'b0100100;//2段码的输出
        4'b0011:hex=7'b0110000;//3段码的输出
        4'b0100:hex=7'b0011001;//4段码的输出
        4'b0101:hex=7'b0010010;//5段码的输出
        4'b0110:hex=7'b0000010;//6段码的输出
        4'b0111:hex=7'b1111000;//7段码的输出
        4'b1000:hex=7'b0000000;//8段码的输出
        4'b1001:hex=7'b0010000;//9段码的输出
        default:hex=7'b1000000;//0段码的输出
      endcase
    end
end
endmodule
2.4 顶层文件设计
在QuartusII环境下,打开一个新的原理图编辑窗口,然后调入秒表电路设计所需要的50万分频器CLKGEN、十进制计数器/分频器CNT10(4片)、六进制计数器/分频器CNT6(2片),译码器DISP,以及电路需要的输入/输出元件。完成电路元件之间和输出/输入之间的连接,并通过QuartusII的编译。原理图如下:

三、编程及测试

为设计项目选定CyclongII系列中的EP2C35F672C6器件,锁定顶层设计中各端口所对应的引脚号,并编译通过。然后对器件编程,使用USB-Blaste下载电缆把项目以在线配置的方式下载到Altera DE2实验板的EP2C35F672C6器件中。该数字式秒表具有清零功能,通过KEY0来控制,能够在计时过程中随时清零。用SW0键来控制锁存/计时,能在计时过程中通过按SW0键,SW0拨动开关打上时计时暂停,打下时仍继续。实验证明该秒表工作正常,基本上已达到了预期的设计要求。

四、结束语

在QuartusII开发环境下,采用自顶向下的设计方法有利于在早期发现结构设计中的错误,避免不必要的重复设计。再结合基于FPGA 的“在系统”可编程实验板,轻轻松松就能实现各种电子产品的设计,现场观察实验测试结果。大大缩短了产品的设计周期和调试周期,提高了设计的可靠性和成功率,充分体现了可编程逻辑器件在数字电路设计中的优越性。