最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

2012EDA实验指导书

来源:动视网 责编:小OO 时间:2025-09-30 01:13:22
文档

2012EDA实验指导书

目录第一章DICE-EH2000实验系统简介11.1产品特点11.2实验系统的硬件配置11.3实验系统硬件介绍21.4主要实验课题71.5实验系统PLD下载板介绍7第二章QuartusII简介92.1QuartusII简介92.2QuartusII数字系统开发流程102.3QuartusII工作环境介绍112.4QuartusII设计入门162.5图形的层次化设计29第三章ispLEVER软件使用简明教程313.1ispLEVER简介313.2ispLEVER开发工具的原理图输入323.3设计
推荐度:
导读目录第一章DICE-EH2000实验系统简介11.1产品特点11.2实验系统的硬件配置11.3实验系统硬件介绍21.4主要实验课题71.5实验系统PLD下载板介绍7第二章QuartusII简介92.1QuartusII简介92.2QuartusII数字系统开发流程102.3QuartusII工作环境介绍112.4QuartusII设计入门162.5图形的层次化设计29第三章ispLEVER软件使用简明教程313.1ispLEVER简介313.2ispLEVER开发工具的原理图输入323.3设计
目录

第一章 DICE-EH2000实验系统简介    1

1.1 产品特点    1

1.2 实验系统的硬件配置    1

1.3 实验系统硬件介绍    2

1.4 主要实验课题    7

1.5 实验系统PLD下载板介绍    7

第二章 Quartus II简介    9

2.1 Quartus II简介    9

2.2 Quartus II数字系统开发流程    10

2.3 Quartus II 工作环境介绍    11

2.4 Quartus II设计入门    16

2.5 图形的层次化设计    29

第三章 ispLEVER软件使用简明教程    31

3.1 ispLEVER简介    31

3.2 ispLEVER开发工具的原理图输入    32

3.3 设计的编译与仿真    36

3.4 硬件描述语言和原理图混合输入    42

3.5 ispLEVER工具中VHDL和Verilog语言的设计方法    48

3.6 ispVM System-在系统编程的软件平台    52

第四章 软件基本实验与数字系统设计    58

实验一 七人表决器    58

实验二 BCD码加法器    59

实验三 3×8译码器的设计    61

实验四 编码器的设计    63

实验五 数码转换(二~十进制)及显示    65

实验六 算术运算(4位全法器的设计)    68

实验七 四位并行乘法器    71

实验八 设计基本触发器(D,JK)    74

实验九 设计74LS160计数器功能模块    77

第五章 硬件模块实验    80

实验一 模数转换实验(ADC0809)    80

实验二 数模转换实验(DAC0832)    81

实验三 步进电机(STEP)    83

实验四 点阵显示(16*16 LED)    85

实验五 电子时钟实验(TIME)    88

实验六 数码管静态显示实验    93

实验七 VGA接口彩条信号实验    96

实验八 4*4键盘扩展实验    97

附录一 部分在系统可编程集成电路的引脚分配图    100

附录二 ispLEVER软件中文件名后缀及其含义    103

附录三 习题    104

第一章 DICE-EH2000实验系统简介

DICE-EH2000型实验开发系统是一种多功能、高配置、高品质的EDA教学与开发设备。适用于大学本科、研究生的EDA教学、课程设计和毕业设计,也适用于大专院校、科研所做项目开发之用。

1.1 产品特点

(1)该系统采用“主板(基本实验系统)+适配板(下载板)”的双板式结构,配置灵活,适配板可选配Altera、Lattice、Xilinx等多家国际著名的PLD公司大部分ISP或现场配置的CPLD/FPGA进行编程下载,包括可对不同工作电压CPLD/FPGA的编程,且在编程中无须做任何跳线切换即能自动识别主系统上的芯片,安全可靠,适合学生高密度的实验操作。

(2)该系统提供良好的混合电压(MV)兼容功能,具备了5V、3.3V、2.5V、1.8V不同芯核电压的CPLD/FPGA器件编程下载和实验开发的全兼容功能。因此,用户可避免单5V的EDA实验系统过时淘汰之虑。

(3)该系统可编程PLD器件与实验模块的连接全部采用自主连线,在PLD器件有限资源条件下,最大限度的连接上尽可能多的输入输出器件和实验模块。可完全满足从简单数字电路到复杂数字系统的设计实验。且PLD资源完全开发,也可借助该开发系统完成相关开发项目。

(4)DICE-EH2000型实验开发系统上增加了我公司的专利产品“电子实验模拟演示装置”模块,通过它我们把一些复杂的实验系统诸如电梯控制系统、刀库控制系统软件化,即把这此实验系统做成软件动画的形式,然后用PLD器件编程来控制它们,以此来达到控制真实系统的效果。通过这个装置我们可以扩展十多个具有实际价值的实验,使学生的实验更接近于实际系统和项目的开发。 

1.2 实验系统的硬件配置

1、 主板可与多种下载板相适配;

2、 6位动态扫描显示电路;

3、 6位静态锁存显示电路;

4、 16位发光二极管显示电路;

5、 8位二档开关及其电平指示电路;

6、 8位按键开关电路;

7、 2位脉冲开关电路;

8、 一个扬声器;

9、 一个16*16的点阵显示;

10、一个128C的液晶显示;

11、A/D转换器ADC0809;

12、D/A转换器DAC0832;

13、时钟信号源:4MHZ、2MHZ、1MHZ、500KHZ、8KHZ、

                4KHZ、1024HZ、HZ、8HZ、1HZ;

14、MCS-51单片机总线接口电路;

15、40芯I/O扩展接口;(E2000)

16、一个5V蜂鸣器;

17、一个0~5V的电位器;

18、一个四相步进电机;

19、一个4*4小键盘;

20、配有存贮器EPROM27256;

21、一个RS232接口;

22、一个VGA接口;

23、一个PS/2(键盘、鼠标)接口;

24、电子实验模拟验示装置模块电路;

1.3 实验系统硬件介绍

1,A/D转换器  ADC0809实验电路

    实验电路实现模拟量转换成数字量的功能,电路提供了三路地址信号输入(ADDA,ADDB,ADDC),可以通过编程或直接输入来实现对通道的选择,三路模拟信号输入(IN0,IN1,IN2),ADC0809的控制信号(CS,WR,RD,EOC),电位器可为实验提供0-5V的电压,作为模拟量输入信号。

实验电路如图一所示:

                         图一:ADC0809转换器电路

2,D/A转换器DAC0832实验电路

    实验电路将实现将数字量转换成模拟量的功能,电路提供了DAC0832控制信号(CS,WR)由CPLD产生。

    实验电路如图二所示:

                        图二:DAC0832转换器电路

3,四相步进电机实验电路

    步进电机驱动原理是通过对它每相线圈中的电流的顺序切换来使电机作步进式旋转,电路提供了四相电流控制信号(HA,HB,HC,HD),由CPLD产生。可以通过编程使得步机电机正、反转,可以调节转速等。

实验电路如图三所示:

                                 图三:步进电机电路

4,静态锁存显示电路

    6位BCD码静态锁存显示电路,采用6只CD4511来驱动锁存七段显示,每个共阴数码管的七段与CD4511的输出连接,每个4511都有的输入信号(A,B,C,D)。

电路如图四所示:

                                  图四:锁存显示电路

5,动态扫描显示电路

    由段驱动电路74LS240和位驱动电路7407组成,共阴数码管的A、B、C、D、E、F、G、DP分别与74LS240的八位输出连接,共阴端分别与7407的输出端连接,并连至L1-L6的插孔上。电路如图五所示:

                             图五:动态扫描显示电路

6,单脉冲电路

    电路提供了4个脉冲按键:可以产生四组正、负单脉冲,每按一次产生一个单脉冲。

    电路如图六所示:

                          图六:单脉冲发生电路

7,时钟分频电路

    电路由三片74LS393组成,每片都有一个脉冲输入端T与复位端RESET,以及T0-T7频率输出端。

当脉冲输入为4MHZ时,T0-T7输出脉冲频率依次为:4MHZ、2MHZ、1MHZ、500KHZ、250KHZ、125KHZ、62.5KHZ、31.25KHZ。电路如图七所示

                               图七:时钟分频电路

8,16*16点阵显示电路

    实验电路提供了16位行控制信号,16位列控制信号,分别用74LS240与7407来驱动,可以实现点阵显示汉字。电路如图八所示:

                               图八  点阵显示电路

9,128C液晶显示电路

电路提供了20芯的接口插座,用来控制液晶显示汉字或图形。电路如图九所示:

图九:液晶显示电路

                             该图为显示内存与液晶显示屏关系

10,4*4小键盘扩展电路

    电路提供了四位行线(R0-R3)与四位列线(L0-L3),可以通过编程对键进行定义为数字键或功能键。

    电路如图十所示:

                图十:键盘扩展电路

11,MCS-51单片机总线接口电路

电路中提供了一片40芯的C52,一片20芯的74LS245(用于扩展P0口),一片20芯的74LS373(用于地址锁存),一片28芯的只读存储器27256,分别将其引脚全部引出。可以根据单片机总线接口方式的工作时序,编制单片机与CPLD以总线方式通信的逻辑设计。

接口逻辑图如图十一所示:

图十一:CPLD与MCS-51单片机总线接口通信逻辑图

12,P0口扩展电路

    电路将P0口用一片74LS245扩展了一个并行口(输入/输出口),用于控制液晶显示的具体内容。

13,RS232接口电路

在实验仪上有一个RS232的电平转换器件,但实验仪没有串行口控制器,当我们使用到RS232进行通信的时候,就要求我们使用CPLD来构建一个串行控制器了。RS232接口电路如图十三所示:

                      图十三   RS232接口电路图

1.4 主要实验课题

(一)基本实验:1、七人表决器;2、四位加法器;3,BCD码加法器;4、格雷码变换器;5、四位并行乘法器;6、触发器;7、用ABEL语言设计74LS160功能模块计数器;8、多模加减计数器;9、可控脉冲发生器;10、简易数码锁;11、英语字母显示实验;12、八位乘法器;13、序旬检测器;14、可变模16位加法计数器;正负脉冲数控调制发生器;16、秒表等等。

(二)模块实验:1、A/D模数转换器实验;2、D/A数模转换器实验;3、数码管动、静态实验;4、步进电机控制实验;5、存储器读写实验;6、点阵显示实验;7、液晶显示实验;8、单片机总线接口实验;9、键盘扩展实验;10,RS232串行通讯实验;11,VGA彩条信号发生器实验;12,电子音乐实验;13,PS/2(键盘/鼠标接口)实验;

(三)数字系统设计:1、数字钟;2、频率计;3、交通灯,4、数字锁;5、出租车计费器;6抢答器;7、自动电梯;8、彩灯控制器9、电梯近控制;

10、机械手控制;11、刀库控制;12、电机控制等。

(四)综合电子设计:1、FSK发生器(D/A);2、数据采集(A/D)。

(五)电子实验装置实验:1,交通灯控制器;2,机器人自动扫雷;3,加工中心刀库捷径方向选择控制;4,驱动步进电机的控制;5,舞台艺术灯的控制;6,四层电梯的控制;7,LED数码管显示控制;8,交流电机Y/△形起动控制;9,液体混合装置自动控制;10,水塔水位自动控制;11,四级传送带的模拟运行;12,邮件分拣系统的模拟运行;13,数字逻辑分析仪实验;14,温度压力实验;15,连线自动检测系统。

1.5 实验系统PLD下载板介绍

PLD产品的型号很多,主要有Lattice 公司的ispLSI系列、Altera公司的MAXEPM和FLEXEPF系列、Xilin x公司的XC系列、ATMEL的ATF系列等。各个公司的PLD结构不同,其性能也不同。

DICE-EH2000可编程数字逻辑实验系统配置的PLD下载板,包罗上述三家公司的推荐产品。本实验系统随机提供了Lattice公司的ispLSI1032E下载板。该下载板可满足大专院校EDA教学实验。其它下载板可满足科研开发。

下载板是实验系统的核心,插在DICE-EH2000实验系统的。下载板是通过一根10芯的并行电缆与微机25芯并口相连,由开发系统将设计文件编程(俗称下载)到下载板的CPLD/FPGA芯片中。为适应不同PLD厂商及不同型号CPLD/FPGA芯片,设计了各种不同的下载板。DICE-EH2000型实验开发系统现提供了八种CPLD/FPGA下载板。

八种下载板的主要技术参数:

(1)F1032E下载板

板上配有Lattice公司的CPLD芯片ispLSI1032E-70LJ-84.

ispLSI1032E资源:密度6000门,封装为PLCC84;速度为70MHZ;I/O口:个;

EDA开发软件:ispEXPERT8.2、ISP  LEVER;

(2)F10K10下载板

板上配有Altera公司FPGA芯片:EPF10K10LC-84-4;

EPF10K10LC84-4资源:密度10000门;封装PLCC84;延时4ns ;I/O口52个;

EDA开发软件:MAXPLUSⅡ7.21、8.0、9.23、10.0。

(3)F7128下载板

板上配有Altera 公司FPGA芯片:EPM7128SLC84-15W;

EPM7128SLC84-15W资源:密度2500门;封装PLCC84;延时5ns ;I/O口:60个;

EDA开发软件:MAXPLUSⅡ 7.21、8.0、9.23、10.0。

(4)FXCS10下载板

板上配有Xilinx公司FPGA芯片:XCS10PC84-3;

XCS10PC84-3资源:密度10000门;封装PLCC84;延时3ns ;I/O口:56个;

EDA开发软件:Foundation 1.4、1.5、2.0。

(5)EP1K10下载板

板上配有Altera公司FPGA芯片:EP1K10QC-208-3;

EP1K10QC208-3资源:密度10000门;封装PQFP144;延时4ns ;I/O口130个;

EDA开发软件:MAXPLUSⅡ7.21、8.0、9.23、10.0。

(6)EP1K30下载板

板上配有Altera公司FPGA芯片:EP1K30TC-144-3;

EP1K30TC144-3资源:密度30000门;封装TQFP144;延时4ns ;I/O口102个;

EDA开发软件:MAXPLUSⅡ7.21、8.0、9.23、10.0。

(7)EP1K100下载板

板上配有Altera公司FPGA芯片:EP1K100QC-208-3;

EP1K100QC208-3资源:密度100000门;封装PQFP208;延时4ns ;I/O口147个;

EDA开发软件:MAXPLUSⅡ7.21、8.0、9.23、10.0。

(8)LC4246V下载板

板上配有Lattice公司的CPLD芯片ispMACH 车LC4256V-75T100、 LC4256V-75T176;

LC4256V-75T176资源:密度10000门,封装为TQFP176;速度为75MHZ;I/O口:128个;

LC4256V-75T100资源:密度10000门,封装为TQFP100;速度为75MHZ;I/O口:个;

EDA开发软件:ispEXPERT8.2、ISP  LEVER;

第二章 Quartus II简介

2.1 Quartus II简介

Max+plus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Max+plus II 的更新支持。Quartus II 是Altera公司继Max+plus II之后开发的一种针对其公司生产的系列CPLD/PGFA器件的综合性开发软件,它的版本不断升级,从4.0版到10.0版,这里介绍的是Quartus II 8.0版,该软件有如下几个显著的特点:

1、Quartus II 的优点

该软件界面友好,使用便捷,功能强大,是一个完全集成化的可编程逻辑设计环境,是先进的EDA工具软件。该软件具有开放性、与结构无关、多平台、完全集成化、丰富的设计库、模块化工具等特点,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

  Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。

2、Quartus II对器件的支持

Quartus II支持Altera公司的MAX 3000A系列、MAX 7000系列、MAX 9000系列、ACEX 1K系列、APEX 20K系列、APEX II系列、FLEX 6000系列、FLEX 10K系列,支持MAX7000/MAX3000等乘积项器件。支持MAX II CPLD系列、Cyclone系列、Cyclone II、Stratix II系列、Stratix GX系列等。支持IP核,包含了LPM/MegaFunction宏功能模块库,用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。

3、Quartus II对第三方EDA工具的支持

对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。Altera的Quartus II可编程逻辑软件属于PLD开发平台。该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。Quartus平台与Cadence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。改进了软件的LogicLock模块设计功能,增添了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。

2.2 Quartus II数字系统开发流程

用Quartus II软件进行数字系统开发的流程如图2.1所示,包括以下步骤。

图2.1  Quartus II设计开发流程

(1)设计输入:包括原理图输入、HDL文本输入、EDIF【电子设计交换格式(Electronic Design Interchange Format)】网表输入、波形输入等几种方式。

(2)编译:先根据设计要求设定编译方式和编译策略,如器件的选择、逻辑综合方式的选择等;然后根据设定的参数和策略对设计项目进行网表提取、逻辑综合、器件适配,并产生报告文件、延时信息文件及编程文件,供分析、仿真和编程使用。

(3)仿真与定时分析:仿真和定时分析均属于设计校验,其作用是测试设计的逻辑功能和延时特性。仿真包括功能仿真和时序仿真。定时分析器可通过三种不同的分析模式分别对传播延时、时序逻辑性能和建立/保持时间进行分析。

(4)编程与验证:用得到的编程文件通过编程电缆配置PLD,加入实际激励,进行在线测试。

在设计过程中,如果出现错误,则需重新回到设计输入阶段,改正错误或调整电路后重新测试。

2.3 Quartus II 工作环境介绍

启动Quartus II,进入如图2.2管理器窗口。

图2.2 Quartus II管理器窗口

2.3.1 菜单栏

1、【File】菜单

Quartus II的【File】菜单除具有文件管理的功能外,还有许多其他选项,如图2.3所示。

图2.3  【File】子菜单                 图2.4  【New 】子菜单

(1)【New】选项:新建工程或文件,其下还有子菜单,如图2.4所示。

【New Quartus II Project】选项:新建工程。

【Design File】选项:新建设计文件,常用的有:AHDL文本文件、VHDL文本文件、Verilog HDL文本文件、原理图文件等。

【Vector Waveform Five】选项:矢量波形文件。

(2)【Open】选项:打开一个文件。

(3)【New Project  Wizard】选项:创建新工程。点击后弹出对话框如图2.5所示。单击对话框最上第一栏右侧的“…”按钮,找到文件夹已存盘的文件,再单击打开按钮,既出现如图所示的设置情况。对话框中第一行表示工程所在的工作库文件夹,第二行表示此项工程的工程名,第三行表示顶层文件的实体名,一般与工程名相同。

图2.5  【New Project  Wizard】菜单窗口

(4)【creat /update】选项:生成元件符号。可以将设计的电路封装成一个元件符号,供以后在原理图编辑器下进行层次设计时调用。

2、【View】菜单:进行全屏显示或对窗口进行切换,包括层次窗口、状态窗口、消息窗口等。

图2.6 【View】菜单

 

3、【Assignments】菜单

【Assignments】菜单如图2.7所示。

(1)【Device】选项:为当前设计选择器件。

(2)【Pin】选项:为当前层次树的一个或多个逻辑功能块分配芯片引脚或芯片内的位置。

(3)【Timing Ananlysis Setting】选项:为当前设计的tpd、tco、tsu、fmax等时间参数设定时序要求。

(4)【EDA tool setting】选项:EDA 设置工具。使用此工具可以对工程进行综合、仿真、时序分析,等等。EDA 设置工具属于第三方工具。

(5)【Setting】选项:设置控制。可以使用它对工程、文件、参数等进行修改,还可以设置编译器、仿真器、时序分析、功耗分析等。

(6)【assignment editor】选项:任务编辑器。

(7)【pin planner】选项:可以使用它将所设计电路的I/O引脚合理的分配到已设定器件的引脚上。

图2.7  【Assign】菜单

4、【processing】菜单

  【processing】菜单的功能是对所设计的电路进行编译和检查设计的正确性。

(1)【Stop process】选项:停止编译设计项目。

(2)【Start Compilation】选项:开始完全编译过程,这里包括分析与综合、适配、装配文件、定时分析、网表文件提取等过程。

(3)【analyze current file】选项:分析当前的设计文件,主要是对当前设计文件的语法、语序进行检查。

(4)【compilation report】选项:适配信息报告,通过它可以查看详细的适配信息,包括设置和适配结果等。

(5)【start simulation】选项:开始功能仿真。

(6)【simulation report】选项:生成功能仿真报告。

(7)【compiler tool】选项:它是一个编译工具,可以有选择对项目中的各个文件进行分别编译。

(8)【simulation tool】选项:对编译过电路进行功能仿真和时序仿真。

(9)【classic timing analyzer tool】选项:classic时序仿真工具。

(10)【powerplay power analyzer tool】选项:PowerPlay功耗分析工具。

图2.8 【processing】菜单

5、【tools】菜单

(1)【run EDA simulation tool】选项:运行EDA仿真工具,EDA是第三方仿真工具。

(2)【run EDA timing analyzer tool】选项:运行EDA时序分析工具,EDA是第三方仿真工具。

(3)【Programmer】选项:打开编程器窗口,以便对Altera的器件进行下载编程。

2.3.2 工具栏

工具栏紧邻菜单栏下方,它其实是各菜单功能的快捷按钮组合区。

各按钮的基本功能如下:

:建立一个新的图形、文本、波形或是符号文件。

:打开一个文件,启动相应的编辑器。

:保存当前文件。

:打印当前文件或窗口内容。

:将选中的内容剪切到剪贴板。

:将选中的内容复制到剪贴板。

:粘贴剪贴板的内容到当前文件中。

:撤销上次的操作。

:单击此按钮后再单击窗口的任何部位,将显示相关帮助文档。

:打开层次显示窗口或将其带至前台。

:打开平面图编辑器或将其带至前台。

:打开编译器窗口或将其带至前台。

:打开仿真器窗口或将其带至前台。

:打开时序分析器窗口或将其带至前台。

:打开编程器窗口或将其带至前台。

:指定工程名。

:将工程名设置为和当前文件名一样。

:打开当前工程的顶层设计文件或将其带至前台。

:保存所有打开的编译器输入文件,并检查当前工程的语法和其他基本错误。

:保存工程内所有打开的设计文件,并启动编译器。

:保存工程内所有打开的仿真器输入文件,并启动仿真器。

2.3.3 状态栏

状态栏位于MAX+plusII窗口的底部。当用鼠标指向菜单栏的命令或工具栏时,状态栏显示其简短描述,起提示用户的作用。可以通过设置【Options】/【Preferences】选项打开或关闭状态栏

图2.9 【tools】菜单

2.4 Quartus II设计入门

原理图是图形化的表示方式,使用元件符号和连线来描述所设计电路,符号通过信号线连接在一起,构成电路原理图。符号取至器件库,Quartus II 提供了丰富的库单元供设计者调用,在mega_lpm库里提供了多种特殊的逻辑宏功能(Macro-Function)以及新型的参数化的兆功能(Mega-Function)模块,在maxplus2库里提供了几乎所有的74系列的器件,在primitives库里分别提供缓冲器(buffer)、逻辑门(logic)、引脚(pin)、存储单元(storage)和其他功能(other)五类模块。充分利用这些模块进行设计,可以大大减轻设计者的工作量和成倍地缩短设计周期。

实例一、由图形输入法设计cntm12

实验报告要求:

1、简述设计原理,画出逻辑原理图。

2、简述项目建立、编译、校验的步骤。

3、画出时序模拟图。

74160的状态表

输入输出
CLRNLDNENTENPCLKABCDQAQBQCQD
0××××××××0000清零
10××ABCDABCD置数
1111××××计     数

110××××××保     持

11×0×××××保     持

一、建立工程文件夹

1.新建一个文件夹作为工程项目目录

   首先在计算机中建立一个文件夹作为工程项目目录,此工程目录不能是根目录,比如D:,只能是根目录下的目录,比如D:\\QuartusII\\cntm12。

2.建立工程项目

    运行QuartusⅡ软件,执行File→New Project Wizard…命令,建立工程,如图2.10所示。

图2.10 执行New Project Wizard…命令

在图2.11所示对话框中单击Next按钮。

图2.11 New Project Wizard对话框

在所弹出的图2.12所示的New Project Wizard对话框中,分别填写各个项目。其中第一、第二、第三文本框分别是工程项目目录、项目名称和项目顶层设计实体的名称。 

图2.12 工程项目基本设置

单击Next按钮,出现添加工程文件的对话框,如图2.13所示。

图2.13添加工程文件的对话框

若原来已有文件,可选择,这里直接单击Next按钮进行下一步,请选择FPGA器件的型号,如图2.14所示。

图2.14 选择FPGA器件

在Family下拉框中,根据需要选择一种型号的FPGA,比如Cyclone系列FPGA。然后在Available devices栏中根据需要的FPGA型号进行选择,比如EP1C3T144C8,注意在filters栏中选中Show Advanced Devices以显示所有的型号。再单击Next按钮,出现如图2.15所示的对话框。

图2.15 选择其他EDA工具

这是选择其他EDA工具的对话框,由于本工程项目使用QuartusⅡ的集成环境进行开发,因此不要做任何改动。单击Next按钮进入工程的信息总概括对话框,如图2.16所示。

图2.16 信息总概括对话框

单击Finish按钮就建立了一个空的工程项目。

二、编辑设计图形文件

1.建立原理图文件

如图2.17所示,执行File→New…命令。

图2.17 执行File→New…命令

弹出新建文件对话框如图2.18所示。

图2.18 新建文件对话框

QuartusⅡ支持五中设计输入法文件:AHDL File是AHDL文本文件;Block Diagram/Schematic File是流程图和原理文件,简称原理图文件;EDIF File是网表文件Verilog HDL File是Verilog HDL文本文件;VHDL File是VHDL文本文件。选择Block Diagram/Schematic File,单击OK按钮即建立一个空的原理图文件。 

执行File→Save as…命令,把它另存为文件名是cntm12的原理图文件,文件后缀为.bdf.将Add file to current project选项选中,使该文件添加到刚建立的工程文件中去,如图2.19所示。

图2.19 将文件添加到工程中

2.编辑输入原理图文件

图形编辑界面如图2.20所示,其右侧的空白处就是原理图的编辑区,在这个编辑区输入如图2.21所示的十二进制原理图。

图2.20 图形编辑界面

图2.21十二进制原理图

(1)元件的选择与放置。

在原理图编辑区的一个位置双击鼠标的左键,将弹出Symbol对话框,或单击鼠标右键,在弹出的选择对话框中选择Insert→Symbol,也会弹出Symbol对话框。不要选中Symbol对话框中的Repeat-insert mode(重复-插入模式)和Insert symbol as block(作为流程图模块插入符号)复选框,即采用默认的一次性插入作为原理图文件的符号。用单击的方法展开Libraries栏中的元件库如图2.22所示,其中Primitives为基本元件库,打开logic子库,里面是常用的与门、或门和非门等门电路。 

图2.22 Symbol对话框

选择其中的元件,然后单击OK按钮,元件出现在编辑界面。将该图样移到编辑区合适的地方单击鼠标左键,就可放置一个元件。右击元件符号,在出现的菜单中选择Copy命令,将鼠标移到编辑区合适的地方单击鼠标右键,在弹出的菜单中选择Paste命令,就可以复制元件。

再打开primititives基本元件库的pin子库,可以放置input元件(输入元件)和output元件(输出元件)到编辑区。

(2)连接各个元件符号

把鼠标移到一个input元件连接处,单击鼠标左键,移到要与之相连的元件的连接处,就可以连接这两个要连接的元件。用同样的方法可按要求连接其它元件。

(3)设定各输入、输出引脚。

双击任意一个input元件,将会弹出引脚属性编辑对话框。在Pin name(s)文本框中填入引脚名。用类似的方法设定其他引脚名。完成的电路图如图2.21所示。

在QuartusⅡ流程图和原理图文件中,除了使用原理图元件符号外,还可以使用流程图模块,对于初学者可以先掌握文件符号的使用,以后再探讨流程图模块的使用,故这里对流程模块不做介绍。在流程图和原理图输入法界面的左边,有供编辑输入时使用的工具箱,各个工具的功能如图2.23所示。

图2.23工具的功能

三、编译设计图形文件

完成原理图编辑输入后,保存设计图形文件,就可编译设计图形文件。执行Processing→Start Compilation,如图2.24所示,进行编译。

如图2.24执行Processing→Start Compilation

    编译结束后,会出现对话框显示编译的错误和警告情况。若有错误,则可双击编译器界面下方出现的第一个错误提示,使第一个错误处改变颜色。检查纠正第一个错误后保存再编译,如果还有错误,重复以上操作,直至最后通过。最后通过时应没有错误提示但可有警告提示。可以通过查看编译报告了解有关情况,比如定时分析情况。

以上是使用QuartusⅡ编译器默认设置进行的编译方法,还可以先根据需要进一步的编译设置,然后再编译,具体方法可参考QuartusⅡ帮助文档。

四、时序仿真设计文件

(1)新建用于仿真的波形文件。

     执行File→New…命令,如图2.25所示,选择标签中的Vector Waveform File(波形文件),然后单击OK按钮确定。出现波形文件编辑器,如图2.26所示。在图2.26中左侧空白区处单击鼠标右键,选择Insert→Insert Node Or Bus…命令。会出现如图2.27所示的对话框。单击Node Fonder…按钮。在出现的Node Finder对话框中单击List按钮。Nodes Found栏出现列表,在列表中选中需要的输入/输出引脚,然后单击选中按钮,如图2.28所示。

如图2.25 选择标签中的Vector Waveform File

图2.26波形文件编辑器

图2.27 Insert Node Or Bus命令

如图2.28

然后单击OK按钮确定,出现如图2.29所示的波形编辑界面。

图2.29 波形编辑界面

(2)设置仿真时间。

     执行Edit→End Time…命令,设置适当的时间,如图2.30所示。

      

     

执行Edit→Grid Size…命令,如图2.31所示。

(3)设置输入信号波形。

     单击工具箱中缩放工具按钮,将鼠标移到编辑区内,单击鼠标左键,调整波形区横向比例,单击工具箱中的选择工具按钮,然后在要设置波形的区域上单击鼠标左键并拖动鼠标,选择要设置的区域,如图2.32所示。

图2.32

(4)进行仿真。

    设置输入信号后,保存文件,文件名默认。执行Processing→Start Simulation 命令,进行仿真,仿真结果如图2.33所示。认真核对输入/输出波形,可检查设计的功能正确与否。

图2.33仿真结果

五、生成元件符号

执行File→Greate/Update →Greate Symbol Files for Current File 命令,将本设计电路封装生成一个元件符号,供以后在原理图编辑器下进行层次设计时调用,所生成的符号存放在本工程目录下,文件名cntm12 , 文件后缀名为.bsf。调用方法与Quartus Ⅱ提供的元件符号相似。

2.5 图形的层次化设计

实例二、由图形输入法设计clock

(1)设计60进制计数器cntm60。

图2.34 60进制计数器原理图

图2.35 60进制计数器仿真波形

(2)图形的层次化设计--建立clock

    新建一个工程文件夹clock,把cntm12.bdf、cntm12.bsf、cntm60.bdf、cntm60.bsf文件放入其中,新建一个原理图文件,使用符号插入命令,选择cntm12.bsf、cntm60.bsf将它放置于原理图编辑区中,完成的原理图如图2.36 所示。

图2.36 clock的原理图

    

图2.37 clock的仿真波形

实验报告要求:

1、简述设计原理,画出逻辑原理图。

2、简述项目建立、编译、校验的步骤。

3、画出时序模拟图。

第三章 ispLEVER软件使用简明教程

3.1 ispLEVER简介

  ispLEVER 是Lattice 公司最新推出的一套EDA软件。设计输入可采用原理图、硬件描述语言、混合输入三种方式。能对所设计的数字电子系统进行功能仿真和时序仿真。编译器是此软件的核心,能进行逻辑优化,将逻辑映射到器件中去,自动完成布局与布线并生成编程所需要的熔丝图文件。软件中的Constraints Editor工具允许经由一个图形用户接口选择I/O设置和引脚分配。软件包含Synolicity公司的“Synplify”综合工具和Lattice的ispVM器件编程工具。ispLEVER软件提供给开发者一个简单而有力的工具,用于设计所有莱迪思可编程逻辑产品。软件支持所有Lattice公司的ispLSI 、MACH、ispGDX、ispGAL、GAL器件。ispLEVER工具套件还支持莱迪思新的ispXPGATM和ispXPLDTM产品系列,并集成了莱迪思ORCA Foundry设计工具的特点和功能。这使得ispLEVER的用户能够设计新的ispXPGA和ispXPLD产品系列,ORCA FPGA/FPSC系列和所有莱迪思的业界领先的CPLD产品而不必学习新的设计工具。

软件主要特征:

1.  输入方式

*    原理图输入

*    ABEL-HDL输入

*    VHDL输入

*    Verilog-HDL输入

*   原理图和硬件描述语言混合输入

2.逻辑模拟

*    功能模拟

    *    时序模拟

    

3.编译器

*    结构综合、映射、自动布局和布线

4.支持的器件

    *    含有支持ispLSI器件的宏库及MACH器件的宏库、TTL库

    *     支持所有ispLSI、MACH、ispGDX、ispGAL、GAL、ORCA FPGA/FPSC、ispXPGA和ispXPLD器件

5. Constraints Editor工具

*  I/O参数设置和引脚分配

6. ispVM工具

   *  对ISP器件进行编程

软件支持的计算机平台:

PC: Windows 98/NT/2000/XP

Lattice 软件安装指南:

1.关闭所有Windows应用程序,将光盘放入光驱;

2.运行:\\isplever3.0\\lattice\\setup;

3.点击ispLEVER Project Navigator and 3rd Party Tools后, 选择LS HDL BASE PC N, 点击Next;

4.Next-->Yes-->Next, 在Components菜单中去掉最后一项,然后继续,直至安装完毕;

5.安装后将光盘上的\lattice\附件\license.dat 拷贝到 :\\isptools\\license目录下。

6.重新起动计算机即可运行ispLEVER软件.

3.2 ispLEVER开发工具的原理图输入

1.启动ispLEVER(按Start=>Programs=>Lattice Semiconductor=>ispLEVER菜单)

2.创建一个新的设计项目

A.选择菜单File。

B.选择New Project...。

C.在Create New Project对话框的Project Name栏中,键入项目名d:\\demo.syn。在Project type栏中选择Schematic/ABEL(ispLEVER软件支持Schematic/ABEL、Schematic/VHDL、Schematic/Verilog等的混合设计输入,在此例中,仅有原理图输入,因此可选这三种中的任意一种)。

D.你可以看到默认的项目名和器件型号: Untitled and ispLSI5256VE-165LF256。

3.项目命名

A.用鼠标双击Untitled。

B.在Title文本框中输入“Demo Project”,并选OK。

4.选择器件

A.双击ispLSI5256VE-165LF256, 你会看到Device Selector对话框(如下图所示)。

B.在Select Device窗口中选择ispMACH 4000项。

C.按动器件目录中的滚动条,直到找到并选中器件LC4032V-10T44I。

D.按OK按钮,选择这个器件。

E.在软件弹出的如下图显示的Confirm Change窗口中,按Yes按钮。

F.因改选器件型号后,先前的约束条件可能对新器件无效,因此在软件接着弹出的如下图显示的ispLEVER Project Navigato窗口中,按Yes按钮,以用来去除原有的约束条件。

5.在设计中增加源文件

    一个设计项目由一个或多个源文件组成。这些源文件可以是原理图文件(*.sch)、ABEL HDL文件(*.abl)、VHDL设计文件(*.vhd)、Verilog HDL设计文件(*.v)、测试向量文件(*.abv) 或者是文字文件(*.doc, *.wri, *.txt)。在以下操作步骤中,你要在设计项目中添加一张空白的原理图纸。

A.从菜单上选择Source 项。 

B.选择New... 。

C.在对话框中,选择Schematic(原理图),并按OK。

D.输入文件名demo.sch。

E.确认后按OK。

6.原理图输入

    你现在应该进入原理图编辑器。在下面的步骤中,你将要在原理图中画上几个元件符号,并用引线将它们相互连接起来。

A.从菜单栏选择Add, 然后选择Symbol,你会看到如下图所示的对话框:

B.选择GATES.LIB库,然后选择G_2AND元件符号。

C.将鼠标移回到原理图纸上,注意此刻AND门粘连在你的光标上,并随之移动。

D.单击鼠标左键,将符号放置在合适的位置。

E.再在第一个AND门下面放置另外一个AND 门。

F.将鼠标移回到元件库的对话框,并选择G_2OR元件。

G.将OR门放置在两个AND门的右边。

H.现在选择Add菜单中的Wire项。

I.单击上面一个AND门的输出引脚,并开始画引线。

J.随后每次单击鼠标,便可弯折引线 (双击便终止连线)。

K.将引线连到OR门的一个输入脚。

L.重复上述步骤,连接下面一个AND门。

7.添加更多的元件符号和连线

A.采用上述步骤,从REGS.LIB库中选一个g_d寄存器,并从IOPADS.LIB库中选择G_OUTPUT符号。

B.将它们互相连接,实现如下的原理图:

8.完成你的设计

     在这一节,通过为连线命名和标注I/O Markers来完成原理图。 当要为连线加信号名称时,你可以使用ispLEVER的特点,同时完成两件事-----同时添加连线和连线的信号名称。这是一个很有用的特点,可以节省设计时间。I/O Markers是特殊的元件符号,它指明了进入或离开这张原理图的信号名称。注意连线不能被悬空(dangling),它们必需连接到I/O Marker或逻辑符号上。这些标记采用与之相连的连线的名字,与I/O Pad符号不同,将在下面定义属性(Add Attributes)的步骤中详细解释。

A.为了完成这个设计,选择Add菜单中的Net Name项。

B.屏幕底下的状态栏将要提示你输入的连线名,输入‘A’ 并按Enter键,连线名会粘连在鼠标的光标上。

C.将光标移到最上面的与门输入端,并在引线的末连接端(也即输入脚左端的红色方块),按鼠标左键,并向左边拖动鼠标。这可以在放置连线名称的同时,画出一根输入连线。

D.输入信号名称现在应该是加注到引线的末端。

E.重复这一步骤,直至加上全部的输入‘B’,’C’,’D’和‘CK’,以及输出‘OUT’。

F.现在选择Add菜单的I/O Marker项。

G.将会出现一个对话框,请选择Input。

H.将鼠 标 的光标移至输入连线的末端(位于连线和连线名之间),并单击鼠标的左键。这时回出现一个输入I/O Marker,标记里面是连线名。

I.鼠标移至下一个输入,重复上述步骤,直至所有的输入都有I/OMarker。

J.现在请在对话框中选择Output,然后单击输出连线端,加上一个输出I/O Marker。

K.至此原理图就基本完成,它应该如下图所示。

9.定义器件的属性(Attributes) 

    你可以为任何一个元件符号或连线定义属性。在这个例子中,你可以为输出端口符号添加引脚锁定LOCK的属性。请注意,在ispLEVER中,引脚的属性实际上是加到I/O Pad符号上,而不是加到I/O Marker上。同时也请注意,只有当你需要为一个引脚增加属性时,才需要I/O Pad符号,否则,你只需要一个I/O Marker。

A.在菜单条上选择Edit =>Attribute =>Symbol Attribute项,这时会出现一个Symbol Attribute Editor 对话框。

B.单击需要定义属性的输出I/O Pad。

C.对话框里会出现一系列可供选择的属性。

D.选择PinNumber属性,并且把文本框中的‘*’替换成‘4’(‘4’为器件的引脚号)。这样,该I/O Pad上的信号就被锁定到器件的第四个引脚上了。

E.关闭对话框。

F.请注意,此时数字‘4’出现在I/O Pad符号内。

10.保存已完成的设计

从菜单条上选择File,并选Save命令。再选Exit命令。

3.3 设计的编译与仿真

1.建立仿真测试向量(Simulation Test Vectors)

A.在已选择LC4032V-10T44I器件的情况下,选择Source菜单中的New...命令。

B.在对话框中,选择ABEL Test Vectors并按OK。

C.输入文件名demo.abv 作为你的测试向量文件名。

D.按OK。

E.文本编辑器弹出后,输入下列测试向量文本:

F.完成后,选择File菜单中的Save命令,以保留你的测试向量文件。

G.再次选择File,并选Exit命令。

module demo;

c,x = .c.,.x.;

CK,A,B,C,D,OUT     PIN;

TEST_VECTORS

([CK, A, B, C, D]->[OUT])

[ c , 0 , 0 , 0 , 0 ]->[ x ];

[ c , 0 , 0 , 1 , 0 ]->[ x ];

[ c , 1 , 1 , 0 , 0 ]->[ x ];

[ c , 0 , 1 , 0 , 1 ]->[ x ];

END

H.此时你的项目管理器(Project Navigator)应如下图所示。

2.编译原理图与测试向量

    现在你已为你的设计项目建立起所需的源文件,下一步是执行每一个源文件所对应的处理过程。选择不同的源文件,你可以从项目管理器窗口中观察到该源文件所对应的可执行过程。在这一步,请你分别编译原理图和测试向量。 

A.在项目管理器左边的项目源文件(Sources in Project)清单中选择原理图(demo.sch)。

B.双击原理图编译(Compile Schematic)处理过程。

C.编译通过后,Compile Schematic过程的左边会出现一个绿色的查对记号,以表明编译成功。编译结果将以逻辑方程的形式表现出来。

D.然后从源文件清单中选择测试向量源文件(demo.abv)。

E.双击测试向量编译(Compile Test Vectors)处理过程。

3.设计的仿真

    ispLEVER开发系统不但可以进行功能仿真(Functional Simulation),而且可以进行时序仿真(Timing Simulation)。在仿真过程中还提供了单步运行、断点设置功能。

 

4.一、功能仿真

A. 在ispLEVER Project Navigator的主窗口左侧,选择测试向量源文件(demo.abv),双击右侧的Functional Simulation功能条。将弹出如下图所示的仿真控制窗口(Simulator Control Panel)。

B. 在Simulator Control Panel中,将根据(*.abv)文件中所给出的输入波形进行一步到位的仿真。

在Simulator Control Panel中,按Simulate=>Run,再按Tools => Waveform Viewer菜单,将打开波形观察器Waveform Viewer如下图所示。

C. 波形现在都显示在波形观察器的窗口中,如下图所示:

D. 单步仿真。选Simulator Control Panel窗口中的Simulate=>Step可对您的设计进行单步仿真。ispLEVER中仿真器的默认步长为100ns,您可根据需要在按Simulate=>Settings菜单所激活的对话框(Setup Simulator)中重新设置您所需要的步长。按Simulator Control Panel窗口中的Simulate=>Reset菜单,可将仿真状态退回至初始状态(0时刻)。随后,每按一次Step,仿真器便仿真一个步长。下图是按了七次Step钮后所显示的波形(所选步长为100ns)。

E. 设置断点(Breakpoint)。在Simulator Control Panel窗口中,按Signal=>Breakpoints菜单,会显示如下图所示的断点设置控制的Breakpoint窗口。

       在该窗口中按New按钮,开始设置一个新的断点。在Available Signals栏中单击鼠标选择所需的信号,在窗口中间的下拉滚动条中可选择设置断点时该信号的变化要求,例如:->0,指该信号变化到0状态;!=1,指该信号处于非1状态。一个断点可以用多个信号所处的状态来作为定义条件,这些条件在逻辑上是与的关系。最后在Breakpoints窗口中,先选中ADD,再按Arm按钮使所设断点生效。本例中选择信号OUT->?作为断点条件,其意义是指断点条件成立的条件为OUT信号发生任何变化(变为0,1,Z或X状态)。这样仿真过程中在0ns,700ns,1000ns时刻都会遇到断点。

F. 波形编辑(Waveform Edit)。

除了用*.abv文件描述信号的激励波形外,ispLEVER还提供了直观的激励波形的图形输入工具-Waveform Editor。以下是用Waveform Editor编辑激励波形的步骤(仍以设计demo.sch为例):

1. 在Simulator Cotrol Panel窗口中,按Tools=>Waveform Editor菜单,进入波形编辑器窗口(Waveform Editing Tool),如下图所示:

2. 在上述窗口中按Object=>Edit Mode,将弹出如下图所示的波形编辑子窗口:

3. 在Waveform Editing Tool窗口中按Edit=>New Wave菜单,弹出如下窗口:

    在该窗口中的Polarity选项中选择Input,然后在窗口下部的空格中输入信号名:A,B,C,D,CK。每输完一个信号名按一次Add钮。

4. 在完成上述步骤3以后,Waveform Editing Tool窗口中有了A,B,C,D,CK的信号名,如下图所示:

    单击窗口左侧的信号名A,开始编辑A信号的激励波形。单击0时刻右端且与A信号所处同一水平位置任意一点,波形编辑器子窗口中将显示如下信息:

    在States栏中选择Low,在Duration栏中填入200ns并按回车键。这时,在Waveform Editing Tool窗口中会显示A信号在0-200ns区间为0的波形。然后在Waveform Editing Tool窗口中单击200ns右侧区间任一点,可在波形编辑器的子窗口中编辑A信号的下一个变化。重复上述操作过程,编辑所有输入信号A,B,C,D,CK的激励波形,并将它存盘为wave_in.wdl文件。完成后,Waveform Editing Tool窗口如下图所示:

5. 在Waveform Editing Tool菜单中,按File=>Consistency Check菜单,检测激励波形是否存在冲突。在该例中,错误信息窗口会提示No Errors Dected。

6. 至此,激励波形已描述完毕,剩下的工作是调入该激励文件(wave_in.wdl)进行仿真:

回到ispLEVER Project Navigator 主 窗 口, 按 Source=>Import菜单,调入激励文件wave_in.wdl。在窗口左侧的源程序区选中Wave_in.wdl文件,双击窗口右侧的Functional Simulation栏进入功能仿真流程,以下的步骤与用*.abv描述激励的仿真过程完全一致,在此不再赘述。

二、时序仿真(Timing Simulation)

       时序仿真的操作步骤与功能仿真基本相似,以下简述其操作过程中与功能仿真的不同之处。

  仍以设计Demo为例,在ispLEVER Project Navigator主窗口中,在左侧源程序区选中Demo.abv,双击右侧的Timing Simulation栏进入时序仿真流程。由于时序仿真需要与所选器件有关的时间参数,因此双击Timing Simulation栏后,软件会自动对器件进行适配,然后打开与功能仿真时间相同的Simulator Control Panel窗口。

      时序仿真与功能仿真操作步骤的不同之处在于仿真的参数设置上。在时序仿真时,打开Simulator Control Panel窗口中的Simulate=>Settings菜单,产生Setup Simulator对话框。在此对话框中可设置延时参数(Simulation Delay)最小延时(Minimun Delay)、典型延时(Typical Delay)、最大延时(Maximun Delay)和0延时(Zero Delay)。 最小延时是指器件可能的最小延时时间,0延时指延时时间为0。

     在Setup Simulator对话框中, 仿真模式(Simulation Mode)可设置为两种形式:惯性延时(Inertial Mode)和传输延时(Transport Mode)。

     将仿真参数设置为最大延时和传输延时状态,在Waveform Viewer窗口中显示的仿真结果如下图所示:

由图可见,与功能仿真不同的是:输出信号OUT的变化比时钟CK的上升沿滞后了5ns。

5.建立元件符号(Symbol)

ispLEVER工具的一个非常有用的特点是能够迅速地建立起一张原理图的符号。通过这一步骤,你可以建立一个可供反复调用的逻辑宏元件,以便放置在更高一层的原理图纸上。下一节将指导你如何调用。这里仅教你如何建立元件符号。

A.双击原理图的资源文件demo.sch,把它打开。

B.在原理图编辑器中,选择File菜单。

C.从下拉菜单中,选择Matching Symbol命令。

D.关闭原理图。

E.至此,这张原理图的宏元件符号已经建立完毕,并且被加到元件表中。你可以在下一节中调用这个元件。

3.4 硬件描述语言和原理图混合输入

ispLEVER软件支持ABEL/原理图、VHDL/原理图、Verilog/原理图的混合输入。这一节,我们以ABEL/原理图为例,介绍硬件描述语言和原理图混合输入的方法。

现在,你要建立一个简单的ABEL HDL语言输入的设计,并且将其与上一节中完成的原理图进行合并,以层次结构的方式,画在顶层的原理图上。然后对这个完整的设计进行仿真、编译,最后适配到器件中。

1.   启动ispLEVER

如果你在上一节的练习后退出了ispLEVER,点击Start => Programs => LatticeSemiconductor => ispLEVER菜单,屏幕上你的项目管理器应该如下图所示。 

2.   建立顶层的原理图

A.仍旧选择LC4032V-10T44I器件,从菜单条上选Source。

B.选择New...

C.在对话框中选Schematic,并按OK。

D.在文本框中输入文件名top.sch,并按OK。

E.现在你就进入了原理图编辑器。

F.调用上节中创建的元件符号。选择Add菜单中的Symbol项,这时会出现Symbol Libraries对话框,选择Local的库,你会注意到在下部的文本框中有一个叫demo的元件符号,这就是你在上一节中自行建立的元件符号。

G.选择demo元件符号,并放到原理图上的合适位置。

3.   建立内含ABEL语言的逻辑元件符号

现在你要为ABEL HDL设计文件建立一个元件符号。只要知道了接口信息,你就可以为下一层的设计模块创建一个元件符号。而实际的ABEL设计文件可以在以后再完成。

A.在原理图编辑器里,选择ADD菜单里的New Block Symbol...命令。

B.这时候会出现一个对话框,提示你输入ABEL模块名称及其输入信号名和输出信号名。请按照下图所示输入信息:

C.当你完成信号名的输入,按Run按钮,就会产生一个元件符号,并放在本地元件库中。同时元件符号还粘连在光标上,随之移动。

D.把这个符号放在demo符号的左边。

E.单击鼠标右键,就会显示Symbol Libraries的对话框。

请注意abeltop符号出现在Local库中。

F.关闭对话框。你的原理图应该如下图所示:

G.完成原理图

   现在请你添加必需的连线,连线名称,以及I/O标记,来完成顶层原理图,使其看上去如下图所示。如果你需要帮助,请参考第二节中有关添加连线和符号的指导方法。当你画完后,请存盘再退出。

4.   建立ABEL-HDL源文件

   现在你需要建立一个ABEL源文件,并把它链接到顶层原理图对应的符号上。项目管理器使这些步骤简化了:

A.你当前的管理器应该如下图所示:

B.请注意abeltop左边的红色“?”图标。这意味着目前这个源文件还是个未知数,因为你还没有建立它。同时也请注意源文件框中的层次结构,abeltop和demo源文件位于top原理图的下面并且偏右,这说明它们是top原理图的底层源文件。这也是ispLEVER项目管理器另外一个有用的特点。

C.为了建立所需的源文件,请选择abeltop,然后选择Source菜单中的New...命令。

D.在New Source对话框中,选择ABEL-HDL Module并按OK。

E.下一个对话框会问你模块名,文件名,以及模块的标题。为了将源文件与符号相链接,模块名必须与符号名一致,而文件名没有必要与符号名一致。但为了简单,你可以给它们取相同的名字。按下图所示,填写相应的栏目: 

F.按OK。你就进入了Text Editor,而且可以看到ABEL HDL设计文件的框架已经呈现在你的面前。

G.输入下列的代码。确保你的输入代码位于TITLE语句和

END语句之间。

MODULE abeltop

TITLE 'This is the Top Level ABEL file'

" Inputs

IN1,IN2,IN3 pin;

"Outputs

OUT1,OUT2,OUT3,OUT4     pin;

Equations

OUT1=IN1 & !IN3;

OUT2=IN1 & !IN2;

OUT3=!IN1 & IN2 & IN3;

OUT4=IN2 & IN3;

END

H.当你完成后,选择File菜单中的Save命令。

I.退出文本编辑器。

请注意项目管理器中abeltop源文件左边的图标已经改变了。这就意味着你已经有了一个与此源文件相关的ABEL文件,并且已经建立了正确的链接。

5.  编译ABEL HDL

A. 选择abeltop源文件。

B.在处理过程列表中,双击Compile Logic过程。当处理过程结束后,你的项目管理器应该如上图所示。

6.  仿真

    你现在可以对整个设计进行仿真。为此,你需要一个新的测试矢量文件。在这个例子中你只需要修改当前的测试矢量文件。

A.双击demo.abv源文件,就会出现文本编辑器。

B.按照下图修改测试矢量文件:

module demo;

c,x = .c.,.x.;

CLK,TOPIN1,TOPIN2,TOPIN3,TOPOUT   PIN;

TEST_VECTORS

([CLK,TOPIN1,TOPIN2,TOPIN3]->[TOPOUT])

[ c , 0 , 0 , 0 ]->[ x ];

[ c , 0 , 0 , 1 ]->[ x ];

[ c , 0 , 1 , 0 ]->[ x ];

[ c , 0 , 1 , 1 ]->[ x ];

[ c , 1 , 0 , 0 ]->[ x ];

[ c , 1 , 0 , 1 ]->[ x ];

[ c , 1 , 1 , 0 ]->[ x ];

[ c , 1 , 1 , 1 ]->[ x ];

 END

C.完成后,存盘退出。

D.仍旧选择测试矢量源文件,双击Functional Simulation过程,进行功能仿真。

E.现进入Simulation Control Panel窗口。按 Tools=> Waveform Viewer窗口,打开波形观测器准备查看仿真结果。

F.为了看波形,你必须在Waveform Viewer窗口中按Edit=>Show菜单,弹出如下Show Waveforms窗口:

G.Show Waveforms窗口中选择CLK, TOPIN1, TOPIN2, TOPIN3和TOPOUT信号,并且按Show钮。然后按File=>Save菜单。这些信号名都可以在波形观测器中观察到。再按Run钮进行仿真,其结果如下图所示:

H.在步骤D中,如双击Timing Simulation过程,即可进入时序仿真流程,以下仿真步骤与功能仿同。

7.  把设计适配到Lattice器件中

现在你已经完成了原理图和ABEL语言的混合设计及其仿真。剩下的步骤只是将你的设计放入器件中。因为你已经在第二节中选择了器件,你可以直接执行下面的步骤:

H.在源文件窗口中选择LC4032V-10T44I器件作为编译对象,并注意观察对应的处理过程。

I.双击处理过程Fit Design。这将迫使项目管理器完成对源文件的编译,然后连接所有的源文件,最后进行逻辑分割,布局和布线,将设计适配到所选择的Lattice器件中。

J.当这些都完成后,你可以双击HTML Fitter Report,查看一下设计报告和有关统计数据。

K.祝贺!!你现在已经完成了设计例子,并且掌握了ispLEVER的主要功能。

8. 层次化操作方法

    层次化操作是ispLEVER项目管理器的重要功能,它能够简化层次化设计的操作。

A.在项目管理器的源文件窗口中,选择最顶层原理图“top.sch”.此时在项目管理器右边的操作流程清单中必定有Navigation Hierarchy过程。                                                                                                

a) 双击Navigation Hierarchy过程,即会弹出最顶层原理图“top.sch”。

B.选择View菜单中的Push/Pop命令,光标就变成十字形状。

C.用十字光标单击顶层原理图中的abeltop符号,即可弹出描述abeltop逻辑的文本文件abeltop.abl。此时可以浏览或编辑ABELHDL设计文件。浏览完毕后用File菜单中的Exit命令退回顶层原理图。

D.用十字光标单击顶层原理图中的demo符号,即可弹出描述demo逻辑的底层原理图demo.sch。此时可以浏览或编辑底层原理图。

E.若欲编辑底层原理图,可以利用Edit菜单中的Schematic命令进入原理图编辑器。编译完毕后用File菜单中的Save和Exit命令退出原理图编辑器。

F.底层原理图浏览完毕后用十字光标单击图中任意空白处即可退回上一层原理图。

G.若某一设计为多层次化结构,则可在最高层逐层进入其底层,直至最底一层;退出时亦可以从最底层逐层退出,直至最高一层。

H.层次化操作结束后用File菜单中的Exit命令退回项目管理器。

                                                                                                                  

3.5 ispLEVER工具中VHDL和Verilog语言的设计方法

用户的VHDL或Verilog设计可以经ispLEVER系统提供的综合器进行编译综合,生成EDIF格式的网表文件,然后可进行逻辑或时序仿真,最后进行适配,生成可下载的JEDEC文件。

VHDL设计输入的操作步骤

在ispLEVER System Project Navigator主窗口中,按File=>New Project菜单建立一个新的工程文件,此时会弹出如下图所示的对话框。请注意:在该对话框中的Project Type栏中,必须根据设计类型选择相应的工程文件的类型。本例中,选择VHDL类型。若是Verilog设计输入,则选择Verilog HDL类型。

将该工程文件存盘为demo.syn。

在ispLEVER System Project Navigator主窗口中,选择Source=>New菜单。在弹出的New Source对话框中,选择VHDL Module类型。

此时,软件会产生一个如下图所示的New VHDL Source对话框:

在对话框的各栏中,分别填入如上图所示的信息。按OK钮后,进入文本编辑器-Text Editor编辑VHDL文件。

在Text Editor中输入如下的VHDL设计,并存盘。

library ieee;

use ieee.std_logic_11.all;

entity demo is

    port ( A, B, C, D, CK:    in std_logic;

        OUTP:    out std_logic);

end demo;

architecture demo_architecture of demo is

signal INP: std_logic;

begin

    Process (INP, CK)

    begin

        if (rising_edge(CK)) then

            OUTP <= INP;

        end if;

    end process;

INP <= (A and B) or (C and D);

end demo_architecture;

此VHDL设计所描述的电路与5.2节所输入的原理图相同,只不过将输出端口OUT改名为OUTP(因为OUT为VHDL语言保留字)。

此时,在 ispLEVER System Project Navigator主窗口左侧的源程序区中,demo.vhd文件被自动调入。选择器件ispMACH4A5-/32-10JC,并启动Options=>Select RTL Synthesis菜单,显示如下对话框:

在该对话框选择Synplify,即采用Synplify工具对VHDL设计进行综合。

 此时的ispLEVER System Project Navigator主窗口如下图所示:

双击Processes窗口的Synplify Synthesize VHDL File进行编译、综合。或者选择菜单Tools=> Synplify Synthesis产生如下窗口。选Add调入demo.vhd,然后对demo.vhd文件进行编译、综合。 

若整个编译、综合过程无错误,该窗口在综合过程结束时会自动关闭。若在此过程中出错,双击上述Synplify窗口中Source Files栏中的demo.vhd文件进行修改并存盘,然后按RUN钮重新编译。

在通过VHDL综合过程后,可对设计进行功能和时序仿真。在ispLEVER System Project Navigator主窗口中按Source=>New菜单,产生并编辑如下的测试向量文件demo.abv:

module demo; 

c,x = .c.,.x.;

CK,A,B,C,D,OUTP     PIN;

TEST_VECTORS

([CK, A, B, C, D]->[OUTP])

[ c , 0 , 0 , 0 , 0 ]->[ x ];

[ c , 0 , 0 , 1 , 0 ]->[ x ];

[ c , 1 , 1 , 0 , 0 ]->[ x ];

[ c , 0 , 1 , 0 , 1 ]->[ x ];

END

在ispLEVER System Project Navigator主窗口中选中左侧的demo.abv文件,双击右侧的Functional Simulation栏,进行功能仿真。在Waveform Viewer窗口中观测信号A,B,C,CK,D和OUTP,其波形如下图所示:

\

在ispLEVER System Project Navigator主窗口中选中左侧的demo.abv文件,双击右侧的Timing Simulation栏,进行时序仿真。选择Maximum Delay,在Waveform Viewer窗口中观测信号A,B,C,CK,D和OUTP,其波形如下图所示:

在ispLEVER System Project Navigator主窗口中选中左侧的ispMACH器件,双击右侧的Fit Design栏,进行器件适配。该过程结束后会生成用于下载的JEDEC文件demo.jed。

Verilog设计输入的操作步骤

    Verilog设计输入的操作步骤与VHDL设计输入的操作步骤完全一致,在此不再赘述。需要注意的是在产生新的工程文件时,工程文件的类型必须选择为Verilog HDL。

3.6 ispVM System-在系统编程的软件平台

     

Lattice器件的在系统编程是借助ispVM System 软件来实现的。ispVM System 软件集成在ispLEVER 软件中,它同时也可以是一个的器件编程软件。ispVM SystemTM 是一个综合的将设计下载到器件的软件包。该软件提供一种有效的器件编程方式,即采用由莱迪思半导体公司或其他公司的设计软件所生成的 JEDEC 文件来对 ISP 器件编程。这一完整的器件编程工具允许用户快速简便地通过 ispSTREAMTM 将设计烧写到器件上。

    在启动ispVM System前,先将Lattice下载电缆连接在PC机的并行口和待下载的印刷电路板上,并打开印刷电路板的电源。

在Windows中,按Start=>Programs=>Lattice Semiconductor=>ispVM System菜单启动ispVM System,如下图所示。

在LSC ispVM™ System窗口中,按ispTools=>Scan Chain菜单,ispVM System软件会自动检测JTAG下载回路,找到回路中所有的器件型号。在本例中,印刷电路板上的JTAG下载回路中仅有一片1032E器件,因此,Scan Chain后的窗口如下图所示。

在LSC ispVM™ System窗口中,双击New Scan Configuration Setup子窗口中的1032E栏,弹出Device Information对话框。在该对话框中的Data File栏里,选择需要下载的JED文件;在该对话框中的Operation栏里,选择所需的编程操作,这里选Erase,Program,Verify,对器件进行擦除、编程、校验。完成这些操作后,Device Information对话框如下图所示。按OK钮,关闭该对话框。

在LSC ispVM™ System窗口中,按Project=>Download菜单启动下载操作。数秒钟后,下载完成,这时New Scan Configuration Setup子窗口中的Status栏显示PASS,并有一个绿色的圆点,参见下图。

器件回读与加密

器件回读

    运用ispVM System软件,可以将已下载过的、未经加密的器件中的熔丝信息回读出来,并存储为新的JED文件共复制相同设计的器件。其操作方法是:在Device Information对话框中的Operation栏里,选择Read and Save JEDEC操作,同时,在Data File栏里,输入将要存放熔丝信息的文件名(JED文件)。在LSC ispVM™ System窗口中,按Project=>Download菜单启动回读操作。

器件加密

    为防止自己的设计被非法回读,设计者可以在下载设计的时候对器件进行加密。其操作方法是:在Device Information对话框中的Operation栏里,选择Erase,Program,Verify,Secure操作。在LSC ispVM™ System窗口中,按Project=>Download菜单启动加密下载操作。如果对加密后的器件进行回读操作,那么可以看到回存的JED文件中,熔丝信息均为0。

3.7  约束条件编辑器(Constraint Editor)的使用方法

ispLEVER软件中的 Constraints Editor是一个功能强大的、集成的设计参数设置工具,其可以设置Pin Attributes,Global Constraints,Resource Reservation等参数。根据用户所选器件型号的不同,可供选择的参数也不尽相同。以下我们仍以第四节中的设计为例,说明其使用方法。

在ispLEVER Project Navigator 的主窗口左侧,选中器件型号栏(LC4032V-10T44I), 双击右侧的Constraint Editor功能条,打开Constraint Editor,如下图所示。

点击窗口左侧Input Pins和Output Pins左边的,展现所有的输入信号:CLK,TOPIN1,TOPIN2,TOPIN3以及输出信号TOPOUT。双击这些信号名,在窗口右侧会出现对应于每个信号的参数行,如下图所示。

在参数行中,可以单独设置每个信号的Group Members,GLB,Macrocell,Pin,I/O Types,Slewrate,Fast bypass,Osm bypass,Input registers,Register powerup等参数。在这些参数中,最常用的是用于引脚锁定的参数Pin,其设置方法如下:

双击每个信号参数行的Pin这一格,输入该信号需要锁定的引脚序列号。假定信号CLK,TOPIN1,TOPIN2,TOPIN3和TOPOUT需要锁定的引脚号分别为39,2,3,4,7,分别输入这些引脚号,结果如下:

设置完成后,按File=>Save菜单存盘保存设置。无论是原理图还是用HDL做的设计,都可以采用这种方法设定器件的引脚。

若需设置Global Constraints,Resource Reservation的参数,可以按窗口右下方的Global Constraints和Resource Reservation菜单。

引脚锁定的另一种方法:

引脚锁定是参数设置中最常用的,以下介绍另一种直观的引脚锁定方法:

在Constraints Editor窗口中,按Device=>Package View菜单,窗口变成如下形式。

在右侧窗口中选中要锁定的信号名,按下鼠标左键,将该信号拖至窗口左边器件引脚图中对应的引脚上,放开左键,该信号就被锁定在对应的引脚上了。用这种方法锁定引脚方便、直观,在复杂设计中尤为如此。

第四章 软件基本实验与数字系统设计

实验系统使用须知:

1,实验系统要求使用微机稳压直流电源+5V,接通电源前,须检查机器与电源的正确连接,否则会损坏芯片。

2,实验系统的下载电缆与PC机打印口连接,在插拔下载电缆前,必须先切断实验系统的电源,否则可能损坏PC机的打印口和下载卡上的芯片。

3,实验连线时,必须断开电源,确定连线无误后,才接通电源,接通电源后,避免直拉接用手触摸PLD引脚,以免静电损伤PLD芯片。

实验一 七人表决器

一、实验目的

 l, 初步了解VHDL语言。

2, 会用行为描述方式来设计电路。

二、实验原理

  用七个开关作为表决器的7个输入变量,输入变量为逻辑“l”时表示表决者“赞同”;输入变量为“0”时, 表示表决者“不赞同”。输出逻辑“l”时, 表示表决“通过”;输出逻辑“0″时,表示表决“不通过”。当表决器的七个输入变量中有4个以上(含4个)为“1”时,  则表决器输出为“l”; 否则为“0”。

  七人表决器设计方案很多, 比如用多个全加器采用组合电路实现。用VHDL语言设计七人表决器时, 也有多种选择。常见的VHDL语言描述方式有行为描述、寄存器传输(RTL)描述、结构描述以及这几种描述在一起的混合描述。我们可以用结构描述的方式用多个全加器来实现电路, 也可以用行为描述。

  采用行为描述时, 可用一变量来表示选举通过的总人数。当选举于或等于4时为通过, 绿灯亮;反之不通过时, 黄灯亮。描述时, 只须检查每一个输入的状态(通过为“l”,不通过为“0”)并将这些状态值相加, 判断状态值和即可选择输出。

三、实验内容

  l. 用VHDL语言设计上述电路。

2,下载并验证结果。

四、设计提示

  1. 初次接触VHDL语言应注意语言程序的基本结构, 数据类型及运算操作符。

  2. 了解变量和信号的区别。

  3. 了解进程内部顺序执行语句及进程外部并行执行语句的区别。

五、实验报告要求

  1. 写出七人表决器的VHDL语言设计源程序。

  2. 书写实验报告时要结构合理, 层次分明, 在分析叙述时注意语言的流畅。

六、程序清单(见ep1k30P\\soft_base\目录下vote7.vhd)

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

ENTITY vote7 IS

    PORT

    (    men        : IN    std_logic_vector(6 downto 0);

        pass,stop    : buffer std_logic

);

    

END vote7;

ARCHITECTURE behave OF vote7 IS

BEGIN

stop<=not pass;

    PROCESS (men)

        variable temp:std_logic_vector(2 downto 0);

            BEGIN

             temp:="000";

             for i in 0 to 6 loop

                if(men(i)='1') then

                   temp:=temp+1;

                  else

                   temp:=temp+0;

                 end if;

              end loop;    

pass<=temp(2);

    END PROCESS;

 END behave;

 功能:  参加表决者7人,同意者过半则表决通过。

        下载程序:  vote7.sof

45~51接K1~K7;    10接L1;    9接L2;        

操作运行:  K1~K7代表七个表决者,同意时将开关设为高电平,否则置为低;表决通过时L1灯,不通过则L2灯亮。

实验二 BCD码加法器

一、实验目的

  1. 熟练掌握用VHDL语言的行为描述及构造体描述设计组合电路。

  2. 初步掌握真值表的设计。

二、实验原理

  BCD码是一种二进制代码表达的十进制数。BCD码与四位二进制代码关系如下表所示, 从表中可以看到从0~9时, BCD码与四位二进制码相同。从l0~15后, BCD码等于四位二进制码加“0ll0”。这个关系构成了四位二进制码与BCD码的转换关系, 同时也是用四位二进制加法器实现BCD码加法的算法基础。

设计BCD码加法器首先要将两个BCD码输入到二进制加法器相加, 得到的和数是一个二进制数, 然后通过下表将四位二进制码转换成BCD码。

            BCD码与四位二进制代码关系

三、实验内容

  1. 用VHDL语言的行为描述方式设计BCD码加法器, 并用仿真文件验证设计正确性。

  2. 选做题(提高部分)当两数相加大于19时, 输出将显示00,并且会闪动(用Hz频率控制闪动),另外扬声器会报警。

四、设计提示

  l. 用VHDL语言的构造体描述方式设计时, 加“6”校正电路实现真值表的设计。

  2. 用ⅥHDL语言的行为描述方式设计时, 要用条件语言判断两个BCD码数相加后是否大于9, 当大于9时, 采取加“6”校正。.

五、实验报告要求

  1. 叙述所设计的BCD码加法器电路工作原理。

  2. 写出用VHDL语言的构造体描述方式设计BCD码加法器的各模块源文件。

  3. 写出用VHDL语言的行为描述方式设计BCD码加法器的源文件。

  

六、程序清单(ep1k30P\\soft_base\目录下bcdadder.vhd)

LIBRARY ieee;

USE ieee.std_logic_11.all;

USE ieee.std_logic_unsigned.all;

ENTITY bcdadd4 IS

    PORT (op1, op2    : in std_logic_vector(3 downto 0);

           result    : out std_logic_vector(4 downto 0)

        );

END bcdadd4;

ARCHITECTURE behavior OF bcdadd4 IS

    signal   binadd    :std_logic_vector(4 downto 0);

BEGIN

binadd<=('0' & op1) +('0' & op2);

  process(binadd)

   begin

if binadd>9 then

result <= binadd+6;

       else

result <= binadd;

     end if;   

  end process;      

END behavior;

功能: 输入为两个1位BCD码形式表示的十进制数op1和op2,输出为用BCD码表示的和result,最高位表示进位信号。 下载程序:  ep1k30P\\soft_base\目录下 bcdadd4.sof        45~52接K1~K8;    10~6接L1~L5;

操作运行:  K1~K4 分别对应为输入十进制数op1的高位到低位。K5~K8 分别对应为输入十进制数op2的高位到低位。 L2~L5分别对应输出结果result的高位到低位。L1为进位显示。

实验三 3×8译码器的设计

一、实验目的

   1、初步了解VHDL语言。

2、用组合逻辑电路设计3×8译码器。

二、实验原理

顾名思义,3×8译码器,就表示它有3 条输入线及输出线。另外为了方便译码器的控制或便于将来扩充之用,在设计时常常会增加一个EN输入脚(EN=1正常工作,EN=0时译码器不动作)这种做法在市面上的标准IC中常常见到。译码器的外部配置如下图所示。

              

当然,我们设计译码器时,第一个想到的应该是输入数码与输出数码之间的对应关系,也就是说“输入码和输出码之间的对应表”这应该是设计译码器的必须条件。对应表如下表所示:

A2  A1  A0

 Y7  Y6  Y5  Y4  Y3  Y2  Y1  Y0
0    0    000000001
0    0    100000010
0    1    000000100
0    1    100001000
1    0    000010000
1    0    100100000
1    1    001000000
1    1    110000000
                         3×8译码器真值表

有了真值表,就可以直接有查表法(LOOK UP TABLE)来设计,在VHDL的语法中,“WITH。。SELECT”、“CASE。。WHEN”及“WHEN。。ELSE”这类指令都是执行查表或对应动作的能手,使用前应该确定需要的是顺序性语法还是并行同时性命令,否则程序在进行编译时会发生错误。并体会进程内部顺序执行语句与进程外部并行执行语句的区别。

三、实验连线

33----->K1;

34----->K2;

35----->K3;

36----->K8;

10~3----->L1~L8(发光二极管)

通过改变输入端的值,观察输出端译码的变化。

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
A(0)

IN35Y(2)

OUT5
A(1)

IN34Y(3)

OUT6
A(2)

IN33Y(4)

OUT7
ENIN36Y(5)

OUT8
Y(0)

OUT3Y(6)

OUT9
Y(1)

OUT4Y(7)

OUT10
五、实验程序(文件夹Lattice1032/encoder/encoder.vhd)

library ieee;

use ieee.std_logic_11.all;

entity encoder is

  PORT(

       A   :IN  STD_LOGIC_VECTOR(2 DOWNTO 0);

       EN  :IN  STD_LOGIC;

       Y   :OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

end;

architecture a of encoder is

  SIGNAL  SEL:STD_LOGIC_VECTOR(3 DOWNTO 0);

begin

  SEL<=A & EN;        --将EN、A2、A1、A0合并成序列,目的是将EN脚的功能融入程序及电路中。

                      --当EN=1时,译码器正常工作,当EN=0时,译码器不动作。

  WITH SEL SELECT

Y<="00000001" WHEN "0001

          "00000010" WHEN "0011

          "00000100" WHEN "0101

          "00001000" WHEN "0111

          "00010000" WHEN "1001

          "00100000" WHEN "1011

          "01000000" WHEN "1101

          "10000000" WHEN "1111

          "00000000" WHEN OTHERS;

end a;

实验四 编码器的设计

一、实验目的

   1、初步了解VHDL语言,并学会简单的编程。

2、用组合逻辑电路设计8×3编码器。

二、实验原理

编码器是将2N个分离的信息代码以N个二进码来表示。如果一个编码器有N条输入线及M条输出线,则称之为N×M编码器;它的动作和译码器恰好相反。

编码器常常用于影音压缩或通信方面,以达到精简传输量的目的。其实编码器也可以看成是压缩电路,译码器也可以看成解压缩电路。传送数据前先用编码器压缩数据后再传出去,便能以N个数码来代替2N个数码的数据量,来提升传输效率。当N=4时,欲传送16个位的数据时仅需传送4个码即可,压缩率高达75%。如下图所示:

学过了译码电路的VHDL程序,编码器的设计其实就不太难了。和前面一样,有了编码器的外部管脚置图,如下图所示,就能够做Entity的定义,再根据编码器的真值表,和译码器一样使用查表法,Architecture内的描述便轻轻松松完成。

8×3编码器的真值表如下:

A7 A6 A5 A4 A3 A2 A1 A0

Y2 Y1 Y0
00000001000
00000010001
00000100010
00001000011
00010000100
00100000101
01000000110
10000000111
     编码器与译码器的功能互补。设计的概念都是一样的,直接利用查表法(look up table)就能轻易完成设计。(提供程序用查表法实现)

     当然,电路设计的方法众多,上题中也可以利用卡诺图来化简,求得其布尔方程式为:

               Y2=A7+A6+A5+A4,

               Y1=A7+A6+A3+A2,

               Y0=A7+A5+A3+A1

    大家可根据以上方程式自己试着用VHDL语言编程实现8×3编码器。

三、实验连线

30----->AN1;(接下降沿脉冲,使能端,高电平有效)

34~41----->K1~K8;(接拔动开关,表示输入信号)

10~8----->L1~L3;(接发光二极管,表示输出信号的变化)

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
ENIN30A(2)

IN39
A(7)

IN34A(1)

IN40
A(6)

IN35A(0)

IN41
A(5)

IN36Y(2)

OUT10
A(4)

IN37Y(1)

OUT9
A(3)

IN38Y(0)

OUT8
五、实验程序(见文件夹Lattice1032/coder/coder.vhd)

library ieee;

use ieee.std_logic_11.all;

entity coder is

  PORT(A  :IN  STD_LOGIC_VECTOR(7 DOWNTO 0);

       EN :IN  STD_LOGIC;

       Y  :OUT STD_LOGIC_VECTOR(2 DOWNTO 0));

end;

architecture a of coder is

SIGNAL  SEL:STD_LOGIC_VECTOR(8 DOWNTO 0);

begin

SEL<=EN & A;

   WITH SEL SELECT

     Y<="000" WHEN "100000001", --当输入是‘00000001’时,输出为‘000’。

        "001" WHEN "100000010", --当输入时‘00000010’时,输出为‘001’。

        "010" WHEN "100000100", --以此类推。

        "011" WHEN "100001000

        "100" WHEN "100010000

        "101" WHEN "100100000

        "110" WHEN "101000000

        "111" WHEN "110000000

        "000" WHEN OTHERS;

end a;

实验五 数码转换(二~十进制)及显示

一、实验目的

   1、初步掌握VHDL语言,并学会简单的编程和程序调试。

2、用组合逻辑电路设计二进制转成十进制和BCD码。

3、学会使用七段LED数码管。

二、实验原理

   (1)实验说明

在数字逻辑电路的内部,大多采用二进制或十六进制的数字节类型,在日常生活当中则几乎用的都是十进制,所以经常会遇到数字类型之间相互转换的问题。

本次实验将重点放在最常用的两种数码转换电路,第一种是二进制转换成十进制,第二种是BCD码转成七段显示器码。为了精简篇幅,这里把两种转换写在同一个程序里,也就是说,二进制的输入将被转换成十进制的BCD码,同时将BCD码再转换成七段显示器码。

其实电路中并不会用到十进制,转成十进制的目的是为了方便人们理解或便于观察电路的结果。现在我们就用VHDL来设计一个执行数码转换电路,将二进制的输入转换成十进制的输出。

下表是一个四位的二进制数码和其对应的十进制数码的对照表,其中这里所用的七段LED数码显示器是共阴型。(实验仪上Scan Display区的七段数码管为共阴型,但七段码输入前增加了一个74LS240缓冲/驱动且信号反相,因此这里七段输入也是低电平有效)。

输入信号输出1:BCD码

输出2:七段显示器码

二进制对应十进制十位数个位数十位数个位数
00000000000000000001100000011
00011000000010000001110011111
00102000000100000001100100101
00113000000110000001100001101
01004000001000000001110011001
01015000001010000001101001001
01106000001100000001101000001
01117000001110000001100011111
10008000010000000001100000001
10019000010010000001100001001
101010000100001001111100000011
101111000100011001111110011111
110012000100101001111100100101
110113000100111001111100001101
111014000101001001111110011001
111115000101011001111101001001
   注:七段数码管的段码顺序为:a,b,c,d,e,f,g,dp.

七段LED数码管可分为共阳极、共阴极两种,它们都可以等效成8个LED的连接电路。         

(2)程序设计提示

●  逻辑概念

    当输入为0~9的数,其十位数字为0,个位数=输入。

    当输入为10~15的数,十位数为1,个位数=输入-10。

●  数据类型

    输入为UNSIGNED(3 downto 0),因为有减法运算要执行。

    输出有两个,分别为十位数(BCD1)、个位数(BCD0),都是BCD码,故定义成 

    STD_LOGIC_VECTOR(3 DOWNTO 0)。

●  七段LED数码管动态显示

    LED动态显示是将所有相同的段码线并接在一个I/O口上,共阴极端或共阳极端分别由相应的I/O口线控制。由于每一位的段选线都在一个I/O口上,所以每送一个段选码,所有的LED数码管都显示同一个字符,这种显示器是不能用的。解次此问题的方法是利用人的视觉滞留,从段选线I/O口上按位次分别送显示字符的段选码,在位选控制口也按相应的次序分别选通相应的显示位(共阴极送低电平,共阳极送高电平),选通位就显示相应字符,并保持几毫秒的延时,未选通位不显示字符(保持熄灭)。这样,对各位显示就是一个循环过程。从计算机的工作来看,在一个瞬时只有一位显示字符,而其它位都是熄灭的,但因为人的视觉滞留,这种动态变化是觉察不到的。从效果上看,各位显示器能连续而稳定地显示不同的字符。这就是动态显示。

三、实验连线

20(CP1)----->1024HZ (用于动态数码管的位选扫描)

34----->K1;

35----->K2;

36----->K3;

37----->K4;(K1~K4为逻辑拔动开关,表示四位二进制输入)

11----->L1;

12----->L2;(L1、L2为Scan Display区LED数码管的公共端)

z1----->JX1(a~g)

拔动逻辑开关K1~K4,输入不同的二进制数,观察数码管的对应输出是否为相应的十进制BCD码。

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
CPIN20NUM(3)

OUT6
A(3)

IN34NUM(4)

OUT7
A(2)

IN35NUM(5)

OUT8
A(1)

IN36NUM(6)

OUT9
A(0)

IN37NUM(7)

OUT10
NUM(0)

OUT3SEL(0)

OUT11
NUM(1)

OUT4SEL(1)

OUT12
NUM(2)

OUT5
五、实验程序(见文件夹Lattice1032/numcvt/numcvt.vhd)

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

--*******************************

entity numcvt is

  PORT(A   : IN  UNSIGNED(3 DOWNTO 0);

       CP  : IN  STD_LOGIC;

       SEL:  OUT STD_LOGIC_VECTOR(1 DOWNTO 0);

       NUM:  OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

end;

--*******************************

architecture a of numcvt is

SIGNAL  count:STD_LOGIC_VECTOR(1 DOWNTO 0);

SIGNAL  temp: STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL  BCD0,BCD1: STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL  SEVEN0,SEVEN1:STD_LOGIC_VECTOR(6 DOWNTO 0);

begin

  PROCESS(CP)              --CP取1024HZ

  BEGIN

    IF(CP'EVENT AND CP='1') THEN

       if(count="01")then

count<="00";

       else

count<=count+'1';

       end if;        

       END IF;

  END PROCESS;

 PROCESS(A)

 BEGIN

IF A<10 THEN

BCD1<="0000";

BCD0<=STD_LOGIC_VECTOR(A);

       ELSE

BCD1<="0001";

BCD0<=A-10;

       END IF;

 END PROCESS;

SEL<="01" when count="00" else

     "10" when count="01" ;

temp<=BCD1 when SEL="01" else

      BCD0 when SEL="10";    

WITH temp select

NUM <="00000011" WHEN "0000", --0

           "10011111" WHEN "0001", --1

           "00100101" WHEN "0010", --2

           "00001101" WHEN "0011", --3

           "10011001" WHEN "0100", --4

           "01001001" WHEN "0101", --5

           "01000001" WHEN "0110", --6

           "00011111" WHEN "0111", --7

           "00000001" WHEN "1000", --8

           "00001001" WHEN "1001", --9

           "01110001" WHEN OTHERS;

end a;

实验六 算术运算(4位全法器的设计)

一、实验目的

   1、初步掌握VHDL语言,并学会简单的编程和程序调试。

2、用组合逻辑电路设计4位全加器。

3、初步掌握系统内部STD_LOGIC_UNSIGNED包的调用。

二、实验原理

   (1)相关数据类型说明

    ★ 问题一:数据类别

            基本上,VHDL是硬件电路描述语言,所以处理的信号不外乎是逻辑信号和数值信号两种。逻辑信号是0和1的组合,是基本的电路信号,它所执行的运算是布尔代数运算;另外的数值信号则是日常生活中所使用的数字,用来作加、减、乘、除的运算。在VHDL的算术运算中,及内定的数据类型为整数或浮点数,需要做运算的是数值信号,但是执行运算的电路,却要求使用STD_LOGIC或STD_LOGIC_VECTOR的数据类型,因此当同一个信号需要执行`逻辑和算术两种运算时,将其数据类型定义成UNSIGNED即可。被定义成UNSIGNED的信号经过语法转换或是运算之后,便可以当作逻辑信号来处理,在程序设计时必须小心。

    ★ 问题二:进位的处理

           在执行加法或乘法的运算时,可能会有进位(CARRY)产生,如果没有善加处理,很可能会产生错误的结果。在VHDL程序中,是不会自动产生进位的,这样的安排可以让计数器设计的工作变得更为简单而直接(9 数完直接跳回0)。相对地,如果要执行相加或相乘的运算时,就必须另外处理进位,否则将无法得到正确的结果。

   (2)设计4位全加器

        首先考虑会有进位的产生,所以电路的输出部分需要增加一个位(Cout),作为存储进位之用。另外输入处也可能会有前一级加法器所产生的进位位,故在输入处也增加一个位(Cin),其电路的外部配置如下图所示:

下表为全加法器的真值表:

加法器输入加法器输出
ABCinBCDoutCout
00000
00110
01010
01101
10010
10101
11001
11111
       根据全加器的真值表,可推导出布尔方程式:

       BCDout = A  xor  B  xor  Cin

       Cout = (A  and  B)  or  (A  and  Cin)  or  (B  and  Cin)

  (3)试着自己设计一个减法器

       减法器的外部设置和全加器相同,唯一的不同是BCDout代表A-B的差,因此可以使用和加法器相同的Entity定义。自己试着写出减法器的真值表,并推导出布尔方程式。写出程序并调试通过。

              

三、实验连线

34~41----->K1~K2;(K1~K4表示加数A,K5~K8表示被加数B,由高位到低位)

31----->AN1;(AN1单脉冲输入,表示进位位)

10~7----->L1~L4;(L1~L4为发光二极管,表示相加之和BCDout)

5----->L6;(L6为发光二极管,表示相加之后产生的进位)

改变输入端的值,观察输出端的变化。

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
A(3)

IN34B(0)

IN41
A(2)

IN35CININ31
A(1)

IN36BCDOUT(3)

OUT10
A(0)

IN37BCDOUT(2)

OUT9
B(3)

IN38BCDOUT(1)

OUT8
B(2)

IN39BCDOUT(0)

OUT7
B(1)

IN40COUTOUT5
五、实验程序(见文件夹Lattice1032/add4/add4.vhd)

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

--******************************

entity add4 is

   PORT(  A : IN UNSIGNED(3 DOWNTO 0);

          B : IN UNSIGNED(3 DOWNTO 0);

          CIN: IN STD_LOGIC;

          BCDOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

          COUT :OUT STD_LOGIC);

end;

--******************************

architecture a of add4 is

SIGNAL Y,C:STD_LOGIC_VECTOR(3 DOWNTO 0);

begin

   Y(0)<=A(0) XOR B(0) XOR CIN;  --从最低位往右计算至最高位。

   Y(1)<=A(1) XOR B(1) XOR C(0);

   Y(2)<=A(2) XOR B(2) XOR C(1);

Y(3)<=A(3) XOR B(3) XOR C(2);

   C(0)<=(CIN AND A(0)) OR (CIN AND B(0)) OR (A(0) AND B(0));

C(1)<=(C(0) AND A(1)) OR (C(0) AND B(1)) OR (A(1) AND B(1));

C(2)<=(C(1) AND A(2)) OR (C(1) AND B(2)) OR (A(2) AND B(2));

C(3)<=(C(2) AND A(3)) OR (C(2) AND B(3)) OR (A(3) AND B(3));

   BCDOUT<=Y(3)&Y(2)&Y(1)&Y(0);

   COUT<=C(3);

end a;

实验七 四位并行乘法器

一、实验目的

  l. 用组合电路设计四位并行乘法器。

  2.了解并行法设计乘法器的原理。

3. 学会使用模块化设计方法来编程。

二、实验原理

  四位乘法器有多种实现方案, 根据乘法器的运算原理, 使部分乘积项对齐相加的方法(通常称并行法)是最典型的算法之一。这种算法可用组合电路实现。其特点是设计思路简单直观、电路运算速度快, 缺点是使用器件较多。

 (1), 并行乘法的算法

   下面将从乘法例题来分析这种算法, 题中M4M3M2M1是被乘数,也可以用M表示。N4N3N2N1是乘数, 也可以用N表示。

  从以上乘法实例中可以看到乘数N中的每一位都要与被乘数M相乘, 获得不同的积, 如M×Nl,M×N2,...。位积之间以及位积与部分乘法之和相加时需按高低位对齐, 并行相加,

才能得到正确结果。

(2), 并行乘法电路原理

并行乘法电路完全是根据以上算法而设计。其电路框图如图6-1所示。图中XB0 XBl XB2 XB3是乘数B的第l2位与被乘数A相乘的l×4bit 乘法器。三个加法器是将1×4bit 乘法器的积作为被加数A, 前一级加法器的和作为加数B, 相加后得到新的部分积, 通过三级加法器的累加最终得到乘积P(P7P6PP5P4P3P2Pl)。下图为图6-1:

三、实验连线

34~41----->K1~K8;(K1~K4表示4乘数,K5~K8表示4位被乘数)

10~3----->L1~L8;(L1~L8为发光极管,表示相乘之积)

注:改变乘数和被乘数的值,观察乘积项的变化。

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
OP1(3)

IN34RESULT(0)

OUT3
OP1(2)

IN35RESULT(1)

OUT4
OP1(1)

IN36RESULT(2)

OUT5
OP1(0)

IN37RESULT(3)

OUT6
OP2(3)

IN38RESULT(4)

OUT7
OP2(2)

IN39RESULT(5)

OUT8
OP2(1)

IN40RESULT(6)

OUT9
OP2(0)

IN41RESULTa(7)

OUT10
五、实验程序(见文件夹Lattice1032/mul4p/mul4p.vhd)

library ieee;

use ieee.std_logic_11.all;

entity AND2A is

PORT(a,b:in std_logic;

       c:out std_logic);

end;

architecture behavioral of AND2A is

begin

C<=A AND B;

end behavioral;

library ieee;

use ieee.std_logic_11.all;

uSE ieee.std_logic_unsigned.all;

entity mul4p is

port(op1,op2:in std_logic_vector(3 downto 0);

          result:out std_logic_vector(7 downto 0));

end mul4p;

architecture count of mul4p is

COMPONENT and4a PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

                    en:IN STD_LOGIC;

                    r:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END COMPONENT;

COMPONENT ls283 poRT(o1,o2:IN STD_logic_vector(3 downto 0);

                     res:out std_logic_vector(4 downto 0));

end component;

signal sa:std_logic_vector(3 downto 0);

signal sb:std_logic_vector(4 downto 0);

signal sc:std_logic_vector(3 downto 0);

signal sd:std_logic_vector(4 downto 0);

signal se:std_logic_vector(3 downto 0);

signal sf:std_logic_vector(3 downto 0);

signal sg:std_logic_vector(3 downto 0);

--signal tmp1:std_logic;

begin

sg<=('0'&sf(3 downto 1));

--tmp1<=op1(1);

u0:and4a port map(a=>op2,en=>op1(1),r=>se);

U1:and4a port map(a=>op2,en=>op1(3),r=>sa);

U2:ls283 port map(o1=>sb(4 downto 1),o2=>sa,res=>result(7 downto 3));

U3:and4a port map(a=>op2,en=>op1(2),r=>sc);

U4:ls283 port map(o1=>sc,o2=>sd(4 downto 1),res=>sb);

u5:ls283 port map(o1=>sg,o2=>se,res=>sd);

u6:and4a port map(a=>op2,en=>op1(0),r=>sf);

result(0)<=sf(0);

result(1)<=sd(0);

result(2)<=sb(0);

--result(7 downto 0)<="00000000";

end count;

library ieee;

use ieee.std_logic_11.all;

USE ieee.std_logic_unsigned.all;

entity and4a is port(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

                    en:IN STD_LOGIC;

                    r:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

end and4a;

 

architecture behave of and4a is

begin

process(en,a(3 downto 0))

 begin

 if(en='1') then

r<=a;

  else

r<="0000";

 end if;

end  process;

end behave;

library ieee;

use ieee.std_logic_11.all;

USE ieee.std_logic_unsigned.all;

entity ls283 is port(o1,o2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

                    res:OUT STD_LOGIC_VECTOR(4 DOWNTO 0));

end ls283;

 

architecture behave of ls283 is

begin

process(o1,o2)

 begin

res<=('0'&o1)+('0'&o2);

end process;

end behave;

实验八 设计基本触发器(D,JK)

一、实验目的

  1、 设计D锁存器。

2、 设计JK触发器。

   3、 掌握时序逻辑电路的设计。

二、实验原理

    通常在时序逻辑电路设计里,触发器被应用在如下电路上:如数据暂存、时间延迟、计数、分频、波形产生(脉冲、方法、双相波)、波形修整等。尤其是在传统的时序逻辑电路,它可说是主要核心组件之一。下面先介绍几种常见的触发器以及它们的VHDL语言。

 (1), D触发/锁存器

正沿触发的D触发器的电路符号如下图所示。它是一个正边沿触发的D触发器,有一个数据输入端d, 一个时钟输入端clk和一个数据输出端q。D锁存器的真值表如下表所示。从表中可以看到, D锁存器的输出端只有在正沿脉冲过后,输入端d的数据才可以传递到输出端q。

 (2),JK 触发器

带有复位/置位功能的JK触发器电路符号如下图所示。JK触发器的输入端有置位输入pset, 复位输入clr, 控制输入j和k, 时钟信号clk输出端q 和反向输出端qb。JK触发器的真值表如下表所示。

                               JK触发器真值表

三、实验连线

  (1)D触发器

20(CP1)----->4KHZ ;(CLK时钟信号)

34----->K1;(D触发器输入端)

10----->L1;(D触发器输出端)

  (2)JK触发器

18----->1HZ;(CLK时钟信号)

34~35----->K1~K2;(K1,K2分别表示J,K输入端)

37~38----->K7~K8;(K7,K8分别表示CLR,PSET复位,置位端)

10~9----->L1~L2;(发光管L1,L2分别表示JK触发器输出端Q,QB)

四、引脚锁定

   (1)D触发器

信号名信号模式管脚号信号名信号模式管脚号
CLKIN20QOUT10
DIN34
  (2)JK触发器

信号名信号模式管脚号信号名信号模式管脚号
CLKIN18KIN35
CLRIN37QOUT10
PSETIN38QBOUT9
JIN34
五、实验程序

(1)D触发器(文件夹Lattice1032/D/D.vhd)

(2)JK触发器(文件夹Lattice1032/JK/JK.vhd)

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

--************************************

ENTITY JK IS

    PORT

    (   CLR,PSET,J,K,CLK: IN std_logic;

        Q,QB: OUT std_logic);    

END JK;

ARCHITECTURE behave OF JK IS

SIGNAL Q_S,QB_S:STD_LOGIC;

BEGIN

PROCESS(PSET,CLR,J,K,CLK)

BEGIN

   IF (CLR='0')AND(PSET='1')THEN

Q_S<='0';

QB_S<='1';

   ELSIF (PSET='0')AND(CLR='1') THEN

Q_S<='1';

QB_S<='0';

   ELSIF(CLK'EVENT AND CLK='1')THEN

      IF(J='0')AND(K='1')THEN

Q_S<='0';

QB_S<='1';

      ELSIF(J='1')AND(K='0')THEN

Q_S<='1';

QB_S<='0';

      ELSIF(J='1')AND(K='1')THEN 

Q_S<=NOT Q_S;

QB_S<=NOT QB_S;

      END IF;

   END IF;

Q<=Q_S;

QB<=QB_S;

END PROCESS;

END behave;

六、实验扩展

在以上D触发器和JK触发器的基础上,设计其它触发器如RS触发器、T触发器等,并研究其相互转化的方法。

实验九 设计74LS160计数器功能模块

一、实验目的

   1. 学会用VHDL语言设计时序电路。

  2. 用VHDL语言设计74LSl60 计数器功能模块。

二、实验原理

  计数器是最常用的寄存器逻辑电路, 从微处理器的地址发生器到频率计都需要用到计数器。一般计数器可以分为两类:加法计数器、减法计数器、可逆计数器。加法计数器每来一个脉冲计数值加1;减法计数器每来一个脉冲计数值减1;而可逆计数器由名称可以知道,它的计数方式可以加、也可以减。在语法上,就是将加法计数器和减法计数程序加以合并,而且使用一个控制信号决定计数器是作加法或减法的动作。

下面将通过模仿中规模集成电路74LSl60的功能, 用VHDL语言设计一个十进制可预置计数器(加法计数器)。74LSl60共有一个时钟输入端CLK, 一个清除输入端CLR, 两个计数允许信号P和T,4个可预置数据输入端D3-D0, 一个置位允许端LD, 4个计数输出端Q3-Q0,一个进位输出端TC, 其外部配置如下图所示:

                         74LS160外部配置图

其工作模式见下表所示。

                    74LS160功能表

            注:D=Q3 & !Q2 & !Q1 & Q0

三、实验连线

20(CP1)----->1HZ;(表示计数器工作时钟信号)

34~41----->K1~K8;(K1~K4表示4位可预置数据输入端D3~D0; K5~K8分别表示CLR,P,T,LD四个控制端口)

10~7----->L1~L4; (发光二极管L1~L4表示4个计数输出端Q3~Q0)

6----->L6;       (发光二极管L6表示一个进位输出端)

注:实验时,可根据74LS160的工作模式功能表,通过改变控制端和预置端的信号来观察

    计数器输出端的变化。

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
DATA(3)

IN34LDIN41
DATA(2)

IN35CLKIN20
DATA(1)

IN36COUNT(3)

OUT10
DATA(0)

IN37COUNT(2)

OUT9
CLRIN38COUNT(1)

OUT8
PIN39COUNT(0)

OUT7
TIN40TCOUT6
五、实验程序(见文件夹Lattice1032/ls160/ls160.vhd)

LIBRARY ieee;

USE ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

ENTITY ls160 IS PORT(data: in std_logic_vector(3 downto 0);

          clk,ld,p,t,clr:in std_logic;

           count: buffer std_logic_vector(3 downto 0);

           tc:out std_logic);

END ls160;

ARCHITECTURE behavior OF ls160 IS

BEGIN  

tc<='1' when (count="1001" and p='1' and t='1' and ld='1' and clr='1') else '0';

 

cale:

 process(clk,clr,p,t,ld)

   begin

     if(rising_edge(clk)) then

        if(clr='1')then

           if(ld='1')then

              if(p='1')then

                  if(t='1')then

                      if(count="1001")then

count<="0000";

                      else 

count<=count+1;

                      end if;

                  else 

count<=count;

                  end if;

             else

count<=count;

            end if;

        else

count<=data;

        end if;

      else 

count<="0000";

      end if;   

    end if;

 end process cale;      

END behavior;

六、实验扩展

(1)在上述十进制可预置加法计数器的基础上,修改程序,实现一个十六进制可预置加法计数器。

(2)设计一个十进制可预置减法计数器,并用VHDL写出程序,并调试通过。

(3)设计一个步长可变的加减计数器,如步长为3的加法计数器,计数状态变化为0、3、6、9、12……,步长值可由输入端控制。

第五章 硬件模块实验

实验一 模数转换实验(ADC0809)

一、实验目的:

1,了解使用计算机接口芯片ADC0809与PLD构筑系统。

2,了解ADC0809转换时的工作时序。

3,用VHDL硬件描述语言编写程序,并调试通过。

二、实验原理

    ADC0809是CMOS的8位A/D    转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。如硬件图所示,START是转换启动信号,高电平有效;ALE是3位通道选择地址(ADDC、ADDB、ADDA)信号的锁存信号。当模拟量送至某一输入端(如IN1或IN2等),由3    位地址信号选择,而地址信号由ALE锁存;EOC是转换情况状态信号,当启动转换约100us后,EOC产生一个负脉冲,以示转换结束;在EOC的上升沿后,若使输出使能信号OE为高电平,则控制打开三态缓冲器,把转换好的8位数据结果输至数据总线。至此ADC0809完成一次完整的转换。

根据ADC0809的工作时序、上图ADC0809硬件原理以及下图的设计原理,对CPLD进行编程,使其产生WR、CS、RD、EOC控制信号,对ADC0809进行控制,通过选择通道,将模拟电压量(由实验装置上的电位器产生)输入,进行转换。转换结果(D0~D7)送CPLD,然后通过LED数码管显示其数字量。

三、实验连线

WR—>73;

RD—>74;

CS1—>75;

L1—>71;

L2—>72;(此处L1,L2为Scan Display区数码管公共端)

EOC—>35;

K1—>34;(电平开关K1用来表示系统复位rst,高电平有效,平时应打在低电平)

Z1—>JX1;

Z2—>JX0;

CLK—>500KHZ;

20—>500KHZ;

ADDA~ADDC接电平开关;(选择通道IN0~IN2)

模拟量输出(0~5V)接相应的通道。

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
CPIN20RDOUT74
RSTIN34WROUT73
nINTRIN35SEGOUT(0)OUT3
DIN(0)IN83SEGOUT(1)OUT4
DIN(1)IN82SEGOUT(2)OUT5
DIN(2)IN81SEGOUT(3)OUT6
DIN(3)IN80SEGOUT(4)OUT7
DIN(4)IN79SEGOUT(5)OUT8
DIN(5)IN78SEGOUT(6)OUT9
DIN(6)IN77SEGOUT(7)OUT10
DIN(7)IN76SELOUT(0)OUT71
CSOUT75SELOUT(1)OUT72
五、实验说明

    CS、RD、WR,EOC:ADC0809的控制信号;

    DIN(0)--DIN(7):转换结果送CPLD;

    NINTR:转换结束标志;

    RST:系统复位;

    SELOUT(0)--SELOUT(1):位选择;

    SEGOUT(0)--SEGOUT(7):段码;

六、程序清单(见文件夹Lattice1032/adc0809/adc0809.vhd)

实验二 数模转换实验(DAC0832)

一、实验目的

1,了解使用计算机接口芯片DAC0832与PLD构筑系统。

2,了解DAC0832转换时的工作时序。

3,用VHDL硬件描述语言编写程序,并调试通过。

二、实验原理

根据DAC0832的工作时序、上图的DAC0832的硬件原理以及下图的设计原理,对CPLD进行编程,产生WR、CS控制信号以及数字量D0~D7,对0832进行控制,通过开关起动数/模转换,将由CPLD产生的数字量,转换成模拟量。转换结果由AOUT输出,LED数码管将显示其数字量(D0~D7)。

三、实验连线

Z1—>JX1;

Z3—>JX2;

WR—>37;

CS2—>36;

K1—>34;(K1为启动信号,高电平有效)

K2—>35;(K2为停止信号,高电平有效)

L1~L6—>76~81;(此处L1~L6为Scan Display区数码管公共端)

20—>1KHZ;

63—>8HZ;

模拟量由AOUT输出,可用电压表测得模拟量的变化。

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
CLKIN20SEGOUT(2)

OUT5
CLK1IN63SEGOUT(3)

OUT6
STARTIN34SEGOUT(4)

OUT7
STOPIN35SEGOUT(5)

OUT8
DATAOUT(7)

OUT68SEGOUT(6)

OUT9
DATAOUT(6)

OUT69SEGOUT(7)

OUT10
DATAOUT(5)

OUT70WROUT37
DATAOUT(4)

OUT71CSOUT36
DATAOUT(3)

OUT72SELOUT(0)

OUT76
DATAOUT(2)

OUT73SELOUT(1)

OUT77
DATAOUT(1)

OUT74SELOUT(2)

OUT78
DATAOUT(0)

OUT75SELOUT(3)

OUT79
SEGOUT(0)

OUT3SELOUT(4)

OUT80
SEGOUT(1)

OUT4SELOUT(5)

OUT81
五、实验说明

SELOUT(0)--SELOUT(7):位选择;

SEGOUT(0)--SEGOUT(7):段码;

START:启动转换;

STOP:停止转换;

CS、WR:DAC0832转换片选线与写线;

DATAOUT(0)--DATAOUT(7):转换数据输出;

六、程序清单(见文件夹Lattice1032/dac0832/dac0832.vhd)

实验三 步进电机(STEP)

一、实验目的:

1,了解使用步进电机与PLD构筑系统。

2,了解步进电机控制的基本工作原理,掌握步进电机编程方法。

3,用VHDL硬件描述语言编写程序,并调试通过。

二、实验原理

根据步进电机的硬件原理、设计原理,对CPLD进行编程,来实现对四相步进电机的控制。

步进电机的工作原理:

步进电也称为脉冲电机,它可以直接接收来自计算机的数字脉冲,使电机旋转过相应的角度。步进电机在要求快速启停,精确定位的场合做为执行部件,得到了广泛采用。

四相步进电机的工作方式:

*单相四拍工作方式,其电机控制绕组A、B、C、D相的正转通电顺序为:ABCDA;反转通电顺序为:ADCBA。

*四相八拍工作方式,正转的绕组通电顺序为:AABBBCCCDD

DAA;反向的通电顺序为:AADDDCCCBBBAA。

*双四拍工作方式,正转的绕组通电顺序为:ABBCCDDAAB;反向的通电顺序为:ABADDCCBBA。

步进电机有如下特点:给步进脉冲电机就转,不给步进脉冲电机就不转;步进脉冲的频率越高,步进电机转得越快;改变各相的通电方式,可以改变电机的运行方式;改变通电顺序,可以控制电机的正、反转。

三、实验连线

K1—>34;(逻辑电平开关K1表示“正转”)

K2—>35;(逻辑电平开关K2表示“反转”)

K3—>36;(逻辑电平开关K3表示“停止”)

20—>HZ;(CLK表示系统工作时钟)

HA~HD—>83~80;(四相步进电机输入端)

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
CLKIN20Y(0)OUT83
X0IN34Y(1)OUT82
X1IN35Y(2)OUT81
X2IN36Y(3)OUT80
五、实验说明

    X0:正向启动            X1:反向启动

    X2:停止

    Y(0)--Y(3):四相步进电机的电流输入端;

六、程序清单(见文件夹Lattice1032/step/step.vhd)

实验四 点阵显示(16*16 LED)

一、实验目的:

1,利用PLD控制LED点阵显示。

2,掌握LED点阵显示的电路设计与编程。

二、实验原理

实验电路提供了16位行控制信号,16位列控制信号,凡字形代码位“1”、列扫描信号“0”该点点亮,否则熄灭,通过分别用74LS240与7407来驱动,可以实现点阵显示汉字和图形曲线。

注:可通过字形取模软件建立标准字库,取出想要显示的汉字。

三、实验连线

20—>1KHZ;

63—>8HZ;

JX6—>Z1;(行8~行15)

JX7—>Z6;(列0~列7)

JX8—>Z2;(行0~行7)

JX9—>Z3;(列8~列15)

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
CLKIN20DATA(15)OUT3
CLKAIN63CHOICE(0)OUT68
DATA(0)OUT83CHOICE(1)OUT69
DATA(1)OUT82CHOICE(2)OUT70
DATA(2)OUT81CHOICE(3)OUT71
DATA(3)OUT80CHOICE(4)OUT72
DATA(4)OUT79CHOICE(5)OUT73
DATA(5)OUT78CHOICE(6)OUT74
DATA(6)OUT77CHOICE(7)OUT75
DATA(7)OUT76CHOICE(8)OUT34
DATA(8)OUT10CHOICE(9)OUT35
DATA(9)OUT9CHOICE(10)OUT36
DATA(10)OUT8CHOICE(11)OUT37
DATA(11)OUT7CHOICE(12)OUT38
DATA(12)OUT6CHOICE(13)OUT39
DATA(13)OUT5CHOICE(14)OUT40
DATA(14)OUT4CHOICE(15)OUT41
五、实验说明

CHOICE(0)--(15):列扫描线;

DATA(0)--(15):行数据;

六、程序清单(见文件夹Lattice1032/led/led.vhd)

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity led is

port(clk:in std_logic;

    clka:in std_logic;

    choice:out std_logic_vector(15 downto 0);

    data:out std_logic_vector(15 downto 0));

end;

architecture arth of led is

type romtable is array (0 to 15) of std_logic_vector(15 downto 0);

constant romc:romtable:=(

"1110000000001111

"1110111011101111

"1110111011101111

"1110111011101111

"1110111011101111

"1110111011101111

"1110111011101111

"0000000000000000

"1110111011101110

"1110111011101110

"1110111011101110

"1110111011101110

"1110111011101110

"1110111011101110

"1110000000001110

"1111111111111110");

constant romd:romtable:=(

"0111111011111111

"0111111011111111

"0111111011111111

"0111111011111111

"0111111011111111

"0111111011111111

"0111111011111101

"0111111011111110

"0111111000000000

"0111110011111111

"0111101011111111

"0111011011111111

"0110111011111111

"0101111011111111

"0011111011111111

"0111111011111111");

signal addr:integer range 0 to 16:=0;

signal q:std_logic_vector(3 downto 0);

signal temp:std_logic_vector(15 downto 0);

begin

p0:process(clka)

begin

    if rising_edge(clka) then

        q<=q+'1';

    end if;

end process p0;

p3:process(clk)

begin

    if rising_edge(clk) then

        if (addr=16) then

            addr<=0;

        else

            addr<=addr+1;

        end if;

    end if;

end process p3;

p5:process(addr)

begin

    if(q(3)='1') then

        data<=romc(addr);

    else

        data<=romd(addr);

    end if;

end process p5;

temp<="0111111111111111" when addr=0 else

    "1011111111111111" when addr=1 else

    "1101111111111111" when addr=2 else

    "1110111111111111" when addr=3 else

    "1111011111111111" when addr=4 else

    "1111101111111111" when addr=5 else

    "1111110111111111" when addr=6 else

    "1111111011111111" when addr=7 else

    "1111111101111111" when addr=8 else

    "1111111110111111" when addr=9 else

    "1111111111011111" when addr=10 else

    "1111111111101111" when addr=11 else

    "1111111111110111" when addr=12 else

    "1111111111111011" when addr=13 else

    "1111111111111101" when addr=14 else

    "1111111111111110" when addr=15 else

    "1111111111111111";

choice<=temp;    

end arth;

实验五 电子时钟实验(TIME)

一、实验目的:

1,了解用VHDL编写时钟显示程序;

2,熟悉计数器的设计方法;

二、实验原理

(1)硬件电路设计

由段驱动电路74LS240和位驱动电路7407组成,共阴数码管的A、B、C、D、E、F、G、DP分别与74LS240的八位输出连接,共阴端分别与7407的输出端连接,并连至L1-L6的插孔上。

(2)电子数字钟设计指南

采用硬件描述语言设计一个能够显示小时、分钟和秒的电子数字钟。

利用实验板上的标准时钟电路提供的8HZ脉冲信号,经过计数分频器8分频后得到1HZ的时钟信号作为秒计数器的时钟信号。设计用于显示秒和分钟的60进制计数器模块,和显示小时的24进制计数器模块。

(3)设计提高

修改程序,自己设计一个具有小时和分钟调整功能的电子数字钟。

注:由实验板上资源,这些实例与实际情况还有一定的差距。在设计具体的产品和应用项目时,应根据具体的情况,采用更加巧妙的设计思想和灵活的方法,满足不同的技术要求和实现不同的逻辑功能。

三、实验连线

20—>8HZ;

63—>1KHZ;

Z1—>JX1;

L1~L6—>76~81;(L1~L6为Scan Display区数码管公共端)

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
CLKIN20DATA(1)

OUT4
CLK1IN63DATA(0)

OUT3
DATA(7)

OUT10CHOICE(0)

OUT76
DATA(6)

OUT9CHOICE(1)

OUT77
DATA(5)

OUT8CHOICE(2)

OUT78
DATA(4)

OUT7CHOICE(3)

OUT79
DATA(3)

OUT6CHOICE(4)

OUT80
DATA(2)

OUT5CHOICE(5)

OUT81
五、实验说明

DATA(0)--DATA(7):数据输出;

CHOICE(0)--CHOICE(7):位选择线;

六、程序清单(见文件:Lattice1032/time/time.vhd)

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

entity time is

port(clk,clk1:in std_logic;

    data:out std_logic_vector(7 downto 0);

    choice:out std_logic_vector(5 downto 0));

end;

architecture arch of time is

signal carry,clr,m0,m1,m2,m3,m4:std_logic;

signal couta:std_logic_vector(2 downto 0);

signal cout0:std_logic_vector(3 downto 0);

signal cout1:std_logic_vector(3 downto 0);

signal cout2:std_logic_vector(3 downto 0);

signal cout3:std_logic_vector(3 downto 0);

signal cout4:std_logic_vector(3 downto 0);

signal cout5:std_logic_vector(3 downto 0);

SIGNAL count : STD_LOGIC_VECTOR(2 downto 0);

SIGNAL temp : STD_LOGIC_VECTOR(3 downto 0);

SIGNAL datain     : STD_LOGIC_VECTOR(7 downto 0);

SIGNAL choicein:std_logic_vector(5 downto 0);

begin

p1:process(clk)                      --CLK为8HZ?

begin

    if(rising_edge(clk)) then

couta<=couta+'1';

    end if;

end process p1;

p2:process(clk)

begin

    if(rising_edge(clk)) then       --对CLK8分频后得到1HZ的标准时钟信号

        if(couta="111") then

            carry<='1';

        else

            carry<='0';

        end if;

    end if;

end process p2;

p3:process(carry,clr)

begin

    if(clr='1') then                   --cout0为秒计数器(60进制计数器)低位

cout0<="0000";m0<='0';

    elsif( rising_edge (carry)) then

        if(cout0="1001") then

        cout0<="0000";m0<='0';

        else

        cout0<=cout0+'1';m0<='1';

        end if;

    end if;

end process p3;

p4:process(clr,m0)

begin

    if(clr='1') then                   --cout1为秒计数器高位

cout1<="0000";m1<='0';

    elsif( falling_edge (m0)) then

        if(cout1="0101") then

        cout1<="0000";m1<='0';

        else

        cout1<=cout1+'1';m1<='1';

        end if;

    end if;

end process p4;

p5:process(clr,m1)

begin

    if(clr='1') then                --cout2为分计数器(60进制计数器)低位

cout2<="0000";m2<='0';

    elsif(falling_edge (m1)) then

        if(cout2="1001") then

        cout2<="0000";m2<='0';

        else

        cout2<=cout2+'1';m2<='1';

        end if;

    end if;

end process p5;

p6:process(clr,m2)

begin

    if(clr='1') then               --cout3为分计数器高位

cout3<="0000";m3<='0';

    elsif( falling_edge (m2)) then

        if(cout3="0101") then

        cout3<="0000";m3<='0';

        else

        cout3<=cout3+'1';m3<='1';

        end if;

    end if;

end process p6;

p7:process(clr,m3)

begin

    if(clr='1') then               --cout4为时计数器(24进制计数器)低位

cout4<="0000";m4<='0';

    elsif( falling_edge (m3)) then

        if(cout4="1001" ) then

        cout4<="0000";m4<='0';

        else

        cout4<=cout4+'1';m4<='1';

        end if;

    end if;

end process p7;

p8:process(clr,m4)

begin

    if(clr='1') then              --cout5为时计数器高位

        cout5<="0000";

    elsif( falling_edge (m4)) then

        if(cout5="0010" and cout4="0011") then

        cout5<="0000";

        else

        cout5<=cout5+'1';

        end if;

    end if;

end process p8;

p9:process(carry)

begin

    if(falling_edge(carry)) then

        if(cout5>"0010" or cout4>"1001" or cout3>"0101" or cout2>"1001" or cout1>"0101" or cout0>"1001") then

        clr<='1';

        elsif(cout4="0011" and cout5>="0010" and cout3="0101" and cout2="1001" and cout1="0101" and cout0="1001") then

        clr<='1';

        else

        clr<='0';

        end if;

    end if;

end process p9;

clk1_label:

PROCESS (clk1)

BEGIN

IF  rising_edge(clk1) THEN

if(count<"101") then

        count<=count+1;

    else

count<="000";

    end if;

END IF;

END PROCESS clk1_label;

clk2_label:

PROCESS (clk1)

BEGIN

if falling_edge(clk1) then

choice<=choicein;

data<=datain;

END IF;

END PROCESS clk2_label;

choicein<="111110" when count="000" else

        "111101" when count="001" else

        "111011" when count="010" else

        "110111" when count="011" else

        "101111" when count="100" else

        "011111" when count="101" ;

temp<=    cout0(3 downto 0) when count="000" else

        cout1(3 downto 0) when count="001" else

        cout2(3 downto 0) when count="010" else

        cout3(3 downto 0) when count="011" else

        cout4(3 downto 0) when count="100" else

        cout5(3 downto 0) when count="101" ; 

        

WITH temp select

datain <= "00000011" WHEN "0000

               "10011111" WHEN "0001

               "00100101" WHEN "0010

               "00001101" WHEN "0011

               "10011001" WHEN "0100

               "01001001" WHEN "0101

               "01000001" WHEN "0110

               "00011111" WHEN "0111

               "00000001" WHEN "1000

               "00001001" WHEN "1001

               "00010001" WHEN "1010

               "11000001" WHEN "1011

               "01100011" WHEN "1100

               "10000101" WHEN "1101

               "01100001" WHEN "1110

               "01110001" WHEN OTHERS;

end arch;

实验六 数码管静态显示实验

一、实验目的

1,了解用VHDL编写静态数码管数字循环显示程序;

2,熟悉数码管的工作原理和锁存/7段译码/驱动器芯片CD4511的功能;

二、实验原理

(1)硬件电路设计

(2)程序设计要求

     A.6位数码管静态显示0~9循环,每秒钟转换一次。(程序中可用一个十进制计数器来实现)。

     B.设置一个开关,控制蜂鸣器的启停,数码管数字每转换一次蜂鸣器叫一声,频率为1HZ。

三、实验连线

20—>1HZ;

10—>1HZ;

63—>4KHZ;

33—>K1;(蜂鸣器启/停开关)

SP—>32;

JX3—>Z6;

JX4—>Z5;

JX5—>Z4;

程序显示0~9的数字循环!

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
CPIN20D3OUT48
CP1IN63A4OUT49
H1IN10B4OUT50
K1IN33C4OUT51
A1OUT34D4OUT52
B1OUT35A5OUT53
C1OUT36B5OUT54
D1OUT37C5OUT55
A2OUT38D5OUT56
B2OUT39A6OUT57
C2OUT40B6OUT58
D2OUT41C6OUT59
A3OUT45D6OUT60
B3OUT46SPOUT32
C3OUT47
五、实验说明

K1:蜂鸣器启停开关;

A1,B1,C1,D1:为CD4511对应A,B,C,D端的BCD码,驱动第一只数码管。

能下相同,驱动另外的5只数码管。

六、程序清单(见文件夹Lattice1032/test/test.vhd)

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

ENTITY test is

    PORT(cp,cp1,h1:in std_logic;

        k1:in std_logic;

        a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3,a4,b4,c4,d4,a5,b5,c5,d5,a6,b6,c6,d6:out std_logic;

         sp:out std_logic);

END;

ARCHITECTURE ARTH OF test IS

signal count0:std_logic_vector(3 downto 0);

signal count1:std_logic_vector(2 downto 0);

signal carry1,temp:std_logic;

begin

p0:process(cp)

begin

    if(rising_edge(cp))then

temp<=not temp;

        if(count0="1001")then

            count0<="0000";

        else    

            count0<=count0+'1';

        end if;

    end if;

end process p0;

p1:process(cp1)

begin

    if(rising_edge(cp1))then

        count1<=count1+'1';

    end if;

end process p1;

p10:process(cp1)

begin

    if(rising_edge(cp1))then

        if(count1="111")then

            carry1<='1';

        else

            carry1<='0';

        end if;

    end if;

end process p10;

p2:process(cp1)

begin

    if(falling_edge(cp1))then

        if(k1='1' and h1='1')then

            sp<=carry1;

        else

            sp<='0';

        end if;

    end if;

end process p2;

a1<=count0(0);a2<=count0(0);a3<=count0(0);a4<=count0(0);a5<=count0(0);a6<=count0(0);

b1<=count0(1);b2<=count0(1);b3<=count0(1);b4<=count0(1);b5<=count0(1);b6<=count0(1);

c1<=count0(2);c2<=count0(2);c3<=count0(2);c4<=count0(2);c5<=count0(2);c6<=count0(2);

d1<=count0(3);d2<=count0(3);d3<=count0(3);d4<=count0(3);d5<=count0(3);d6<=count0(3);

end arth;

实验七 VGA接口彩条信号实验

一、实验目的

1,了解VGA接口的工作原理以及它在工业领域中有哪些应用。

2,了解彩色显示器的工作原理。

3,利用VHDL语言编制一个彩条信号发生器。

二、实验原理

    VGA彩色显示器在显示过程中所必需的信号,除R、G、B三种基色信号外,行同步HS和场同步VS也是非常重要的两个信号。显示过程中HS和VS的极性可正可负,显示器内可自动转换为正极性逻辑。

    现以正极性为例说明CRT的工作过程。R、G、B为正极性信号,即高电平有效。当VS=0、HS=0时,CRT显示的内容为亮的过程,即正向扫描过程约26us。当一行扫描完毕,行同步HS=1,约需6us,其间,CRT扫描产生消隐,电子束回到CRT左边下一行的起始位置(X=0,Y=1);当扫描完480行后,CRT的场同步VS=1,产生场同步使扫描线回到CRT的第一行第一列(X=0、Y=0)处(约两个周期)。

    本设计的彩条信号发生器可通过外部控制产生三种显示模式,共六利显示变化(见表一),其中的颜色编码如表二所示。

    彩条信号发生器外部接口如图一所示

            

图一:彩条信号发生器外部接口

三、实验连线

z8—>位于RS232芯片下方的8芯单排插座(JX12)。VGA旁的插座;

27—>K1;

3—>4MHZ;

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
CLKIN3ROUT14
MDIN27GOUT15
VSOUT12BOUT16
HSOUT13
五、实验说明

MD:模式选择信号;

R、G、B、HS、VS:分别为红、绿、蓝、行同步、场同步信号;

六、程序清单(见文件夹Lattice1032/vga/vga.vhd)

实验八 4*4键盘扩展实验

一、实验目的:

(1)熟悉并掌握矩阵键盘的工作原理。

(2)熟悉利用VHDL编程,定义各键功能。

二、实验原理

矩阵式键盘是一种常见的输入装置,在日常生活中,矩阵式键盘在计算机、电话、手机、微波沪等各式电子产品上已经被广泛应用。

键盘上的每一个按键其实是一个开关电路,当某键被按下时,该按键的接点会呈现逻辑0的状态,反之,未被按下时则呈现逻辑1的状态。

行扫描信号由CPLD产生,以固定的频率进行扫描,变化的顺序依次为:11101101101101111110。每次扫描一行,周而复始。

表一   按键位置与数码关系:

行扫描R4~R1

列L4~L1

对应的按键
111011100
11011
10112
01113
110111104
11015
10116
01117
101111108
11019
1011A
0111B
01111110C
1101D
1011E
0111F

                      图一   4*4矩阵键盘的面板配置

电路提供了四位行线(R1-R4)与四位列线(L1-L4),可以通过编程对键进行定义为数字键或功能键。

三、实验连线

Z1—>JX1;

20—>1KHZ;

R1~R4—>83~80;  键盘区行扫描线

L1~L4—>34~37;  键盘区列扫描线

L1—>GND;   (此处L1为Scan Display区数码管公共端)

四、引脚锁定

信号名信号模式管脚号信号名信号模式管脚号
CLKIN20DATAOUT(0)

OUT3
L(0)

IN34DATAOUT(1)

OUT4
L(1)

IN35DATAOUT(2)

OUT5
L(2)

IN36DATAOUT(3)

OUT6
L(3)

IN37DATAOUT(4)

OUT7
CHOICE(0)

OUT83DATAOUT(5)

OUT8
CHOICE(1)

OUT82DATAOUT(6)

OUT9
CHOICE(2)

OUT81DATAOUT(7)

OUT10
CHOICE(3)

OUT80
五、实验说明

L(0)--L(3):列扫描线;

CHOICE(0)--CHOICE(3):行扫描线;

DATAOUT(0)--DATAOUT(7):数码管数据输出端;

六、程序清单(见文件夹Lattice1032/key/key.vhd)

附录一 部分在系统可编程集成电路的引脚分配图

1.DIP封装形式的在系统模拟可编程集成电路ispPAC10.

2.PLCC封装形式的在系统模拟可编程集成电路ispPAC20.

3.DIP封装形式的在系统模拟可编程集成电路ispPAC80.

4.PLCC封装形式的在系统可编程集成电路ispLSI1016E.

5.PLCC封装形式的在系统可编程集成电路ispLSI1032E.

附录二 ispLEVER软件中文件名后缀及其含义

SYN源 文 件

设 计 项 目 管 理 文 件

ABL源 文 件

ABEL 硬 件 描 述 语 言 源 文 件

ABV源 文 件

测 试 向 量 描 述 文 件

SCH源 文 件

电 路 原 理 图 文 件

VHD源 文 件

VHDL 硬 件 描 述 语 言 源 文 件

V源 文 件

Verilog 硬 件 描 述 语 言 源 文 件

PPN源 文 件

引 脚 锁 定 描 述 文 件 ( 用 电 路 图 锁 定 引 脚 时 为 中 间 文 件)

PAR源 文 件

适 配 器 控 制 参 数 文 件

SYM中 间 文 件

电 路 符 合 文 件

EQ0中 间 文 件

逻 辑 描 述 文 件 ( 由 ABL 编 译 所 得)

EQ1中 间 文 件

简 化 逻 辑 文 件 ( 由 EQ0 化 简 所 得)

EQ2中 间 文 件

带 层 次 连 接 关 系 的 逻 辑 描 述 文 件

EQ3中 间 文 件

经 优 化 的 逻 辑 描 述 文 件

EQ4中 间 文 件

经 反 复 优 化 的 逻 辑 描 述 文 件

TMV中 间 文 件

经 编 译 的 测 试 向 量 文 件

TT2中 间 文 件

逻 辑 网 表 输 出 文 件, 适 配 器 输 入 文 件

FXP中 间 文 件

逻 辑 布 局 结 果 文 件

LST中 间 文 件

ABEL 源 文 件 的 列 表 文 件

LOG中 间 文 件

运 行 流 程 记 录 文 件

SIM中 间 文 件

仿 真 用 网 表 文 件

JHD中 间 文 件

层 次 化 关 系 连 接 表 文 件

JED结 果 文 件

熔 丝 图 文 件 ( JEDEC 文 件)

REP结 果 文 件

GAL 器 件 设 计 编 译 报 告 文 件

RPT结 果 文 件

IspLSI 器 件 设 计 编 译 报 告 文 件

XRF结 果 文 件

信 号 和 节 点 简 缩 名 称 文 件

ERR结 果 文 件

错 误 报 告 文 件

MFR结 果 文 件

频 率 分 析 报 告 文 件

TSU结 果 文 件

寄 存 器 建 立 和 保 持 时 间 报 告 文 件

TPD结 果 文 件

TPD 路 径 延 时 时 间 报 告 文 件

TCO结 果 文 件

TCO 路 径 延 时 时 间 报 告 文 件

附录三 习题

1、简述EDA、PLD、CPLD、FPGA、VHDL的中、英文意义。

2、 EP1K30TC144-3属于何种PLD类型。

3、写出Block Diagram/Schematic File, Vector Waveform File,vhdl file的扩展名。

4、简述项目设计的步骤。

5、建立图形输入文件,应在               菜单下选择            对话框中的                 选项。

6、下图为模12的计数器请指出图中的5处错误并改正。

7、下图为模60的计数器请指出图中的10处错误并改正。

8、建立VHDL文本输入文件,应在                       菜单下选择              对话框中的                 选项。

9、建立波形输入模拟文件,应在               菜单下选择              对话框中的                 选项。

10、调入元件,可在图形编辑区双击左键打开          对话框。

11、在菜单                   中选择               即可打开编译器,选择           就可开始编译。

12、在菜单                    中选择               即可打开模拟器,选择           就可开始模拟。

13、写出实体说明的书写格式

14、写出模式的种类

15、写出常用数据类型,完成下表。

16、写出结构体的一般书写格式

17、写出库调用的语法形式

18、写出D触发器的VHDL程序

19、写出信号、变量、常量的说明格式。

20、用IF语句写出3-8线译码器的VHDL程序。

21、用选择信号赋值语句写出全加器的VHDL程序。

22、在LED实验中,如果clka的频率为16Hz,则交替显示电和子的时间分别为多少秒?process p5使用的是什么语句?when addr=“00000” 时点亮的是第几列数码管?

23、在时钟实验中,进程P3提供秒低位计数器cout0,计carry1的上升沿数,如果 clk的频率为16Hz ,则显示1秒的真实时间为多少?如果想让时钟做为一个真正的时钟,则clk的频率应为多少? 

24、四位并行乘法器VHDL填空

sg<=('0'&sf(3 downto 1));

u0:and4a port map(a=>op2,en=>op1(1),r=>se);

U1:and4a port map(a=>op2,en=>op1(3),r=>sa);

U2:ls283 port map(o1=>sb(4 downto 1),o2=>sa,res=>result(7 downto 3));

U3:and4a port map(a=>op2,en=>op1(2),r=>sc);

U4:ls283 port map(o1=>sc,o2=>sd(4 downto 1),res=>sb);

u5:ls283 port map(o1=>sg,o2=>se,res=>sd);

u6:and4a port map(a=>op2,en=>op1(0),r=>sf);

result(0)<=sf(0);

result(1)<=sd(0);

result(2)<=sb(0);

25、把下列进程用条件信号赋值语句代替。

process(d0,d1,d2,d3,sel)is

    begin

if sel="00" then z<=d0;

elsif sel="01" then z<=d1;

              elsif   sel="10" then z<=d2;

elsif sel="11" then z<=d3;

         end if;

     end process; 

文档

2012EDA实验指导书

目录第一章DICE-EH2000实验系统简介11.1产品特点11.2实验系统的硬件配置11.3实验系统硬件介绍21.4主要实验课题71.5实验系统PLD下载板介绍7第二章QuartusII简介92.1QuartusII简介92.2QuartusII数字系统开发流程102.3QuartusII工作环境介绍112.4QuartusII设计入门162.5图形的层次化设计29第三章ispLEVER软件使用简明教程313.1ispLEVER简介313.2ispLEVER开发工具的原理图输入323.3设计
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top