找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4526|回复: 0
打印 上一主题 下一主题
收起左侧

基于FPGA的计数数码管显示电路设计报告

[复制链接]
跳转到指定楼层
楼主
ID:430659 发表于 2018-11-21 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

引言

FPGA 是现场可编程门阵列(Field Programmable Gate Array)的简称。FPGA器件及其开发系统是开发大规模数字集成电路的新技术。它利用计算机辅助设计,绘制出实现用户逻辑的原理图、编辑布尔方程或用硬件描述语言等方式作为设计输入;然后经一系列转换程序、自动布局布线、模拟仿真的过程;最后生成配置FPGA器件的数据文件,对FPGA器件初始化。这样就实现了满足用户要求的专用集成电路,真正达到了用户自行设计、自行研制和自行生产集成电路的目的。

FPGA是一种半定制的集成电路,其特点是直接面向用户,具有极大的灵活性和通用性,开发效率高,硬件测试和实现快捷,工作可靠性好而且技术维护简单。

随着电子技术的发展,集成电路的规模越来越大,复杂程度也越来越高。对于如此大规模的和复杂程度的电路设计问题,传统的门级描述方法显得过于琐碎和难以管理。而VHDL语言具有强大的功能,覆盖面广,描述能力强,可用于从门级、电路级直至系统级的描述、仿真和综合。下面简要介绍了VHDL语言。

VHDL的英文全名是Very-High-Speed Intergrated Circuit Hardware Description Language诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本(简称93版)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持。在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为:在新的世纪中,VHDL与Verilog语言将承担起大部分的数字系统设计任务。VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计——或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),即设计实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其它的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

Quartus II是Altera公司推出的CPLD/FPGA集成化开发软件,可以完成设计输入、逻辑综合、布局与布线、仿真、时序分析、硬件配置完整的PLD设计流程。QuartusⅡ提供了多种设计输入方式、快速的编译和直接易懂的器件编程。具有友好的用户界面, 快速的综合速度和更优化的综合和适配功能。Quartus II自带宏功能模块库,大大减轻了用户的工作量,加快设计速度。Quartus II 内置仿真器可以在工程中仿真任何设计。可进行功能仿真、时序仿真来检验设计的逻辑功能和计算设计的内部定时是否符合设计。仿真器可以仿真整个设计,或仿真设计的任何部分。支持可编程系统(SOPC)和大规模FPGA设计开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。

该软件支持Altera公司的Stratix Ⅱ、Stratix GX、Stratix、MAX3000A、MAX 7000B、MAX 7000AE、MAX Ⅱ、FLEX6000、FLEX10K系列、Cyclone、CycloneⅡ、APEX Ⅱ、APEX20K和ACEX1K系列。

1 整体设计方案

设计基于FPGA的计数器,要求显示1个0-9999的四位计数器,可以由4个模块为10的十进制计数器级联而成,所以可以显示的频率范围是1-9999HZ。因此频率计的功能分割成四个模块:分频计、计数器、输出锁存器和译码显示电路。各个模块均用VHDL语言描述并用QuartusⅡ进行仿真。本设计采用数控分频计可以对信号实现不同分频比输出信号作为计数器输入。锁存器由一个外部脉冲控制可以控制显示部分显示周期。当系统正常工作时,输入信号标提供频率,经过分频器分频,产生计数信号送入计数器模块,计数模块对输入的脉冲个数进行计数数结束后将计数结果送入锁存器中,保证系统可以稳定显示数据,计数结果能够显示在七段数码显示管上。

图1-1整体设计方案

2各功能模块设计及仿真

2.1分频器的设计

2.1.1分频器设计原理

嵌入式设备品种繁多而且性能差异也十分巨大。有些嵌入式设备如VoIP电话,简单的车载系统,简单的机顶盒等,由于它们的任务单一,功能简单,因此计算能力和存储空间都很有限。采用这些设备进行移植显然是不现实的。因此,在嵌入式设备的选择上,本项目将移植的目标设备定位在具有一定计算能力和存储空间的中高端嵌入式设备上。比较有代表性的嵌入式设备包括:中高端PDA,中高端智能电话,中高端机顶盒等。此外,为了加快移植的速度,减短开发周期,因此,将嵌入式设备的硬件平台选择为X86体系结构的硬件平台。在数字逻辑电路设计中,分频器是一种基本电路,通过分频可以得到需要的时钟频率。常见的分频器有二进制分频器、偶数次分频器、奇数次分频器、占空比可调的分频器和小数分频器。分频的方法很多最常见的就是利用加法器对时钟信号进行分频,当然也可以利用一些专用的电路结构来实现。

数控分频器的功能是在输入端给定不同数据时,将对输入的时钟信号有不同的分频比,对于一个N分频器,分频出的时钟周期是原时钟周期的N倍,频率变为原来的1/N。对于一个8位计数器,如果输入数D,然后启动计数器工作,则经过D倍的时钟周期计数器溢出时,输出full变为高电平,再以full为敏感信号,对fout进行取反操作,如此N=2D。计数一次后,再重新计数,反复进行直至输入被赋予新值。对于数控分频数器,装载不同的计数初始值时,会有不同频率的溢出信号,从而得到不同的输出。数控分频器是利用计数值可并行预置的加法计数器设计完成的。

2.1.2源程序及波形仿真

module clk_gen   (clk_33m,    //system input clock;
                            rst,        //system reset;
                            clk_1,      //output 1hz clock
                            clk_8,      //output 8hz clock
                            clk_16,     //output 16hz clock
                            clk_32,     //output 32hz clock
                            clk_32k);   //output 32khz clock

input clk_33m,rst;
output clk_1,clk_8,clk_16,clk_32,clk_32k;

wire clk_33m,rst;
reg [24:0] count;
wire clk_32k,clk_1,clk_8,clk_16,clk_32;

//************* clock generator****************************

  always @(posedge clk_33m or negedge rst)
              if (!rst)
                            count<=25'd0;
              else
                 count<=count+1'b1;

  assign clk_1=count[24];
  assign clk_32k=count[9];
  assign clk_8=count[21];
  assign clk_16=count[20];
  assign clk_32=count[19];

endmodule



图2-1 分频器时序仿真


2.1.3分频器RTL 电路图


图2-2 分频器RTL电路图

2.2计数器的设计

2.2.1分频器设计原理

计数是一种最简单基本的运算,计数器就是实现这种运算的逻辑电路,计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能,计数器是由基本的计数单元和一些控制门所组成,计数单元则由一系列具有存储信息功能的各类触发器构成,这些触发器有RS触发器、T触发器、D触发器及JK触发器等。计数器在数字系统中应用广泛,如在电子计算机的控制器中对指令地址进行计数,以便顺序取出下一条指令,在运算器中作乘法、除法运算时记下加法、减法次数,又如在数字仪器中对脉冲的计数等等。计数器可以用来显示产品的工作状态,一般来说主要是用来表示产品已经完成了多少份的折页配页工作。它主要的指标在于计数器的位数,常见的有3位和4位的。很显然,3位数的计数器最大可以显示到999,4位数的最大可以显示到9999。在数字电子技术中应用的最多的时序逻辑电路。计数器不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。但是并无法显示计算结果,一般都是要通过外接LCD或LED屏才能显示。

2.2.2六十进制计数器

odule COUNT_60  (clk,        //count input clock;
                            rst,        //system reset;
                            rco,        //carry output
                            q);         //BCD code output

input clk,rst;
output reg rco;
output [6:0] q;

wire clk,rst;
reg [6:0] q;
reg en;


//*********************************************************


always @(posedge clk or negedge rst)

    if (!rst) q[3:0]<=4'd0;
    else if(q[3:0]==4'd8) begin q[3:0]<=q[3:0]+1'b1; en<=1'b1;  end
         else  if (q[3:0]==4'd9) begin q[3:0]<=4'd0;  en<=1'b0;       end
               else              begin q[3:0]<=q[3:0]+1'b1; en<=1'b0; end


always @(posedge clk or negedge rst)

    if (!rst) q[6:4]<=3'd0;
    else if (en)
           begin
            if (q[6:4]==3'd5)  begin q[6:4]<=3'd0; rco<=1'b1;            end
            else               begin q[6:4]<=q[6:4]+1'b1; rco<=1'b0;     end
           end
         else ;

Endmodule

2.2.3RTL电路图

图2-3六十进制计数器RTL电路图

2.3锁存器的设计2.3.1锁存器设计原理

所谓锁存器,就是输出端的状态不会随输入端的状态变化而变化,仅在有锁存信号时输入的状态被保存到输出,直到下一个锁存信号到来时才改变。典型的锁存器逻辑电路是D 触发器电路。在LED和数码管显示方面,要维持一个数据的显示,往往要持续的快速的刷新。尤其是在四段八位数码管等这些要选通的显示设备上。在人类能够接受的刷新频率之内,大概每三十毫秒就要刷新一次。这就大大占用了处理器的处理时间,消耗了处理器的处理能力,还浪费了处理器的功耗。锁存器的使用可以大大的缓解处理器在这方面的压力。当处理器把数据传输到锁存器并将其锁存后,锁存器的输出引脚便会一直保持数据状态直到下一次锁存新的数据为止。这样在数码管的显示内容不变之前,处理器的处理时间和IO引脚便可以释放。可以看出,处理器处理的时间仅限于显示内容发生变化的时候,这在整个显示时间上只是非常少的一个部分。而处理器在处理完后可以有更多的时间来执行其他的任务。这就是锁存器在LED和数码管显示方面的作用:节省了宝贵的MCU时间。


2.3.2锁存器源程序及波形仿真

module sem_drive (oSEG0,
                  oSEG1,
                  oSEG2,
                  oSEG3,
                  oSEG4,
                  oSEG5,
                  oSEG6,
                  oSEG7,   //output to 8 SEG
                  iDIG );  //input 8-BCD code (4*8=32bit)
input              [31:0]              iDIG;
output              [6:0]              oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7;

wire              [31:0]              iDIG;
wire              [6:0]              oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7;


  SEG7_LUT              U0              (.oSEG(oSEG0),.iDIG(iDIG[3:0]));
  SEG7_LUT              U1              (.oSEG(oSEG1),.iDIG(iDIG[7:4]));
  SEG7_LUT              U2              (.oSEG(oSEG2),.iDIG(iDIG[11:8]));
  SEG7_LUT              U3              (.oSEG(oSEG3),.iDIG(iDIG[15:12]));
  SEG7_LUT              U4              (.oSEG(oSEG4),.iDIG(iDIG[19:16]));
  SEG7_LUT              U5              (.oSEG(oSEG5),.iDIG(iDIG[23:20]));
  SEG7_LUT              U6              (.oSEG(oSEG6),.iDIG(iDIG[27:24]));
  SEG7_LUT              U7              (.oSEG(oSEG7),.iDIG(iDIG[31:28]));

Endmodule
图2-4 锁存器时序仿真图
2.2.3存器RTL 电路图
图2-5 锁存器RTL电路图
2.4显示部分的设计
2.4.1七段数码管显示原理

对于人机交互式单片机系统来说,不仅需要响应用户输入,同时也需要将一些测控信息输出显示。这些显示信息可以提供实时的数据或图形结果,以便于掌握系统的状态并进行分析处理。目前,最常用的是LED数码管显示。其成本低廉、使用简便,可以显示数字或几个特定的字符。数码管数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个发光二极管单元,其基本单元是发光二极管。数码管通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示时间、日期、温度等所有可用数字表示的参数的器件。在电器特别是家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。

2.4.2七段数码管显示源程序及波形仿真
module SEG7_LUT              (oSEG,  //output SEG7 code
                 iDIG); //input BCD code
input              [3:0]              iDIG;
output              [6:0]              oSEG;
reg                            [6:0]              oSEG;

//      --a--
//     |     |
//     f     b
//     |     |
//      --g--
//     |     |
//     e     c
//     |     |
//      --d--  O DP

   always @(iDIG)
                case(iDIG)      //gfedcba
                            4'h0: oSEG = 7'b1000000;    //display 0;
                            4'h1: oSEG = 7'b1111001;              //display 1;
                            4'h2: oSEG = 7'b0100100;               //display 2;
                            4'h3: oSEG = 7'b0110000;               //display 3;
                            4'h4: oSEG = 7'b0011001;               //display 4;
                            4'h5: oSEG = 7'b0010010;               //display 5;
                            4'h6: oSEG = 7'b0000010;               //display 6;
                            4'h7: oSEG = 7'b1111000;               //display 7;
                            4'h8: oSEG = 7'b0000000;               //display 8;
                            4'h9: oSEG = 7'b0010000;    //display 9;
//                            4'ha: oSEG = 7'b0001000;    //display A;
                            4'ha: oSEG = 7'b0111111;    //display - for clock;
                            4'hb: oSEG = 7'b0000011;    //display B;
                            4'hc: oSEG = 7'b1000110;    //display C;
                            4'hd: oSEG = 7'b0100001;    //display D;
                            4'he: oSEG = 7'b0000110;    //display E;
                            4'hf: oSEG = 7'b0001110;    //display F;
              endcase

Endmodule

3系统顶层设计

3.1自顶向下的设计方法

所谓自顶向下设计方法,就是采用可完全独立于芯片厂商及其产品结构的描述语,在功能级对设计产品进行定义,并结合功能仿真技术,以确保设计的正确性,能定义完成后,利用逻辑综合技术,把功能描述转换成某一具体结构芯片的网表文件,输出给厂商的布局布线器进行布局布线。布局布线结果还可反标回同一仿真器,进行包括功能和时序的后验证,以保证布局布线所带来的门延时和线延时不会影响设计的性能。

自顶向下设计方法的优越性是显而易见的。首先,由于功能描述可完全独立于芯片结构,在设计的最初阶段,设计师可不受芯片结构的约束,集中精力进行产品设计,避免了传统设计方法所带来的重新再设计风险,大大缩短了设计周期。其次,设计的再利用得到保证。目前的电子产品正向模块化发展所谓模块化就是对以往设计成果进行修改,组合和再利用,产生全新的或派生设计,而自顶向下设计方法的功能描述可与芯片结构无关。因此可以以一种IP的方式进行存档,以便将来的重新利用。 第三,设计规模大大提高。简单的语言描述即可完成复杂的功能,而不需要手工绘图。第四,芯片选择更加灵活。设计师可在较短的时间内采用各种结构芯片来完成同一功能描述,从而在设计规模、速度、芯片价格及系统性能要求等方面进行平衡,选择最佳结果。

3.2顶层设计源程序及其仿真波形

module sem_drive (oSEG0,
                  oSEG1,
                  oSEG2,
                  oSEG3,
                  oSEG4,
                  oSEG5,
                  oSEG6,
                  oSEG7,   //output to 8 SEG
                  iDIG );  //input 8-BCD code (4*8=32bit)
input              [31:0]              iDIG;
output              [6:0]              oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7;

wire              [31:0]              iDIG;
wire              [6:0]              oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7;


  SEG7_LUT              U0              (.oSEG(oSEG0),.iDIG(iDIG[3:0]));
  SEG7_LUT              U1              (.oSEG(oSEG1),.iDIG(iDIG[7:4]));
  SEG7_LUT              U2              (.oSEG(oSEG2),.iDIG(iDIG[11:8]));
  SEG7_LUT              U3              (.oSEG(oSEG3),.iDIG(iDIG[15:12]));
  SEG7_LUT              U4              (.oSEG(oSEG4),.iDIG(iDIG[19:16]));
  SEG7_LUT              U5              (.oSEG(oSEG5),.iDIG(iDIG[23:20]));
  SEG7_LUT              U6              (.oSEG(oSEG6),.iDIG(iDIG[27:24]));
  SEG7_LUT              U7              (.oSEG(oSEG7),.iDIG(iDIG[31:28]));

endmodule
3.2.1系统顶层RTL 电路图

图3-1系统顶层RTL 电路图

4总结

在这次设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。对于教材管理系统,其程序是比较简单的,主要是解决程序设计中的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。因此在整个设计过程中大部分时间是用在程序上面的。很多子程序是可以借鉴书本上的,但怎样衔接各个子程序才是关键的问题所在,这需要对系统的结构很熟悉。通过这次设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。



完整的Word格式文档51黑下载地址:

肖力全20125024033.doc (422 KB, 下载次数: 17)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表