FPGA技术

基于FPGA的30秒可控计时系统设计

摘  要

随着数字电路和嵌入式系统的不断发展,FPGA技术得到了广泛应用,尤其是在需要高并行性和可定制性的平台中。设计并实现了一种基于Verilog HDL与FPGA的30秒可控计时系统。该系统通过FPGA开发平台和Verilog语言实现,目的是深入理解FPGA的开发流程、提高硬件设计能力,解决在计时精度、外部控制、时序逻辑等方面的挑战。

使用Verilog HDL语言进行设计,采用Quartus II进行硬件综合与实现,ModelSim进行仿真与验证。实现一个能够精确计时并具备启动、暂停、复位等控制功能的计时系统,计时时间为30秒,可以通过外部信号对计时系统进行控制。

设计利用Verilog HDL语言编写了计时器模块,设定了计时器递减逻辑,并通过外部信号控制计时的启动、暂停与复位。为了验证设计的功能,采用了ModelSim进行仿真,利用波形图分析了时序逻辑和各控制信号的变化。

设计过程中,明确了系统的需求,设计了计时器的核心模块,包括时钟分频、计时控制和显示控制。采用了Quartus II软件进行开发与编译,并使用ModelSim工具进行仿真验证。硬件验证通过将设计上传到Cyclone IV E系列FPGA开发板进行测试,确保系统功能的实现。最终,设计出的计时系统具有较高的运行稳定性和精确度,并支持外部信号调节。

设计仅提高了对Verilog HDL语言的应用能力,还增强了在FPGA设计和仿真验证方面的实践经验。通过课程设计,我进一步理解了硬件设计的流程与挑战,并为未来在嵌入式系统和FPGA应用方面的深入学习奠定了基础。

关键词:Verilog HDL;FPGA;计时系统;Quartus II;ModelSim

 

目  录

1概述........................................................................................ 1

1.1设计背景........................................................................ 1

1.2设计的目的与问题........................................................ 1

1.3设计方法与过程............................................................ 1

1.4设计究的成果与发现.................................................... 1

1.5设计意义........................................................................ 1

2开发环境与FPGA原理介绍................................................... 3

2.1开发环境........................................................................ 3

2.1.1 Quartus II软件.................................................... 3

2.1.2 FPGA开发板...................................................... 3

2.1.3仿真环境(ModelSim).................................... 3

2.1.4 编程工具(USB-Blaster)................................ 3

2.1.5 引脚分配与约束环境........................................ 3

2.1.6 硬件调试工具(SignalTap II)........................ 4

2.2 FPGA原理..................................................................... 4

3十六进制计数器的建模与测试............................................... 5

3.1工程创建........................................................................ 5

3.2 HDL建模....................................................................... 8

3.3编译综合........................................................................ 9

............................................................................................ 10

3.4 RTL视图分析.............................................................. 10

3.4.1RTL试图的主要功能........................................ 10

3.4.2在Quartus II中使用RTL试图....................... 10

3.5硬件编程...................................................................... 11

3.6外围电路设计.............................................................. 12

............................................................................................ 13

3.7物理验证...................................................................... 13

4 30秒可控计时系统的建模与仿真........................................ 19

4.1方案论证及选择.......................................................... 19

4.1.1系统功能需求分析........................................... 19

4.1.2设计方案论证................................................... 19

4.1.3 设计选择.......................................................... 20

4.3 HDL建模..................................................................... 21

4.4 RTL视图...................................................................... 23

4.4 仿真分析..................................................................... 23

4.4.1时钟信号........................................................... 23

4.4.2复位操作........................................................... 24

4.4.3启动和暂停操作............................................... 24

4.4.4计时器递减过程............................................... 25

4.4.5报警信号........................................................... 25

4.4.6 ModelSim仿真分析......................................... 25

5总结及体会............................................................................. 27

参考文献.................................................................................... 28

致  谢........................................................................................ 29

附  录........................................................................................ 30

答辩记录表................................................................................ 35

答辩成绩表................................................................................ 36

1概述

1.1设计背景

随着数字电路和嵌入式系统的发展,FPGA(现场可编程门阵列)技术在许多应用中得到了广泛应用。FPGA具有高度的并行性和可定制性,能够为不同应用提供灵活的解决方案。在实际项目中,计时系统是一个常见且重要的应用场景,尤其是在需要精确时间控制和可调节的系统中,30秒可控计时器的实现对于日常生产、实验室实验等领域具有重要的意义。

1.2设计的目的与问题

目的:课题的主要目标是设计并实现一个基于Verilog HDL与FPGA的30秒可控计时系统。通过该项目,旨在深入理解FPGA开发流程、Verilog语言的应用,并提高在设计过程中对硬件电路的掌控能力。

问题:在实现过程中,可能面临如下挑战:

1.如何设计一个稳定、准确的计时模块?

2.如何确保30秒可控的精度,并使其能够通过外部输入进行调整?

3.如何使用Verilog语言高效实现计时系统的逻辑,并与FPGA进行正确的映射?

1.3设计方法与过程

研究方法:课题采用FPGA平台作为硬件开发环境,Verilog HDL作为硬件描述语言来实现系统设计。研究方法主要包括以下几个步骤:

需求分析:明确系统需要实现的基本功能和性能要求。

模块设计:设计计时器的核心模块,如时钟分频模块、计时控制模块、显示控制模块等。

硬件实现:基于FPGA开发箱,使用Verilog编写硬件描述代码。

仿真验证:通过仿真工具验证设计逻辑的正确性,确保计时系统能够稳定运行。

硬件验证:将设计上传到FPGA开发箱,进行实际测试,验证功能实现和性能

1.4设计究的成果与发现

成果:通过该课题的研究,我们成功设计并实现了一个能够精确计时30秒并支持可控调整的计时系统。系统能够根据外部输入的信号进行灵活控制,实现了数字显示与计时控制功能。基于FPGA的硬件实现方式,使得计时系统具备了较高的运行稳定性和响应速度。

发现:在设计过程中,遇到了一些挑战,如时钟信号的准确生成、外部控制信号的处理等。通过查阅资料并多次进行实验调试,最终找到了最佳的解决方案。此外,使用Verilog进行硬件设计能够有效提升代码的模块化程度,使得系统更加灵活和可扩展。

1.5设计意义

通过这个课题的实践,不仅加深了对FPGA开发和Verilog HDL的理解,而且掌握了如何将理论与实际硬件应用结合。对于从事嵌入式系统设计与开发具有重要的意义,也为更复杂的系统设计打下了坚实的基础。

2开发环境与FPGA原理介绍

2.1开发环境

2.1.1 Quartus II软件

Quartus II提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,包括:

1. 可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;

2. 芯片(电路)平面布局连线编辑;

3. 功能强大的逻辑综合工具;

4. 完备的电路功能仿真与时序逻辑仿真工具;

5. 定时/时序分析与关键路径延时分析;

6. 支持软件源文件的添加和创建,并将它们链接起来生成编程文件;

7. 使用组合编译方式可一次完成整体设计流程;

8. 自动定位编译错误;

9. 高效的期间编程与验证工具;

10.可读入标准的EDIF网表文件、VHDL网表文件和Verilog网表文件;

11.能生成第三方EDA软件使用的VHDL网表文件和Verilog网表文件。

2.1.2 FPGA开发板

使用Cyclone IV E系列的EP4CE55F23C8:P4CE55F23C8是由Intel(之前是Altera)制造的Cyclone IV E系列中的一款低成本、低功耗FPGA芯片,具有55,000个逻辑元素,特别适合中等规模的逻辑设计。它广泛应用于需要一定计算和处理能力、但又要求成本和功耗较低的嵌入式系统、工业控制、消费电子和通信等领域。

2.1.3仿真环境(ModelSim)

Quartus II与ModelSim仿真工具一起使用,进行逻辑仿真,确保设计的正确性。在设计过程中,使用它来验证Verilog代码的时序和逻辑功能。

2.1.4 编程工具(USB-Blaster)

使用USB-Blaster编程器等工具,将编译生成的配置文件下载到FPGA开发板上进行硬件测试和验证。

2.1.5 引脚分配与约束环境

使用了Quartus II的引脚分配工具(通过.qsf文件)来配置FPGA开发板的物理引脚,以便正确连接外设,按钮、显示器。

2.1.6 硬件调试工具(SignalTap II)

调试问题,使用Quartus II内置的SignalTap II Logic Analyzer工具来在实际硬件中捕获信号和波形,进行调试。

2.2 FPGA原理

FPGA采用一种基于门阵列的结构,每一个芯片由二维的逻辑块构成,每一个逻辑块有水平和垂直的布线通道连接。FPGA有多种配置模式:并行主模式为一片FPGA加一片EPPROM编程FPGA;外设模式将FPGA作为微处理器的外设,由微处理器对其编程。当器件加电时,FPGA芯片将 EEPROM中的数据读入片内编程RAM中。配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失。因此,FPGA能够反复使用。FPGA的编程无需专用的FPGA编程器,只需通用的EEPROM、PROM编程器即可。同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。 [1]

FPGA中的所有信号可以分为时钟、控制信号和数据三种。简单的时钟信号用于控制所有的边缘敏感触发器,不受任何其他信号的限制。控制信号,如“允许”和“复位”,用于电路元件初始化,使之保持在当前状态,在几个输入信号间做出选择或使信号通到另外的输出端。数据信号中含有数据,它可以是一些单独的比特,也可以是总线中的并行数据。

在FPGA的设计中,可将所有的设计元素抽象成五类用于组成分层结构设计的基本单元:

1. 布尔单元,包含反相器和“与”“或”“非”“与非”“异或”门等。

2. 开关单元,包含传输门、多路选择器和三态缓冲器。

存储单元,包含边缘敏感器件。

控制单元,包含译码器、比较器。

数据调整单元,包含加法器、乘法器、桶形移位器、编码器。

在设计中只要明确定义所用基本单元类别就可以避免所谓的“无结构的逻辑设计”,在较短的设计时间内得到清晰的、结构完善的FPGA设计。

FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。 [3]

3十六进制计数器的建模与测试

3.1工程创建

1. Project directory:

1

图3.1选择文件路径


D:\q21001项目文件存放的路径,项目文件保存在这个目录下。

2. Project name

T30:项目指定的名称。项目的名称是T30。

3. Top-level design entity

T30顶层设计实体是指设计中最上层的模块,通常是系统的整体模块。这个项目的顶层设计实体是T30。

4. Number of files added

0表示当前项目中没有文件被添加。在创建项目时,文件还没有被导入或添加到项目中。

5. Number of user libraries added

0表示项目中没有用户自定义库被添加。

6. Device assignments

这个部分显示了你选择的FPGA设备和相关设置:

Design template: n/a没有选择设计模板。

Family name: Cyclone IV E选择了Intel (原Altera) Cyclone IV E系列FPGA。

Device: EP4CE55F23C8选择的FPGA型号是EP4CE55F23C8。

2

图3.2选择开发板型号


Board: n/a没有选择特定的开发板。

7. EDA tools

这个部分描述了将使用的EDA工具:

Design entry/synthesis: <None>(<None>)没有指定设计输入或综合工具。

Simulation: ModelSim (Verilog HDL)选择了ModelSim作为仿真工具,用于Verilog HDL设计的仿真。

Timing analysis: 0表示没有指定时序分析工具。

2

图3.3选择仿真环境

8. Operating conditions

这部分定义了FPGA的工作条件:

VCCINT voltage: 1.2V
FPGA的内部电压为1.2V。

Junction temperature range: 0-85°C
设计的温度范围是0°C到85°C之间。

项目基本信息如图3.1

图3.4所有创建信息

3.2 HDL建模

HDL建模

module coU16(

    input CLK, RST, EN, LOAD,       // 输入信号

    input [3:0] DATA,               // 4位数据输入

    output [3:0] DOUT,              // 4位数据输出

    output COUT                     // 输出进位

);

    reg [3:0] Q1;                   // 4位寄存器

    reg COUT;                       // 进位输出

    // 赋值操作

    assign DOUT = Q1;

    // 同步复位和使能控制的时序逻辑

    always @(posedge CLK or negedge RST) begin

        if (!RST) 

            Q1 <= 4'b0000;          // 复位时寄存器清零

        else if (EN) begin

            if (!LOAD) 

                Q1 <= DATA;         // 加载数据

            else if (Q1 < 16) 

                Q1 <= Q1 + 1;      // 如果Q1小于16,则加1

            else 

                Q1 <= 4'b0000;      // 超过16则重置为0

        end

    end

    // 计算进位输出

    always @(Q1) begin

        if (Q1 == 15)

            COUT = 1'b1;            // Q1等于15时,产生进位

        else

            COUT = 1'b0;            // 否则没有进位

    end

endmodule

3.3编译综合

1.解析:Quartus II解析HDL代码,理解设计的结构和行为。检查语法错误并构建出设计的中间表示。如下图3.2代码运行无误

图3.2编译成功

2.编译综合的结果:

  1. Flow Status:显示编译过程的状态,“Successful”,表示编译已成功完成。
  2. Quartus Prime Version:指明使用的Quartus Prime版本。
  3. Revision Name:设计的版本名称。
  4. Top-level Entity Name:设计的顶层实体(模块)名称。
  5. Family:目标设备的系列,此处为“Cyclone IV E”。
  6. Device:目标设备的型号,这里是“EP4CE55F23C8”。
  7. Timing Models:表示时序模型的状态,此时显示为“Final”,表示时序分析已完成。
  8. Total logic elements:所使用的逻辑元素总数,这里是“78/55,856(<1%)”,表示使用了78个逻辑元素,占总资源的不到1%。
  9. Total registers:使用的寄存器数量,39个寄存器。
  10. Total pins:使用的引脚数量,“19/325(6%)”表示使用了19个引脚,占总引脚数的6%。
  11. Total virtual pins:虚拟引脚数量,这里显示为0/2,396,160,表示没有虚拟引脚使用。
  12. Embedded Multiplier 9-bit elements:嵌入式9位乘法器元素数量,0/308表示未使用这些元素。
  13. Total memory bits:使用的内存位数,显示为0,表示未使用内存资源。
  14. Total PLLs:使用的相位锁定环(PLLs)数量,显示为0/4,表示未使用PLL。

如图3.3

图3.3使用资源显示

3.4 RTL视图分析

3.4.1RTL试图的主要功能

可视化设计结构:显示设计中各个模块(例如寄存器、加法器、MUX等)以及它们之间的连接关系。通过RTL试图,查看设计在逻辑级别上的细节,理解电路如何工作。

模块层次结构:展示设计的层次结构,理解各个模块及其子模块的关系。

信号跟踪:可以在RTL视图中查看信号流,跟踪数据如何在不同模块之间传递。

简化调试过程:通过观察RTL视图,可以轻松识别潜在的设计问题,如不合适的信号连接或数据流路径问题。

3.4.2在Quartus II中使用RTL试图

打开设计项目:在Quartus II中打开你的项目文件。

编译设计:确保设计已经通过了编译过程,RTL视图依赖于综合后的结果。

打开RTL试图:

在Quartus II主界面,点击顶部菜单中的 "Assignments" → "Settings",选择**"RTL Viewer"**。

或者通过 Tools → "RTL Viewer" 打开工具。

分析设计:在RTL视图中,可以查看设计的模块、寄存器、信号和连接方式。如图3.4

图3.4 RTL图

3.5硬件编程

硬件编程:将综合后的网表文件下载到FPGA开发板上。

配置引脚,将计数器的输出引脚映射到FPGA开发板的实际引脚上。

双击Location栏对应的信号位置,输入键入对应的引脚,再按回车键,依次下去,输入所有的引脚信号。完成后的情况如图3-5所示。

(2)必须再编译一次,即启动Start Compilation。以后每改变一次引脚或其他设置,都要重新编译后才能将引脚锁定信息编译进编程下载文件中。就可以准备将编译好的文件下载到实验系统的FPGA中了。

图3.5引脚口

62

图3.6烧录文件


(3)打开编程窗和配置窗口。在工程管理窗口中,双击图3 .6左上角所示的programming file项,弹出如图3.18所示的窗口,选择Tools→Programmer命令,弹出如图3 . 11所示的编程窗口。

3.6外围电路设计

1. 数码管与译码器连接

数码管:共有8个数码管用于显示计时系统的当前值。每个数码管控制一个数字或字符的显示。

译码器:每个数码管通过一个译码器与FPGA连接。译码器将FPGA的二进制输出转换为数码管可识别的段码,从而使数码管显示正确的数字或字符。

连接方式:每个译码器接收FPGA的输出信号,将其解码后通过数码管的段码引脚控制各个段的显示。

2. 按键设计

按键布局:系统提供8个按键,用于用户与计时系统进行交互,功能包括清零、装数、启动、暂停等。

连接方式:

按键通过PIO接口与FPGA相连,具体为PIO7、PIO6、PIO5等引脚。

按键信号经过HEX模块,然后传递到FPGA进行处理。

2如图3.7

615eccb4e9bfcc868163719948d7c00

图3.7 外围电路设计


3.7物理验证

按键布局:图中有8个按键,分别标记为键8 -键1。按键是用户与计时系统进行交互的重要输入设备,用于实现各种控制功能。

验证方式:初始灯全灭,键5、键6、键7按亮属于高脉冲,当按下键8时数值发生变化,数码管1开始计数,按一次键8记一次数值,0计到16,0-9正常显示,10-15由十六进制数A-F显示。如图3.8所示。

图3.8按键显示

4 30秒可控计时系统的建模与仿真

4.1方案论证及选择

设计任务是基于Verilog HDL与FPGA开发30秒可控计时系统,系统要求能够在一定的控制条件下进行倒计时,并具有启动、暂停、重载、清除报警等功能。计时系统不仅需要精确地显示倒计时剩余时间,还需要在倒计时结束时触发报警,并能够通过外部输入信号进行控制。以下是对设计方案的论证及选择过程。

4.1.1系统功能需求分析

倒计时功能:系统应能从预设的倒计时值(30秒)开始计时,并每秒递减。当倒计时值到达零时,系统需要触发报警信号。

启动、暂停控制:系统应能根据外部输入信号启动和暂停计时,暂停时计时器应暂停递减,启动后继续计时。

重载功能:系统应能根据外部信号加载一个新的倒计时初值(load_val),允许用户修改倒计时的初值。

报警功能:当倒计时到达零时,系统应发出报警信号。外部输入的清除报警信号应能将报警状态清除。

显示功能:使用七段显示器实时显示倒计时数字,以便用户查看剩余时间。

4.1.2设计方案论证

1. 时钟分频器设计

时钟分频是本设计中的关键组件之一。由于FPGA的时钟频率通常较高,设计中需要通过时钟分频器将系统时钟降低至1 Hz(1秒的周期),以确保倒计时按秒递减。时钟分频器可以通过计数器进行实现,每当分频器达到设定值时,输出1 Hz的时钟信号。根据系统时钟为50 MHz的假设,可以设置分频器的值为49999999,这样每1秒钟生成一次时钟信号,驱动倒计时模块。

2. 倒计时计时器设计

计时器模块是核心功能之一。倒计时计时器的初始值为30秒,当启动信号激活时,计时器开始递减,并在每秒钟时钟脉冲到达时递减1。计时器还需要支持暂停控制信号,当接收到暂停信号时,计时器停止递减。重载信号则允许外部加载新的倒计时初值,并立即开始倒计时。倒计时计时器设计需要确保在重载和暂停时,计时器状态的正确性和稳定性。

3. 显示模块设计

为了让用户清楚地看到倒计时的进展,系统需要将倒计时值通过七段显示器显示。七段显示器的编码需要根据每个数字的显示形式进行配置。当计时器的值发生变化时,显示模块会实时更新数码管显示内容,确保准确反映当前倒计时值。

4. 报警功能设计

当计时器倒计时至零时,系统需要触发报警信号。该报警信号可以驱动外部设备或指示灯,提醒用户倒计时已经结束。系统应能根据外部输入的清除报警信号,取消报警并恢复正常状态。报警模块需要与计时器模块协同工作,在倒计时结束时能够及时响应。

5. 控制信号设计

本系统包括多个外部控制信号:启动、暂停、重载、清除报警等。控制信号需要通过FPGA输入端口接收,并驱动相应的功能模块。控制信号的设计要求在实现简单的逻辑控制时,确保能够稳定、准确地响应外部信号。

4.1.3 设计选择

1. FPGA芯片选择

设计使用FPGA芯片来实现倒计时系统,FPGA具有高度的并行处理能力和灵活性,非常适合用于实现该系统。通过Verilog HDL进行设计,可以充分发挥FPGA的优势,进行时钟分频、计时器逻辑、显示控制等模块的设计。FPGA具有丰富的IO接口,可以方便地与外部设备进行交互

2. 编程语言选择

该系统采用Verilog HDL进行设计,Verilog是一种广泛应用于硬件描述的语言,适用于FPGA开发。Verilog具有强大的描述能力,能够高效地实现时序逻辑和组合逻辑的设计。使用Verilog进行开发,可以清晰地定义时序和状态转换,便于调试和验证。

3. 时钟分频方案

时钟分频使用简单的计数器方式进行实现,利用FPGA的时钟信号通过分频器生成1 Hz时钟脉冲,用于驱动倒计时器。时钟分频的设计简洁有效,能够确保倒计时系统按秒准确递减。

4. 显示模块选择

使用七段显示器来实时显示倒计时的数字。七段显示器是常用的显示设备,成本低、实现简单,并且在倒计时系统中有很好的可视化效果。每个数字的显示可以通过预先定义的编码来控制,从而确保每个数字的正确显示。

5. 控制模块实现

控制模块实现通过简单的逻辑控制电路来完成启动、暂停、重载和清除报警功能。Verilog中的时序控制使得信号控制更加精确和可靠,避免了外部硬件的复杂性。系统的控制模块设计简洁,能够满足倒计时操作和报警控制的需求。

4.3 HDL建模

HDL建模

module T30 (

    input clk,          

    input start,       

    input pause,         

    input load,         

    input [4:0] load_val,

    input clear_alarm,   

    output reg [6:0] display,  

    output reg alarm   

);

    reg [4:0] counter;       

    reg [31:0] clk_divider;  

    reg clk_1s;              

    

    // 时钟分频器

    always @(posedge clk or posedge reset) begin

        if (reset)

            clk_divider <= 0;

        else if (clk_divider == 49999999) // 假设系统时钟为 50 MHz,分频至 1 Hz

            clk_divider <= 0;

        else

            clk_divider <= clk_divider + 1;

    end

    

    // 生成1秒时钟信号

    always @(posedge clk or posedge reset) begin

        if (reset)

            clk_1s <= 0;

        else if (clk_divider == 49999999)

            clk_1s <= 1;

        else

            clk_1s <= 0;

    end

    

    // 倒计时计时器

    always @(posedge clk_1s or posedge reset) begin

        if (reset)

            counter <= 30; 

        else if (start && !pause) begin

            if (counter > 0)

                counter <= counter - 1;

        end

        else if (load) begin

            counter <= load_val; 

        end

    end

    

    // 显示模块

    always @(counter) begin

        case (counter)

            30: display = 7'b0111111;  

            29: display = 7'b0000110;  

            28: display = 7'b1011011; 

            27: display = 7'b1001111;

            default: display = 7'b1111111; /

        endcase

    end

    

    // 报警功能

    always @(posedge clk_1s or posedge reset) begin

        if (reset)

            alarm <= 0;  /

        else if (counter == 0)

            alarm <= 1;  

        else if (clear_alarm)

            alarm <= 0; 

    end

endmodule

4.4 RTL视图

逻辑验证:通过查看RTL视图,如图4-1所示,可以验证HDL代码所描述的逻辑是否正确实现,包括计时器的递减逻辑、控制模块的状态转换逻辑等。

性能优化:RTL视图有助于识别设计中的瓶颈和冗余逻辑,从而进行性能优化,如减少关键路径上的延迟、优化资源利用等。

调试辅助:在调试过程中,RTL视图可以作为参考,帮助定位问题所在,如信号的不正确传输、寄存器状态的异常变化等。如图4.1为30秒可控计时系统的RTL试图

图4.1

4.4 仿真分析

4.4.1时钟信号

验证:时钟信号的仿真确认它是否按照设计要求的频率(如1 Hz)产生脉冲。

分析:在ModelSim中,通过查看波形图可以确认时钟的周期是否准确。时钟信号的稳定性是整个系统时序同步的基础,确保时钟信号在每一秒内正确触发事件。输入时钟信号显示011111表示未30秒如图4.2

图4.2时钟信号30MS

4.4.2复位操作

验证:复位信号是设计中非常重要的一部分,确保在启动时计时器能够正确地从预定的初始状态(30秒)开始。

图4.3输入信号为高电平

分析:在仿真中,检查复位操作是否能将计时器从任何状态重置到30秒。例如,可以查看复位信号触发后,计时器值是否回到30秒,并且显示模块是否同步更新。如图信号复位

4.4.3启动和暂停操作

验证:启动信号应该让计时器开始递减,而暂停信号应让计时器停止递减并保持当前值。

分析:通过波形图观察启动信号是否能使计时器递减。对于暂停信号,可以验证暂停后计时器是否能够正确地保持当前值,而不继续递减。暂停功能的验证主要涉及控制信号的精确时序。

4.4.4计时器递减过程

验证:计时器是否按照每秒递减一次的规律从30秒递减到0,并且在递减到0后保持显示。

分析:使用ModelSim的波形图来查看计时器的递减过程,确认它是否每秒减1,并且检查在倒计时到0时,是否能够保持最后的显示值。你也可以验证计时器在0秒后是否能准确地触发报警。

4.4.5报警信号

验证:当计时器递减到0时,报警信号是否被触发,并在解除后恢复。

分析:可以通过观察波形图中的报警信号来验证它是否在计时器到达0时准确触发。还需要检查当报警解除后,系统是否恢复到初始状态或正常操作模式,确保报警信号的清除没有造成系统异常。如图输入高电平警报响起,计时器开始复位

图4.4输入信号为低电平

 

4.4.6 ModelSim仿真分析

在ModelSim中进行仿真时,你可以创建一个测试平台来模拟外部输入信号

仿真波形图生成后,可以详细分析各个信号的变化情况。时序同步是关键点,确保所有信号(如时钟、控制信号、报警信号等)按设计预期工作,避免由于时序错误而引发的功能失效。如图4-2

图4.5显示为0111111

5总结及体会

在进行《Verilog HDL与FPGA应用课程设计》时,使用Quartus II与ModelSim进行仿真验证,整个过程让我对硬件描述语言(HDL)的应用和仿真验证有了更加深入的理解。通过设计并仿真一个30秒可控计时系统,我获得了许多宝贵的实践经验,以下是我对本次设计和仿真分析的总结及体会:

1. 硬件描述语言(Verilog)应用

通过使用Verilog HDL语言,我学会了如何描述硬件系统的功能和结构。Verilog代码的编写不仅帮助我明确了各个模块的功能,还让我更清晰地理解了硬件设计中的时序逻辑。比如,在设计计时器递减、启动、暂停等功能时,我必须清楚各个信号之间的依赖关系,并确保它们在正确的时刻激活。

2. 仿真验证的重要性

在硬件设计中,仿真分析是不可或缺的一步。通过ModelSim进行仿真,我能够及时发现设计中的潜在问题并加以解决。特别是在时钟信号、复位操作、计时器递减等关键功能的验证中,仿真帮助我确保设计按照预期工作。,在复位信号验证中,我发现了初始状态未正确重置计时器的问题,通过检查信号波形并调整代码,最终解决了这一问题。

3. 测试平台的设计

在仿真中,测试平台(Testbench)起到了至关重要的作用。它模拟了外部控制信号,帮助我模拟了启动、暂停、装数等操作,并且确保各个模块在实际运行中能够正确地响应外部事件。通过测试平台的设计,学到了如何通过模拟输入信号来验证硬件系统的功能。

4. 波形分析与时序

ModelSim提供了详细的波形图,帮助我对各个信号的变化进行直观的分析。时序分析是硬件设计中的一个关键环节,仿真中的波形图展示了各个控制信号和计时器状态的变化过程。通过这些波形,我能够快速判断设计中的时序是否符合预期,并且调整代码优化时序。

5. 问题解决与优化

在仿真过程中,我遇到了一些设计上的问题,如时钟同步问题、暂停功能的实现问题等。每当遇到问题,我都会仔细查看波形图、复查Verilog代码,并通过理论知识和实际调试逐步解决。这一过程锻炼了我的问题解决能力,让我意识到硬件设计的复杂性和挑战性。

通过本次设计与仿真过程,我不仅提升了硬件设计和仿真技能,还加深了对FPGA应用和Verilog语言的理解。仿真分析为我提供了一个强有力的工具,用于验证和优化设计。今后的学习中,我将继续借助仿真工具,不断优化硬件系统的稳定性和可靠性,并进一步提升自己的设计能力和问题解决能力。

参考文献

[1] 李辉,邓超.FPGA原理与应用.机械工业出版社.2019.21-28

[2] 冯建文.基于FPGA的数字电路实验指导书.西安电子科技大学出版社.2016.04.第4页

[3] 王金明. 数字系统设计与Verilog HDL(第6版). 北京:电子工业出版社,2016.

[4] 罗杰. Verilog HDL与FPGA数字系统设计. 北京:机械工业出版社,2015.

[5] 卢有亮. Xilinx FPGA原理与实践—基于Vivado和Verilog HDL. 北京:机械工业出版社,2018.

[6] 郭勇. SOPC技术基础教程(第2版). 北京:清华大学出版社,2018.

[7] 石侃.详解FPGA人工智能时代的驱动引擎.清华大学出版社.2021.8-11

[8]吴雪颜.基于FPGA的电梯控制器[J].软件,2019,40(4):190-195. DOI:10.3969/j.issn.1003-6970.2019.04.041.

[9] 李洪涛.数字信号处理系统设计.国防工业出版社.2017.01.第180页

[10] 赵志强.FPGA芯片设计及其应用[J].电子技术与软件工程, 2018(21):1.

[11] 高端产业引领北京经济高质量发展.人民网 [引用日期2024-12-19]

[12] 薛斌,沈锋,凌欢.零点起步Altera CPLD/FPGA轻松入门与开发实例.机械工业出版社.2012

致 

在完成《Verilog HDL与FPGA应用课程设计》的过程中,我收获了很多宝贵的经验和知识。在此,我要特别感谢以下几位对我完成本次课程设计提供帮助和支持的人员:

我要感谢我的导师和课程指导老师,感谢他在设计思路、Verilog语言的使用以及仿真分析过程中给予的耐心指导。他的专业知识和细致的指导帮助我克服了设计中的难题,特别是在仿真验证和时序分析方面的帮助,让我对硬件设计的理解更加深入。

感谢我的同学。尽管这是一个个人项目,但在平时的学习过程中,我们相互讨论、分享经验,特别是在硬件设计的细节问题上,大家的讨论让我受益匪浅。合作和交流为我提供了更多的视角和思路,让我能够顺利完成设计任务。

我还要感谢Quartus II和ModelSim提供的强大工具支持。通过这些工具,我能够高效地进行设计和仿真验证,确保了我的设计在实现上的准确性和可靠性。

在未来的学习和设计过程中,我将继续发挥所学,深化对硬件设计的理解,不断提升自己的能力。再次感谢所有给予我帮助和支持的人!

附 

代码1

module coU16(

    input CLK, RST, EN, LOAD,       // 输入信号

    input [3:0] DATA,               // 4位数据输入

    output [3:0] DOUT,              // 4位数据输出

    output COUT                     // 输出进位

);

    reg [3:0] Q1;                   // 4位寄存器

    reg COUT;                       // 进位输出

    // 赋值操作

    assign DOUT = Q1;

    // 同步复位和使能控制的时序逻辑

    always @(posedge CLK or negedge RST) begin

        if (!RST) 

            Q1 <= 4'b0000;          // 复位时寄存器清零

        else if (EN) begin

            if (!LOAD) 

                Q1 <= DATA;         // 加载数据

            else if (Q1 < 16) 

                Q1 <= Q1 + 1;      // 如果Q1小于16,则加1

            else 

                Q1 <= 4'b0000;      // 超过16则重置为0

        end

    end

    // 计算进位输出

    always @(Q1) begin

        if (Q1 == 15)

            COUT = 1'b1;            // 当Q1等于15时,产生进位

        else

            COUT = 1'b0;            // 否则没有进位

    end

endmodule

代码2

module T30 (

    input clk,           // FPGA时钟

    input reset,         // 外部复位信号

    input start,         // 外部启动信号

    input pause,         // 外部暂停信号

    input load,          // 外部装载信号

    input [4:0] load_val,// 装载值

    input clear_alarm,   // 外部清除报警信号

    output reg [6:0] display,  // 七段显示器输出

    output reg alarm     // 报警输出

);

    reg [4:0] counter;       // 用于计时的寄存器

    reg [31:0] clk_divider;  // 时钟分频器,用于生成1秒计时器

    reg clk_1s;              // 1秒时钟信号

    

    // 时钟分频器

    always @(posedge clk or posedge reset) begin

        if (reset)

            clk_divider <= 0;

        else if (clk_divider == 49999999) // 假设系统时钟为 50 MHz,分频至 1 Hz

            clk_divider <= 0;

        else

            clk_divider <= clk_divider + 1;

    end

    

    // 生成1秒时钟信号

    always @(posedge clk or posedge reset) begin

        if (reset)

            clk_1s <= 0;

        else if (clk_divider == 49999999)

            clk_1s <= 1;

        else

            clk_1s <= 0;

    end

    

    // 倒计时计时器

    always @(posedge clk_1s or posedge reset) begin

        if (reset)

            counter <= 30; // 默认倒计时为30

        else if (start && !pause) begin

            if (counter > 0)

                counter <= counter - 1;

        end

        else if (load) begin

            counter <= load_val; // 装载新的倒计时初值

        end

    end

    

    // 显示模块

    always @(counter) begin

        case (counter)

            30: display = 7'b0111111;  // 显示30

            29: display = 7'b0000110;  // 显示29

            28: display = 7'b1011011;  // 显示28

            27: display = 7'b1001111;  // 显示27

            // 添加其他数字的显示代码

            default: display = 7'b1111111; // 默认关闭显示

        endcase

    end

    

    // 报警功能

    always @(posedge clk_1s or posedge reset) begin

        if (reset)

            alarm <= 0;  // 清除报警

        else if (counter == 0)

            alarm <= 1;  // 倒计时为零时报警

        else if (clear_alarm)

            alarm <= 0; // 外部清除报警信号

    end

endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终会为一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值