第一篇:电子科技大学逆向工程实验报告作业
电子科技大学
学生姓名:马侬学
号:
指导教师:何兴高
日
期:实 验 报 告
20152*03**0*
2016.7.15
一. 题目名称:简易记事本软件逆向分析 二. 题目内容
由于记事本功能简单,稍有经验的程序员都可以开发出与记事本功能近似的小软件,所以在一些编程语言工具书上也会出现仿照记事本功能作为参考的示例。为了便于分析因此选取了一个简易的记事本,因此本实验将着重研究从源程序到机器码的详细过程而不注重程序本身的功能。另一方面简易源程序代码约130多行。本实验目的是了解源程序是怎么一步步变成机器码的又是怎么在计算机上运行起来的。
三. 知识点及介绍
利用逆向工程技术,从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。随着用户需求的复杂度越来越高软件开发的难度也在不断地上升快速高效的软件开发已成为项目成败的关键之一。为了提高程序员的产品率开发工具的选择尤为重要因为开发工具的自动化程度可以大大减少程序员繁琐重复的工作使其集中关注他所面临的特定领域的问题。为此当前的IDE不可避地要向用户隐藏着大量的操作细节而这些细节包含了大量的有价值的技术。
四. 工具及介绍:
在对软件进行逆向工程时,不可避免地需要用到多种工具,工具的合理使用,可以加快调试速度,提高逆向工程的效率。对于逆向工程的调试环节来说,没有动态调试器将使用的调试工作很难进行。可以看出,各种有效的工具在逆向工程中占据着相当重要的地位,有必要对它们的用法做一探讨。
PE Explorer简介:PE Explorer是功能超强的可视化Delphi、C++、VB程序解析器,能快速对32位可执行程序进行反编译,并修改其中资源。
功能极为强大的可视化汉化集成工具,可直接浏览、修改软件资源,包括菜单、对话框、字符串表等; 另外,还具备有 W32DASM 软件的反编译能力和PEditor 软件的 PE 文件头编辑功能,可以更容易的分析源代码,修复损坏了的资源,可以处理 PE 格式的文件如:EXE、DLL、DRV、BPL、DPL、SYS、CPL、OCX、SCR 等 32 位可执行程序。该软件支持插件,你可以通过增加插件加强该软件的功能,原公司在该工具中捆绑了 UPX 的脱壳插件、扫描器和反汇编器.,出口,进口和延迟导入表的功能,使您可以查看所有的可执行文件使用的外部功能,和其中包含的DLL或库的基础上进行分类的结果。这里一个非常有用的功能是语法的Viewer,它显示功能的调用语法,它知道和可以让你扩大自己的定义的语法数据库。非常好用。
Dumpbin是VC自带的二进制转储工具可以将PE/COFF文件以文字可读的方式显示出来。Microsoft COFF 二进制文件转储器(DUMPBIN.EXE)显示有关通用对象文件格式(COFF)二进制文件的信息。可以使用 DUMPBIN 检查 COFF 对象文件、标准 COFF 对象库、可执行文件和动态链接库(DLL)。具有提供此DLL中所输出的符号的清单的功能。
LINK.exe 将通用对象文件格式(COFF)对象文件和库链接起来,以创建可执行(.exe)文件或动态链接库(DLL)。
五. 源程序
notepad.cpp:
notepad::notepad(QWidget *parent): QMainWindow(parent), ui(new Ui::notepad){ ui->setupUi(this);this->setWindowTitle(“new file”);QObject::connect(ui->NewFileaction, SIGNAL(triggered()), this, SLOT(NewFile()));QObject::connect(ui->OpenFileaction, SIGNAL(triggered()), this, SLOT(OpenFile()));QObject::connect(ui->SaveFileaction, SIGNAL(triggered()), this, SLOT(SaveFile()));QObject::connect(ui->SaveAsFileaction, SIGNAL(triggered()), this, SLOT(SaveAsFile()));QObject::connect(ui->Coloraction, SIGNAL(triggered()), this, SLOT(SetColor()));QObject::connect(ui->Fontaction, SIGNAL(triggered()),this, SLOT(SetFont()));QObject::connect(ui->Aboutaction, SIGNAL(triggered()), this, SLOT(About()));QObject::connect(ui->Helpaction, SIGNAL(triggered()), this, SLOT(Help()));} notepad::~notepad(){ delete ui;} void notepad::changeEvent(QEvent *e){ QMainWindow::changeEvent(e);switch(e->type()){ case QEvent::LanguageChange: ui->retranslateUi(this);break;default: break;} } void notepad::NewFile(){ this->setWindowTitle(“new file”);ui->Text->clear();} void notepad::OpenFile(){ QString filename = QFileDialog::getOpenFileName(this, “get file”,QDir::currentPath(), “(*.*)”);if(!filename.isEmpty()){ QFile *file = new QFile;file->setFileName(filename);if(file->open(QIODevice::ReadOnly)== true){ QTextStream in(file);ui->Text->setText(in.readAll());this->setWindowTitle(filename);} else { QMessageBox::information(this, “ERROR Occurs”, “file not exist”);} file->close();delete file;} } void notepad::SaveFile(){ QString filename = this->windowTitle();// if(filename.compare(“new file”)!= 0)// { QFile *file = new QFile;file->setFileName(filename);if(file->open(QIODevice::WriteOnly)== true){ QTextStream out(file);out
由PE格式的布局图。PE文件使用的是一个平面地址空间,所有代码和数据都合并在一起,组成一个很大的结构。主要有:.text是在编译或汇编结束时产生的一种块,它的内容全是指令代码;.rdata是运行期只读数据;.data是初始化的数据块;.bss是未初始化的数据节;.idata包含其它外来DLL的函数及数据信息,即输入表;.rsrc 包含模块的全部资源:如图标、菜单、位图等。
现在使用PEExplorer对编译的notepad.exe程序进行逆向。如图5所示。由图可以知道程序入口点是0x000028DFh。当程序被加载到内存执行时,第一条指令将从这里取得。注意,这个地址是相对虚拟地址(RVM),程序的入口点地址还要道基地址才能得出。
PEExplorer逆向notepad.exe和数据目录
节区头数据,分别是读到了数据目录和区段头信息。
4)调用协定
调用协定规定了函数调用的参数传递方式及返回值的传递方式。它是应用程序二进制兼容的必要面规范。常见的调用协定有如下方式:1__stdcall 用于调用Win32API函数。采用__stdcall约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条retn指令直接清理传递参数的堆栈。2_cdecl: 是C调用约定,按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。fastcall 快速调用方式。它的主要特点就是快,因为它是通过寄存器来传送参数的。实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈。4参数传递分析在目标程序中有这样一个函数声明如下:
BOOLShowFileInfo(HWNDhwnd,HDChDC,HDROPhDropInfo)发生调用地方为:
ShowFileInfo(hwnd,hDC,hDropInfo);可以看到最后一条指令是堆栈平衡用的,传递了三个参数,每个参数的大小都为4个字节,所以大小刚好是0x0Ch。还可以看到第一个压栈的参数是hDropInfo,另外两参数都是用ebp来做基址寻址取到的,说明前两个参数不是局部变量。参数传递方向从右到左依次压栈。
5)堆栈平衡
参数传递后由调用者或被调用者负责平衡堆栈,但函数使用了局部变量,那堆栈又是如何保持平衡的呢?这里引入了一个叫栈帧(StackFrame)的概念。栈帧实质就一个函数栈所用的堆栈空间。每个函数都平衡了,那么整个程序栈也就平衡了。如图8所示,函数体的第一条指令就是保存ebp寄存器,它存的就是上一个函数的栈帧边界。第二条指令就是制定当前函数的栈帧的起始位置。第三条
指令就是为函数分配局部变量的堆栈空间了。函数栈的平衡
根椐VC/C++的调用协定,寄存器EAX、ECX、EDX是易变寄存器,也就是说调用函数不能假定被调用函数不改变它们的值。因此,调用函数想保留它们的值,在调用一个函数之前应自已先把它们保存起来了。另外的5个通用寄存器(EBX、ESP、EBP、ESI、EDI),则是非易变的。被调用函数在使用它们之前必须先保存。
所以上图的汇编指令就不难理解了。函数执行完毕后,只需把先前保存在栈中的EBP弹到ESP就保持了栈的平衡了。情况确实如此。如图9所示,最后一条指令是popebp,然后返回。根据返回指令,还可行知此函数使用的是cdecl调用协定。因为它没有参数的堆栈平衡。函数返回平衡堆栈 七. 心得体会
逆向工程是一个实践性很强的课程,通过上机实验使我在本次课程的学习中收获很多,通过对程序的逆向分析,本人对计算机技术有了更深的认识。感谢何兴高老师的谆谆教诲和精彩地讲课,何老师为人随和热情,治学严谨细心。同时希望能进一步学习更多和逆向工程相关的知识。
第二篇:现代电子实验报告 电子科技大学
基于FPGA的现代电子实验设计报告
——数字式秒表设计(VHDL)
学院:物理电子学院
专业:
学号:
学生姓名:
指导教师:
实验地点:
实验时间:
刘曦 科研楼303
摘要:
通过使用VHDL语言开发FPGA的一般流程,重点介绍了秒表的基本原理和相应的设计方案,最终采用了一种基于 FPGA 的数字频率的实现方法。该设计采用硬件描述语言VHDL,在软件开发平台ISE上完成。该设计的秒表能准确地完成启动,停止,分段,复位功能。使用 ModelSim 仿真软件对VHDL 程序做了仿真,并完成了综合布局布线,最终下载到EEC-FPGA实验板上取得良好测试效果。
关键词:FPGA,VHDL,ISE,ModelSim
目录
绪论.........................................................4
第一章实验任务…………………………………..5
第二章系统需求和解决方案计划………..5
第三章设计思路…………………………………..6
第四章系统组成和解决方案………………..6
第五章各分模块原理……………………………8
第六章仿真结果与分析………………………..11
第七章分配引脚和下载实现…………………13
第八章实验结论…………………...………………14 绪论:
1.1 课程介绍:
《现代电子技术综合实验》课程通过引入模拟电子技术和数字逻辑设计的综合应用、基于MCU/FPGA/EDA技术的系统设计等综合型设计型实验,对学生进行电子系统综合设计与实践能力的训练与培养。
通过《现代电子技术综合实验》课程的学习,使学生对系统设计原理、主要性能参数的选择原则、单元电路和系统电路设计方法及仿真技术、测试方案拟定及调测技术有所了解;使学生初步掌握电子技术中应用开发的一般流程,初步建立起有关系统设计的基本概念,掌握其基本设计方法,为将来从事电子技术应用和研究工作打下基础。
本文介绍了基于FPGA的数字式秒表的设计方法,设计采用硬件描述语言VHDL,在软件开发平台ISE上完成,可以在较高速时钟频率(48MHz)下正常工作。该数字频率计采用测频的方法,能准确的测量频率在10Hz到100MHz之间的信号。使用ModelSim仿真软件对VHDL程序做了仿真,并完成了综合布局布线,最终下载到芯片Spartan3A上取得良好测试效果。1.2VHDL语言简介: VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,诞生于 1982 年。1987 年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
VHDL语言的特点: VHDL 语言能够成为标准化的硬件描述语言并获得广泛应用,它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来,VHDL 语言主要具有以下优点:(1)VHDL 语言功能强大,设计方式多样(2)VHDL 语言具有强大的硬件描述能力(3)VHDL 语言具有很强的移植能力(4)VHDL 语言的设计描述与器件无关(5)VHDL 语言程序易于共享和复用 由于 VHDL 语言是一种描述、模拟、综合、优化和布线的标准硬件描述语言,因此它可以使设计成果在设计人员之间方便地进行交流和共享,从而减小硬件电路设计的工作量,缩短开发周期。1.3FPGA简介
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。
FPGA一般来说比ASIC(专用集成电路)的速度要慢,实现同样的功能比ASIC电路面积要大。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD(Complex Programmable Logic Device,复杂可编程逻辑器件)。
FPGA设计流程:
对于目标文件为FPGA的HDL设计,其一般流程如下:
1、文本编辑
用任何文本编辑器都可以进行,通常 VHDL文件保存为vhd文件,Verilog 文件保存为 v文件。
2、使用编译工具编译源文件
HDL 的编译器有很多,ACTIVE 公司,MODELSIM 公司,SYNPLICITY 公司,SYNOPSYS 公司,VERIBEST公司等都有自己的编译器。
3、逻辑综合
将源文件调入逻辑综合软件进行综合。综合的目的是在于将设计的源文件由语言转换为实际的电路。但是此时还没有在芯片中形成真正的电路。这一步的最终目的是生成门电路级的网表(Netlist)。
4、布局、布线
将第 3 步生成的网表文件调入 PLD 厂家提供的软件中进行布线,即把设计好的逻辑安放到 CPLD/FPGA 内。这一步的目的是生成用于下载(编程 Programming)的编程文件。在这一步,将用到第 3 步生成的网表,并根据 CPLD /FPGA 厂商的器件容量,结构等进行布局、布线。这就好像在设计 PCB 时的布局布线一样。先将各个设计中的门根据网表的内容和器件的结构放在器件的特定部位。然后,在根据网表中提供的各门的连接,把各个门的输入输出连接起来。最后,生成一个供编程的文件。这一步同时还会加一些时序信息(Timing)到你的设计项目中去,以便于你做后仿真。
5、后仿真
利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。(也叫布局布线仿真或时序仿真)。这一步主要是为了确定你的设计在经过布局布线之后,是不是还满足你的设计要求。
6、编程,下载
如果前几步都没有发生错误,并且符合设计要求,这一步就可以将由适配器等产生的配置或下载文件通过编程器或下载电缆下载到目标芯片中。
7、硬件测试
硬件测试的目的是为了在更真实的环境中检验 HDL设计的运行情况,特别是对于 HDL 程序设计上不是十分规范,语义上含有一定歧义的程序。
一、实验任务——设计一个秒表:
秒表的计时范围为00’00”00 ~ 59’59”99。有两个按钮开关Start/Stop和Split/Reset,控制秒表的启动、停止、分段和复位:
1,在秒表已经被复位的情况下,按下“Start/Stop”键,秒表开始计时。
2,在秒表正常运行的情况下,如果按下“Start/Stop”键,则秒表暂停计时。3,再次按下该键,秒表继续计时。
4,在秒表正常运行的情况下,如果按下“Split/Reset”键,显示停止在按键时的时间,但秒表仍然在计时; 5,再次按下该键,秒表恢复正常显示。
6,在秒表暂停计时的情况下,按下“Split/Reset”键,秒表复位归零。
二、系统需求和解决方案计划:
在项目开始设计时,首先要确定系统的需求并发展出一个针对这些需求的计划。
按照秒表的设计要求,整个电路需要下面这些组成部分: 2.1 分频器:
对晶体振荡器产生的时钟信号进行分频,产生时间基准信号。2.2 计数器:
对时间基准脉冲进行计数,完成计时功能。2.3 数据锁存器:
锁存数据使显示保持暂停。2.4 控制器:
控制计数器的运行、停止以及复位产生锁存器的使能信号。2.5 扫描显示的控制电路:
包括扫描计数器、数据选择器和7段译码器,控制8个数码管以扫描方式显示计时结果。2.6 按键消抖电路:
消除按键输入信号抖动的影响,输出单脉冲。
三、设计思路:
从FPGA开发板的电路可以看出,其不具备对按键输入的消抖功能,故须编写消抖功能的模块代码。消除按键抖动的影响;每按一次键,只输出一个脉冲,其宽度为一个时钟周期。由开发板电路结构可以看出,其为共阳结构,故在其运行为低有效。
8个数码显示管共用一个段位,故为了将时钟显示在8个数码管上,需要一定频率(本秒表为1KHz)的信号进行扫描,使得我们肉眼看上去是8个数码管同时显示的。为了实现秒表暂停和复位的功能,需要锁存器模块将时钟数据锁存起来,并且结合控制电路满足秒表的功能。
FPGA开发板的晶振频率为48MHz,而实际电路需要的频率为1KHz,故须建立分频模块,将48MHz的晶振频率分频成1KHz。在构建计数范围从00’00”00-59’59”99的秒表时,从数码管显示的角度可知,需要建立模六和模十两种计数模块进行组合形成。设计图如下:
四、系统组成和解决方案:
在项目开始设计时,首先要确定系统的需求并发展出一个针对这些需求的计划。按照数字式秒表工作原理的描述,需要下面这些主要的子系统: 1,控制电路;
2,由石英振荡器和数字分频器构成的时基信号发生器; 3,按键开关(按键消抖); 4,计数器; 5,数据锁存器; 6,扫描显示的控制子系统(包括显示译码和扫描控制); 7,六个数码管(LED显示电路)。
设计框图如下:
五、各分模块原理:
5.1、48M-1K分频器
对晶振振荡器产生的时钟信号进行分频,产生时间基准信号。由于FPGA开发板的晶振频率为48MHz,故在设计分频器模块时,为了将频率分频成1KHz,即将输入的信号源每48000个周期转换成输出的一个周期。因此利用上升沿计数手段,将0-47999用16位二进制数表示,而在从0-47999的计数过程中,该二进制数的最高位只有一次状态变化,故可取对应二进制数的最高位来输出达到分频到1KHz的目的。如下代码为将晶振振荡器48MHz频率分频成1KHz信号:
5.2、计数器
对时间基准脉冲进行计数,完成计时功能。实现数字秒表的设计需要模6和模10计数器进行组合。考虑到秒表的暂停和清零等功能,在设计计数器模块时,必须有时钟输入端、使能以及清零端。在有时钟信号输入的情况下,当使能端无效时,计数器不能进行计数;当清零端有效时,计数重新归为0值。而为了实现计数的目的,故必须将各个计数器级联来实现从00’00”00-59’59”99的计数,使得级联的各技术模块有共同的清零端与使能端,因此该单个模块需要有输出进位以及该时刻的计数值并且前一级的进位端连在下一级的使能端上。如下为模6和模10计数器代码:
5.2.1、模6计数器
为了实现在秒表计数是0-5的计数部分,故须设计一个模6计数器,输入时钟信号、使能和清零,遇上升沿则记一次数,当从0记到5时,进位端(用于与下一级计数器级联)有效,且遇上升沿后从5变到0,并且输出的还有每一时刻的计数值。
5.2.2、模10计数器
为了实现在秒表计数是0-9的计数部分,故须设计一个模10计数器,输入时钟信号、使能和清零,遇上升沿则记一次数,当从0记到9时,进位端(用于与下一级计数器级联)有效,且遇上升沿后从9变到0,并且输出的还有每一时刻的计数值。
5.3、控制电路
控制计数器的运行、暂停以及复位;产生锁存器的使能信号。从如下状态图可知,在设计控制模块时,为实现开发板上控制秒表的运行暂停和清零功能,必须设置两个控制输入端,以及需要时钟信号输入端。在时钟信号输入情况下,由状态图显示,在输入不同的控制信号是,控制模块需输出信号控制计数器及其他各模块的清零和使能端,即当外部控制运行/暂停键首次按下时,控制模块输出控制技术模块最开始的计数器模块使能有效,各模块清零无效;当第二次按下时为暂停信号,控制模块控制锁存器锁存并控制显示。当清零控制键按下时,控制模块控制技术模块清零,故要两个输出使能端。
5.4、锁存器
锁存数据,使显示保持锁定。为达到锁存数据目的,则必须要有对应的8个数码显示数据输入,当其中两个数码数据为不变的,故只需输入6组由4位二进制码构成的数据、1KHz时钟信号以及控制模块作用的使能端。当使能端有效的情况下,将输入6组数据输出。5.5、消抖电路
消除按键输入信号抖动的影响,输出单脉冲。在手动控制按键输入控制信号前,由于人为因素,会导致输入信号不稳定等问题,故须添加一个消抖模块,使得每次按键只会产生一个脉冲。故除1KHz时钟信号输入外,还需要一个按键控制信号输入端以及一个按键消抖后输出信号。
5.6、译码器
包括扫描计数器、3-8译码器、数据选择器以及7段译码器;控制8个数码管一扫描方式显示计时结果。译码模块的功能是对之前计数模块的计数值进行译码,使其可以在数码管上显示出来。在8个数码管中有两个数码管显示是不变的,故不需要输出,所以译码模块要求输入需要译码的6组数据以及1KHz时钟信号。译码模块除了要求对每一个可能的值(0-9)进行译码外,还有设计要求8个数码管显示共用一个段位,故还需设计一个3-8译码模块对8个数码显示管进行选择,使其轮流显示,在1KHz的扫描下,使人看上去是8个数码管同时显示的。
l
5.7、计数器模块
由模6和模10计数器级联而成。为了实现从00’00”00-59’59”99的计数,需要将4个模10计数模块和2个模6计数模块级联,并且为了达到设计要求是这6个计数器工作在100Hz的时钟信号下,可利用一个模10的计数模块对1KHz进行分频,输出的信号频率即为100Hz,该总计数模块最终需输出6组计数数据以及其最终的进位。
5.8、top文件
由以上各个文件相互连接而成,以及硬件的管脚管脚分布。将之前所建立的各个模块级联起来,从按键输入信号到按键消抖模块再进而连接到控制器,通过控制模块对总计数器模块、锁存器模块、译码器模块、分频器模块相互连接起来,并设置晶振输入信号以及两个按键控制信号输入,再由译码器模块知,秒表设计的最终输出由一个3-8对应的8位位选信号和一组7位的段选信号组成。最后对总文件的输出进行管脚分配,并下载到FPGA开发板上验证设计。
六、仿真结果与分析::
6.11000HZ信号的产生
6.210位计数器的产生
由图可得,10位计数器从0000计到1001
6.3 6位计数器的产生
由图可得,6位计数器从0000计到0101。
6.4七段数码管显示数字
6.5锁存器
由图可得,当没有时钟信号时Q不变。6.6分频器 1000Hz-100Hz
七、分配引脚和下载实现:
全部仿真通过后,就运行ISE 的设计实现,然后再打开XILINX PACE,在里面分配引脚,即实现设计的输入输出端口与实际芯片的输入输出端口的对应连接。
比如七段LED 管的控制信号就连接到实际电路的七个引脚。需要注意的是一些端口是固定的,不能胡乱的连接。比如时基信号即石英振荡器所提供的信号就只能由P181 输入。同时还要考虑内部的可配制逻辑块CLB 的数量是否够满足程序的综合要求。一切都准备就绪后就可以运行Configure Device,选择要下载的位文件(.bit)便可开始。
八、实验结论:
8.1、本次实验实现了秒表的计数,复位,暂停,锁显等功能,让我充分了解和认识到ISE 和Modelsim软件的强大功能和FPGA 技术的优越性。并对软件开发产生了兴趣。
8.2、仿真和下载实现是两个不同的检验,仿真从软件内部来检验程序的合理性和正确性,准确性较高。而下载实现是从外部来观察程序的实现效果,更直观,但不具有准确性。8.3、有时候下载实现了所有的功能,但是仿真通不过,这可能是因为程序中有些部分并不完善导致。从外部来看,效果是一样的,但实际程序却存在漏洞。附:参考文献:
《数字设计原理与实践》作者:(美)John F.Wakerly编 《FPGA应用开发入门与典型实例》华清远见嵌入式培训中心编
附件:(源程序)
1.TOP文件:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;
entity top is
Port(S_S : in STD_LOGIC;
S_R : in STD_LOGIC;clk : in STD_LOGIC;
Out8: out STD_LOGIC_VECTOR(7 downto 0);Seg : out STD_LOGIC_VECTOR(6 downto 0));end top;
architecture Behavioral of top is
COMPONENT fenpingqi_48m_1k PORT(clk : IN std_logic;
q : OUT std_logic);END COMPONENT;
COMPONENT counter PORT(clk : IN std_logic;
eng : IN std_logic;
clear : IN std_logic;
ou : OUT std_logic;
daout1 : OUT std_logic_vector(3 downto 0);
daout2 : OUT std_logic_vector(3 downto 0);
daout3 : OUT std_logic_vector(3 downto 0);
daout4 : OUT std_logic_vector(2 downto 0);daout5 : OUT std_logic_vector(3 downto 0);daout6 : OUT std_logic_vector(2 downto 0));
END COMPONENT;
COMPONENT keydb PORT(clk : IN std_logic;key_in : IN std_logic;
key_out : OUT std_logic);END COMPONENT;
COMPONENT control PORT(clk : IN std_logic;q : IN std_logic;p : IN std_logic;
j_clr : OUT std_logic;j_en : OUT std_logic;s_en : OUT std_logic);END COMPONENT;COMPONENT latch PORT(cnt_0 : IN std_logic_vector(3 downto 0);cnt_00 : IN std_logic_vector(3 downto 0);cnt_1 : IN std_logic_vector(3 downto 0);cnt_11 : IN std_logic_vector(2 downto 0);cnt_2 : IN std_logic_vector(3 downto 0);cnt_22 : IN std_logic_vector(2 downto 0);display_in : IN std_logic;
cnt0 : OUT std_logic_vector(3 downto 0);cnt00 : OUT std_logic_vector(3 downto 0);cnt1 : OUT std_logic_vector(3 downto 0);cnt11 : OUT std_logic_vector(2 downto 0);cnt2 : OUT std_logic_vector(3 downto 0);cnt22 : OUT std_logic_vector(2 downto 0));END COMPONENT;
COMPONENT display PORT(clk_1k : IN std_logic;
cnt0 : IN std_logic_vector(3 downto 0);
cnt00 : IN std_logic_vector(3 downto 0);
cnt1 : IN std_logic_vector(3 downto 0);
cnt11 : IN std_logic_vector(2 downto 0);
cnt2 : IN std_logic_vector(3 downto 0);
cnt22 : IN std_logic_vector(2 downto 0);
output: out STD_LOGIC_VECTOR(7 downto 0);
seg : OUT std_logic_vector(7 downto 1));END COMPONENT;
signal clk_1k,clk_100:std_logic;signal S_S_out,S_R_out:std_logic;signal clr_A,ena_A,lock_A:std_logic;signal co_out1,co_out2,co_out3,co_out4,co_out5:std_logic;signal dao1,dao2,dao3,dao5,daoA,daoB,daoC,daoE:std_logic_vector(3 0);signal dao4,dao6,daoD,daoF:std_logic_vector(2 downto 0);signal Dig:std_logic_vector(2 downto 0);
begin
Inst_fenpingqi_48000: fenpingqi_48m_1k PORT MAP(clk =>clk,q => clk_1k);
Inst_counter: counter PORT MAP(clk =>clk_1k ,eng =>ena_A ,clear =>clr_A ,daout1 =>dao1 ,daout2 => dao2,daout3 => dao3,daout4 => dao4,daout5 => dao5,daout6 => dao6);
Inst_keydb1: keydb PORT MAP(clk =>clk_1k ,key_in => S_S,downto
key_out =>S_S_out);
Inst_keydb2: keydb PORT MAP(clk =>clk_1k , key_in => S_R, key_out =>S_R_out);Inst_control: control PORT MAP(clk =>clk_1k , q =>S_S_out , p =>S_R_out , j_clr =>clr_A , j_en =>ena_A , s_en =>lock_A);Inst_latch: latch PORT MAP(cnt_0 => dao1, cnt_00 => dao2, cnt_1 => dao3, cnt_11 => dao4, cnt_2 => dao5, cnt_22 => dao6, display_in =>lock_A , cnt0 =>daoA, cnt00 =>daoB, cnt1 =>daoC, cnt11 =>daoD, cnt2 =>daoE, cnt22 =>daoF);Inst_display: display PORT MAP(clk_1k => clk_1k, cnt0 =>daoA , cnt00 =>daoB, cnt1 =>daoC, cnt11 =>daoD, cnt2 =>daoE, cnt22 =>daoF, output => Out8, seg =>Seg);
end Behavioral;
2.模10计算器:
entity counter10 is
Port(clr : in STD_LOGIC;clk : in STD_LOGIC;
en : in STD_LOGIC;
co : out STD_LOGIC;daout : out STD_LOGIC_VECTOR(3 downto 0));end counter10;
architecture Behavioral of counter10 is signal count:std_logic_vector(3 downto 0);begin process(clk,clr,count)begin if clr='1' then count<=“0000”;co<='0';elsif(clk='1' and clk'event)then if en='1' then if count=“1001” then count<=“0000”;else count<=count+1;end if;end if;end if;if count=“1001”and en='1' then co<='1';else co<='0';end if;daout<=count;end process;
end Behavioral;3.模6计算器:
entity counter6 is
Port(clr : in STD_LOGIC;clk : in STD_LOGIC;
en : in STD_LOGIC;
co : out STD_LOGIC;daout : out STD_LOGIC_VECTOR(2 downto 0));end counter6;
architecture Behavioral of counter6 is signal count:std_logic_vector(2 downto 0);
begin process(clk,clr,count)begin if clr='1' then count<=“000”;
co<='0';elsif(clk='1' and clk'event)then if en='1' then if count=“101” then count<=“000”;else count<=count+1;end if;end if;end if;if count=“101”and en='1' then co<='1';else co<='0';end if;daout<=count;end process;end Behavioral;
4.计算器级联:
entity counter is
Port(clk : in STD_LOGIC;eng : in STD_LOGIC;
clear : in STD_LOGIC;
ou : out STD_LOGIC;
daout1 : out STD_LOGIC_VECTOR(3 downto 0);
daout2 : out STD_LOGIC_VECTOR(3 downto 0);
daout3 : out STD_LOGIC_VECTOR(3 downto 0);
daout4 : out STD_LOGIC_VECTOR(2 downto 0);
daout5 : out STD_LOGIC_VECTOR(3 downto 0);
daout6 : out STD_LOGIC_VECTOR(2 downto 0));end counter;
architecture Behavioral of counter is COMPONENT fenpingqi_1k_100 PORT(clk : IN std_logic;
q : OUT std_logic);END COMPONENT;
COMPONENT counter10 PORT(clr : IN std_logic;
clk : IN std_logic;
en : IN std_logic;
co : OUT std_logic;
daout : OUT std_logic_vector(3 downto 0));END COMPONENT;
COMPONENT counter6 PORT(clr : IN std_logic;
clk : IN std_logic;
en : IN std_logic;
co : OUT std_logic;
daout : OUT std_logic_vector(2 downto 0));END COMPONENT;
signal clk_100:std_logic;signal clr_A,ena_A:std_logic;signal co_out1,co_out2,co_out3,co_out4,co_out5:std_logic;
begin Inst_fenpingqi_10: fenpingqi_1k_100 PORT MAP(clk =>clk,q => clk_100);
Inst_counter10_1: counter10 PORT MAP(clr => clear,clk =>clk_100 ,en =>eng,co => co_out1,daout => daout1);Inst_counter10_2: counter10 PORT MAP(clr => clear,clk =>clk_100 ,en => co_out1,co => co_out2,daout => daout2);Inst_counter10_3: counter10 PORT MAP(clr => clear,clk =>clk_100 ,en => co_out2,co => co_out3,daout => daout3);
Inst_counter6_1: counter6 PORT MAP(clr =>clear ,clk =>clk_100,en =>co_out3,co =>co_out4 ,daout => daout4);Inst_counter10_4: counter10 PORT MAP(clr => clear,clk =>clk_100 ,en => co_out4,co => co_out5,daout => daout5);Inst_counter6_2: counter6 PORT MAP(clr =>clear,clk =>clk_100,en =>co_out5,co =>ou,daout => daout6);
end Behavioral;
5.控制电路:
entity control is
Port(clk : in STD_LOGIC;
q : in STD_LOGIC;
p : in STD_LOGIC;j_clr : out STD_LOGIC;j_en : out STD_LOGIC;s_en : out STD_LOGIC);end control;
architecture Behavioral of control is signal state:std_logic_vector(1 downto 0):=“00”;signal next_state:std_logic_vector(1 downto 0);signal key:std_logic_vector(1 downto 0);
begin key<=q&p;process(state,key)begin case state is when“00”=> if key=“10” then next_state<=“01”;else next_state<=state;end if;when“01”=> case key is when“10”=>next_state<=“11”;when“01”=>next_state<=“10”;when others=>next_state<=state;end case;when“10”=> if key=“01” then next_state<=“01”;else next_state<=state;end if;when others=> case key is when“10”=>next_state<=“01”;when“01”=>next_state<=“00”;when others=>next_state<=state;end case;end case;end process;process(clk)begin if rising_edge(clk)then state<=next_state;end if;end process;process(state)begin case state is when“00”=> j_clr<='1';j_en<='1';s_en<='1';when“01”=> j_clr<='0';j_en<='1';s_en<='1';when“10”=> j_clr<='0';j_en<='1';s_en<='0';when others=> j_clr<='0';j_en<='0';s_en<='1';end case;end process;end Behavioral;
6.分频器(2个): entity fenpingqi_48m_1k is
Port(clk : in STD_LOGIC;
q : out STD_LOGIC);end fenpingqi_48m_1k;
architecture Behavioral of fenpingqi_48m_1k is signal counter:STD_LOGIC_VECTOR(15 downto 0);begin process(clk)begin if(clk='1'and clk'event)then if counter=47999 then counter<=(others=>'0');else
counter<=counter+1;end if;end if;
q<= counter(15);end process;
end Behavioral;
entity fenpingqi_1k_100 is
Port(clk : in STD_LOGIC;
q : out STD_LOGIC);end fenpingqi_1k_100;architecture Behavioral of fenpingqi_1k_100 is signal counter:STD_LOGIC_vector(3 downto 0);
begin process(clk)begin if(clk='1'and clk'event)then if counter=9 then counter<=“0000”;else
counter<=counter+1;end if;end if;q<=counter(3);end process;end Behavioral;
7.显示电路:
entity display is
Port(clk_1k : in STD_LOGIC;
cnt0 : in STD_LOGIC_VECTOR(3 downto 0);
cnt00 : in STD_LOGIC_VECTOR(3 downto 0);
cnt1 : in STD_LOGIC_VECTOR(3 downto 0);
cnt11 : in STD_LOGIC_VECTOR(2 downto 0);
cnt2 : in STD_LOGIC_VECTOR(3 downto 0);
cnt22 : in STD_LOGIC_VECTOR(2 downto 0);
output: out STD_LOGIC_VECTOR(7 downto 0);seg : out STD_LOGIC_VECTOR(7 downto 1));end display;
architecture Behavioral of display is signal dig:std_logic_vector(2 downto 0):=“000”;signal bcd:std_logic_vector(3 downto 0):=“1000”;signal seg7:std_logic_vector(7 downto 1):=“1111110”;
begin process(clk_1k)begin if clk_1k'event and clk_1k='1' then dig<=dig+1;end if;end process;process(dig)begin case dig is when“000”=>bcd<=cnt0;when“001”=>bcd<=cnt00;when“010”=>bcd<=“1010”;when“011”=>bcd<=cnt1;when“100”=>bcd<='0'& cnt11;when“101”=>bcd<=“1010”;when“110”=>bcd<=cnt2;when“111”=>bcd<='0'&cnt22;when others=>bcd<=“1010”;end case;end process;process(bcd)begin case bcd is when“0000”=>seg7<=“0000001”;when“0001”=>seg7<=“1001111”;when“0010”=>seg7<=“0010010”;when“0011”=>seg7<=“0000110”;when“0100”=>seg7<=“1001100”;when“0101”=>seg7<=“0100100”;when“0110”=>seg7<=“1100000”;when“0111”=>seg7<=“0001111”;when“1000”=>seg7<=“0000000”;when“1001”=>seg7<=“0001100”;when others=>seg7<=“1111110”;end case;end process;process(dig)begin case dig is when“000”=>output<=“01111111”;when“001”=>output<=“10111111”;when“010”=>output<=“11011111”;when“011”=>output<=“11101111”;when“100”=>output<=“11110111”;when“101”=>output<=“11111011”;when“110”=>output<=“11111101”;when“111”=>output<=“11111110”;when others=>output<=“11111111”;end case;end process;seg<=seg7;end Behavioral;
8.锁存器:
entity latch is
Port(cnt_0 : in STD_LOGIC_VECTOR(3 downto 0);
cnt_00 : in STD_LOGIC_VECTOR(3 downto 0);
cnt_1 : in STD_LOGIC_VECTOR(3 downto 0);
cnt_11 : in STD_LOGIC_VECTOR(2 downto 0);
cnt_2 : in STD_LOGIC_VECTOR(3 downto 0);
cnt_22 : in STD_LOGIC_VECTOR(2 downto 0);display_in : in STD_LOGIC;
cnt0 : out STD_LOGIC_VECTOR(3 downto 0);
cnt00 : out STD_LOGIC_VECTOR(3 downto 0);
cnt1 : out STD_LOGIC_VECTOR(3 downto 0);
cnt11 : out STD_LOGIC_VECTOR(2 downto 0);
cnt2 : out STD_LOGIC_VECTOR(3 downto 0);
cnt22 : out STD_LOGIC_VECTOR(2 downto 0));end latch;
architecture Behavioral of latch is
begin process(display_in,cnt_0,cnt_00,cnt_1,cnt_11,cnt_2,cnt_22)begin if display_in='1' then cnt0<=cnt_0;cnt00<=cnt_00;cnt1<=cnt_1;cnt11<=cnt_11;cnt2<=cnt_2;cnt22<=cnt_22;end if;end process;end Behavioral;
9.消抖电路:
entity keydb is
Port(clk : in STD_LOGIC;key_in : in STD_LOGIC;key_out : out STD_LOGIC);end keydb;
architecture Behavioral of keydb is signal k1,k2:STD_LOGIC;signal cnt : STD_LOGIC_VECTOR(1 DOWNTO 0);
begin process(clk,key_in)begin if clk'event and clk ='0' then if cnt =3 then k1<='1';else k1<='0';cnt<=cnt+1;end if;k2<=k1;end if;if key_in ='0' then cnt<=“00”;end if;end process;key_out<= not k1 and k2;
end Behavioral
第三篇:电子科技大学实验报告格式
九、实验结论:
十、总结及心得体会:
十一、对本实验过程及方法、手段的改进建议:
报告评分:指导教师签字:
电子科技大学
学生姓名:
学号:
指导教师:
日期:实 验 报 告年月日
一、实验室名称:
二、实验项目名称:
三、实验原理:
四、实验目的:
五、实验内容:
六、实验器材(设备、元器件):
七、实验步骤:
八、实验数据及结果分析:
第四篇:电子科技大学实验报告格式
九、实验结论:
十、总结及心得体会:
十一、对本实验过程及方法、手段的改进建议:
报告评分:
指导教师签字: 电子科技大学
学生姓名:学
号:指导教师:日
期:实 验 报 告
****年**月**日
一、实验室名称:
二、实验项目名称:
三、实验原理:
四、实验目的:
五、实验内容:
六、实验器材(设备、元器件):
七、实验步骤:
八、实验数据及结果分析:
第五篇:电子科技大学数学实验报告
一、选择题:(每题3分,共30分)
1、若分式 有意义,则x的取值范围是(A.B.C.D.x≠-1)
2、一射击运动员在一次射击练习中打出的成绩如下表所示:这次成绩的众数是()A;6B;8C;10D;73、若一组数据1,2,3,x的极差为6,则x的值是()
A.7B.8 C.9 D.7或-34、矩形的面积为120cm2,周长为46cm,则它的对角线长为()
A.15cmB.16cmC.17cmD.18cm5、如图,△ABC中,AB=AC=10,BD是AC边上的高线,DC=2,则BD等于((A)4(B)6(C)8(D)
第5题第7题第14题第17题).
6、等腰梯形ABCD中,E、F、G、H分别是各边的中点,则四边形EFGH的形状是()
A.平行四边形 B.矩形 C.菱形 D.正方形
7、函数y1=x(x≥0),(x>0)的图象如图所示,则结论:
①两函数图象的交点A的坐标为(2,2); ②当x>2时,y2>y1;③当x=1时,BC=3; ④当x逐渐增大时,y1随着x的增大而增大,y2随着x的增大而减小.
其中正确结论的序号是()
A;①②B;①②④C;①②③④D;①③④
8、如图,将边长为8㎝的正方形ABCD折叠,使点D落在BC边的中
点E处,点A落在F处,折痕为MN,则线段CN的长是()
A.3cmB.4cmC.5cmD.6cm,则 的值为(C.14)
9、已知A.12B.13D.1510、三角形三边之比分别为①1:2:3,②3:4:5;③1.5:2:2.5,④4:5:6,其中可以构成直角三角形的有()
A.1个B.2个C.3个D.4个
二、填空题:(每题3分,共24分)
11、数据2,x,9,2,8,5的平均数为5,它的极差为
12、用科学计数法表示:-0.034=。
13、约分=
第18题
14、如图,正方形网格中,每个小正方形的边长为1,则网格上的△ABC是______三角形.
15、已知菱形ABCD的周长为20cm,且相邻两内角之比是1∶2,则菱形的两条对角线的长和面积分别是 ________.
16、一个三角形的三边长分别为4,5,6,则连结各边中点所得三角形的周长为_________.17、如图5,若点 在反比例函数 的图象上,轴于点,的面积为3,则.
18、在矩形 中,,平分,过 点作 于,延长、交于点,下列结论中:① ;② ;③;④,正确的。(填写正确的题号)
三、解答题:(19-25题每题8分,26题10分)
19、(1)已知,求
20、今年,苏州市政府的一项实事工程就是由政府投人1 000万元资金.对城区4万户家庭的老式水龙头和13升抽水马桶进行免费改造.某社区为配合政府完成该项工作,对社区内1200户家庭中的120户进行了随机抽样调查,并汇总成下表:
改造
情况 均不
改造 改造水龙头 改造马桶
1个 2个 3个 4个 1个 2个
户数 20 31 28 21 12 69 2
(1)试估计该社区需要对水龙头、马桶进行改造的家庭共有__户;
(2)改造后.一只水龙头一年大约可节省5吨水,一只马桶一年大约可节省15吨水.试估计该社区一年共可节约多少吨自来水?
(3)在抽样的120户家庭中.既要改造水龙头又要改造马桶的家庭共有多少户?
21、如图,在□ABCD中,已知点E和点F分别在AD和BC上,且AE=CF,连结CE和AF,试说明四边形AFCE是平行四边形.22、如图,在△ABO中,已知A(0,4),B(﹣2,0),D为线段AB的中点.
(1)求点D的坐标;(2)求经过点D的反比例函数解析式.
值(2)解分式方程: