电子秤VHDL代码
- 格式:docx
- 大小:16.94 KB
- 文档页数:2
VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,用于描述数字电路和系统。
它是由美国国防部(DOD)于20世纪80年代初期的VHSIC(Very High Speed Integrated Circuits)项目中开发的。
VHDL的基本语法包括一些常用的关键字和结构,其中ifdef是其中之一。
ifdef是VHDL中的一个条件编译指令,用于根据给定的条件来判断是否包含某段代码。
在VHDL中,ifdef语句的基本语法如下:```vhdl`ifdef condition-- code to be included if condition is true`else-- code to be included if condition is false`endif```在上面的代码中,condition是一个条件表达式,可以是一个参数、宏定义或者其他已经定义过的条件。
如果condition为真,则会编译`ifdef和`endif之间的代码;如果condition为假,则会编译`else和`endif之间的代码。
使用ifdef可以让我们根据不同的条件来控制代码的编译和包含,这在一些复杂的项目中非常有用。
下面是使用ifdef的一个简单示例:```vhdl`ifdef DEBUGreport "Debug mode is enabled";`elsereport "Debug mode is disabled";`endif```在上面的代码中,如果DEBUG宏被定义了,那么report语句"Debug mode is enabled"将被编译进去;否则将编译进去"Debug mode is disabled"。
除了`ifdef语句外,VHDL还提供了一些其他的条件编译指令,如`ifndef(如果给定条件为假则编译)、`elsif(如果前面的条件为假则继续判断下一个条件)、`elsif和`endif。
基于单片机的电子秤系统设计摘要电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。
它与我们日常生活紧密结合息息相关。
电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。
电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。
本系统的设计主要从硬件电路设计,软件编程调试,实物焊接调试三部分进行详细阐述。
硬件电路主要是基于单片机AT89S52为核心的控制单元实现数据的处理,采用压力传感器对数据进行采集,电子秤专用24位AD转换芯片HX711对传感器采集到的模拟量进行AD转换,转换后的数据送到单片机进行处理显示,数据显示由LCD1602液晶实现,液晶显示效果稳定无闪烁关键词:AT89S52单片机;电子秤;压力传感器;HX711WIRELESS TEMPERATURE DETECTING SYSTEM DESINGBASED ON MCUABSTRACTWith Intelligent electronic scale is the detection and conversion technology, computer technology, information processing, digital technology, an integrated modern technology of new weighing equipment.Ectronic scale takes SCM as its central controling unit,and achieves AD transform through weighting transducer,then adds keybord,display circuit and powerful softerwear. It is not only accurate,swift,and convenient, but also makes an important effect to people’s life by its automatic weightment and digital display, so it becomes more and more popular.The design of this system gives its eleboration from 3 parts: Hardwear circuit design,softwear programme debugging and entity weld debugging.Hardwear circuit reaches data processing by the controling unit which based on AT89S52,and gathers data by weighting transducer,then makes AD transform by HX711 to the data gathered, and the transformed data then transferred to AT89S52 for display prosessing, at last LCD1602 would show it out steadily without twinklingKey Words: AT89S52 MCU,Electrnoic Scale,Load sensor,HX711.目录摘要 (I)ABSTRACT (II)目录.......................................................................................................................................................................... I II 第1章绪论. (1)1.1课题背景与研究意义 (1)1.2 系统设计要求 (2)1.3系统设计方案 (3)1.4电子秤的主要组成 (5)1.4.1 电子秤的基本结构 (5)1.4.2 电子秤的工作原理 (6)1.4.3 电子秤的计量性能 (7)第2章系统硬件设计 (8)2.1 流系统元器件选型及参数介绍 (8)2.1.1 系统单片机选型 (8)2.1.2 系统传感器选型 (10)2.1.3 系统AD转换芯片选择 (13)2.1.4系统显示器选择 (14)2.1.5系统时钟芯片选择 (16)2.2 系统硬件电路设计 (17)2.2.1系统电源电路设计 (17)2.2.2系统单片机主控电路设计 (18)2.2.3系统显示部分电路设计 (20)2.2.4系统超重报警指示电路设计 (21)2.2.5系统按键输入电路设计 (21)2.3系统硬件电路的绘制与PCB线路板制作 (23)2.3.1 Protell 99 SE软件介绍 (23)2.3.2 系统原理图绘制与PCB印刷线路板制作 (23)第3章系统软件设计 (27)3.1 系统软件编程环境介绍 (27)3.2系统主程序流程图 (27)3.3系统显示部分流程图 (28)3.4系统按键调整部分流程图 (29)第四章系统的制作、安装与调试 (30)4.1电路的绘制与PCB板的制作 (30)4.2 系统的调试 (31)第五章总结与体会 (32)5.1 总结 (32)5.2 体会 (33)参考文献 (34)致谢 (35)第1章绪论1.1课题背景与研究意义电子秤作为一种计量手段,广泛应用于工农业、科研、交通、内外贸易等各个领域,与人民的生活紧密相连。
A8254 EQU 06C0HCON8254 EQU 06C6HA8255 EQU 0600HB8255 EQU 0602HC8255 EQU 0604HCON8255 EQU 0606H.MODEL SMALL.DATATABLE1 DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,80H;控制led上亮的数字是几TABLE2 DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH ;控制led哪个亮KEY DB 0 ;当KEY=1时显示总价,当KEY=0时显示重量和单价PUT_OFF DB 0FLAG DB 0;进中断标志FLAG_1S DB 0COUNT DB 0 ;COUNT=100,1SVALUE DB 0PRICE DB 3 DUP(0);存放单价值WEIGHT DB 3 DUP(0)TOTAL DB 3 DUP(0) ;存放总价PRESS DB 00H;0到9的键值按下时press加1,加到3不存放值,必须按price归0键=0EH TAG1 DB 00H;当TAG1=1,TAG2=0时确定有键按下,TAG2 DB 00H;TAG1=1,TAG2=1时不进行键扫描,此时键松手检测.STACK.CODE.STARTUPCALL INIT8259CALL INIT8254CALL INIT8255MOV AX,@DATAMOV DS,AXAA1:CALL RUN_ADMOV AL,FLAGTEST AL,01HJZ AA1MOV AL,0MOV FLAG,ALMOV AL,KEYTEST AL,01HJNZ AA2CALL SHOW_WEIGHTCALL SHOW_PRICEJMP AA3AA2:CALL SHOW_TOTALJMP AA3AA3:MOV AL,TAG1TEST AL,01HJNZ NEXTJMP AA1NEXT:MOV AL,TAG2TEST AL,01HJNZ AA1;此时有键按下AA4:CALL SCANJMP AA1MIR7 :STIPUSH AXPUSH DXMOV AL,1ADD COUNT,ALMOV AL, COUNTCMP AL,100JC A2MOV AL,0MOV COUNT,ALMOV AL,01HMOV FLAG_1S,ALA2: MOV AL,1MOV FLAG,ALMOV DX,A8255 ;中断10ms定时扫描MOV AL,0F0HOUT DX,ALMOV DX,C8255IN AL,DXAND AL,0FHCMP AL,0FHJNE A3MOV AL,00HMOV TAG1,ALMOV TAG2,ALJMP STOPA3:MOV AL,01HMOV TAG1,ALSTOP:POP DXPOP AXMOV AL,20HOUT 20H,ALIRETRUN_AD:MOV DX,0640HMOV AL,0OUT DX,ALMOV AL,FLAG_1SCMP AL,01HJNE WAIT_AD;每1s读一次值MOV AL,0MOV FLAG_1S,ALIN AL,DXMOV VALUE,ALMOV AH,00HMOV CL,10DIV CLMOV BX,OFFSET WEIGHTMOV [BX+2],AHMOV AH,00HDIV CLMOV [BX+1],AHCALL CALCUTEWAIT_AD:RETCALCUTE:MOV BX,OFFSET PRICEMOV AL,[BX]MOV CX,10MUL CLADD AL,[BX+1]ADC AH,0MUL CXADD AL,[BX+2]ADC AH,0MOV CH,0MOV CL, VALUEMUL CXMOV CX,1000DIV CXMOV BX,OFFSET TOTALMOV CL,10DIV CLMOV [BX+2],AHMOV AH,00HDIV CLMOV [BX+1],AHMOV [BX],ALRETSCAN:MOV AL,01HMOV TAG2,ALMOV BX,1MOV CX,4MOV AH,0FEH AGAIN:MOV AL,AHPUSH BXOUT DX,ALMOV DX,C8255IN AL,DXAB1:TEST AL,BLJZ TEST_NUMSHL BL,1ADD BH,4LOOP AB1TEST AH, 08H ;防止检测不出来,死循环,出不来JZ BBROL AH,1MOV CX,4POP BXMOV BL,1ADD BH,1JMP AGAINTEST_NUM:MOV AL,BHMOV AH,01HADD AL,30HINT 10HCMP BH,09H ;BH就是键值JNC SHOW_MONEY ;按下的是总价键或单价归0键MOV AL,PRESS ;press计算按下的次数CMP AL,03HJNC BB; MOV AL,BHMOV SI,OFFSET PRICE; MOV AL,PRESSMOV AH,00HADD SI,AXMOV [SI],BH; MOV AL,PRESSINC ALMOV PRESS,ALJMP BBSHOW_MONEY:CMP BH,0FHJE KEY1CMP BH,0EHJE RESET_PRICEJMP BBKEY1:MOV AL,KEYTEST AL,01H ;KEY=0时显示price,key=1时显示moneyJNZ KEY_0 ;没按一次键就取反一次MOV AL,01HMOV KEY,ALJMP BBKEY_0:MOV AL,00HMOV KEY,ALJMP BBRESET_PRICE:MOV AL,0MOV PRESS,ALMOV BX,OFFSET PRICEMOV [BX],ALMOV [BX+1],ALMOV [BX+2],ALBB: POP BX ;对应AGAIN中的PUSH BXRETSHOW_PRICE:MOV CL,0MOV AL,0F7HAB2:MOV BX,OFFSET PRICEPUSH AXMOV AL,CLXLATMOV BX,OFFSET TABLE1XLATMOV DX,B8255OUT DX,ALpop axpush axMOV DX,A8255OUT DX,ALcall delayMOV DX,A8255MOV AL,0FFHOUT DX,ALpop axROL AL,1INC CLCMP CL,03HJC AB2MOV AL,80HMOV DX,B8255OUT DX,ALMOV AL,0F7HMOV DX,A8255OUT DX,ALCALL DELAYMOV AL,0FFHOUT DX,ALRETSHOW_WEIGHT:MOV CL,0MOV AL,0FEHAB4:MOV BX,OFFSET WEIGHTPUSH AXMOV AL,CLXLATMOV BX,OFFSET TABLE1XLATMOV DX,B8255OUT DX,ALpop axpush axMOV DX,A8255OUT DX,ALcall delayMOV DX,A8255MOV AL,0FFHOUT DX,ALpop axROL AL,1INC CLCMP CL,03HJC AB4MOV AL,80HMOV DX,B8255OUT DX,ALMOV AL,0FEHMOV DX,A8255OUT DX,ALCALL DELAYMOV AL,0FFHOUT DX,ALRETRETSHOW_TOTAL:MOV CL,0MOV AL,0FEHAB3:MOV BX,OFFSET TOTALPUSH AXMOV AL,CLXLATMOV BX,OFFSET TABLE1XLATMOV DX,B8255OUT DX,ALpop axpush axMOV DX,A8255OUT DX,ALcall delayMOV DX,A8255MOV AL,0FFHOUT DX,ALpop axROL AL,1INC CLCMP CL,03HJC AB3MOV AL,80HMOV DX,B8255OUT DX,ALMOV AL,0FDHMOV DX,A8255OUT DX,ALCALL DELAYMOV AL,0FFHOUT DX,ALRETDELAY:PUSH CXMOV CX,180HAAA1:LOOP AAA1POP CXRETINIT8259:mov ax,0MOV DS,AXMOV AX,OFFSET MIR7MOV SI,003CHMOV [SI],AXMOV SI,003EHMOV AX,CSMOV [SI],AXCLIMOV AL,11HOUT 20H,ALMOV AL,08HOUT 21H,ALMOV AL,04HOUT 21H,ALMOV AL,01HOUT 21H,ALMOV AL,6FHOUT 21H,ALSTIRETINIT8254:MOV DX,CON8254MOV AL,34H ;00 11 0100OUT DX,AL ;10msMOV AL,20HMOV DX,A8254OUT DX,ALMOV AL,60HOUT DX,ALRETINIT8255:MOV DX,CON8255 ;A输出,c低8位输入MOV AL,81HOUT DX,ALMOV DX,A8255 ;中断10ms定时扫描MOV AL,0F0HOUT DX,ALRET.exit 0end。
电子秤标定托利多RL00-3600电子秤标定操作<<3600 RL00 V4.0 简易标定步骤>>一、按代码+24681357+*+05+*出现CAL代表按校准开关,用铁线按一下校准开关。
二、按*--再按*---按1*---再按1出现CAPACTIVE(重量工程)三、按0(2次)出现CAPACTIVE四、按1出现SET PRELOAD(空秤)五、按1出现SET PULLCAP 30KG六、按0选至5KG七、放上法码+按1出现UNLOAD八、拿下砝码+按1(确认)九、按1(保留数据)梅特勒托利多电子秤的标定方法(1) kingbird plus 3130打开仪表盖,S1-1 在ON状态下可以标定称重状态下,按F1键进入F1 按确认显示F1.2 用模式选择,确认F1.3 MAX 最大称量按确认F1.4 e 确认F1.5 CAL X X=0 跳过进入F1.6 X=1 进入标定E SCL 秤台为零,确认15 CAL 倒计时ADD LD 加码,60%MAX 确认000000 去皮和模式输入砝码值,确认15CAL 倒计时完成按确认到F2 按清零键,跳到SAVE,确认保存。
(2) HAWK(防水型)跨接主板上CAL开机,按printer(开关打印) 和zero(清零) 显示F1 按皮重光标移位按功能选择按开关/打印进入“F1.2”按功能选择1 进入标定状态CAP 最大称量incr 分度值escal 空秤确认ADD LD 加砝码,000000 通过皮重和功能键输入砝码值,确认倒计时,CAL D 标定完成。
按开关/打印退回正常显示状态。
(3)3123 PANTHER1. S1-1设定为on 开机,同时按ENTER + ZERO 显示F12. 屏幕显示CAL X 选择1 确认3. E SAL 零位确认4. “ADD LD”“000000 ”加砝码,确认,完成。
(4)XK3124 IND2261. 按住打印键仪表显示“nRSFEr”输清零去皮清零去皮按打印显示“SETUP”.2. 显示F1.2.3 ,选择最大称量,3.F1.2.6 选择分度值F1.3 校秤F1.3.2 选on 可以校两个加载点,off 一个4. CAL 0,,按确认,FULL LD 加载砝码,确认,输入砝码值确认。
VHDL介绍VHDL是⼀种硬件描述语⾔,它可以对电⼦电路和系统的⾏为进⾏描述。
制定了ieee.1164库。
使⽤VHDL语⾔描述的电路,可以进⾏综合和仿真。
VHDL代码3个基本组成部分:库(library)声明、实体(entity)和构造体(architecture)。
库(library)声明:列出了当前设计中需要⽤到的所有⽂件,如ieee,std,work等。
实体(entity):定义了电路的输⼊和输出引脚。
构造体(architecture):所包含的代码描述了电路要实验的功能。
1、库声明库(library)的建⽴和使⽤有利于设计重⽤和代码共享,同时可以使代码结构更加清晰。
2、库的种类在VHDL设计中有3个常⽤的库:ieee库,std库和work库。
在ieee库中有⼀个ieee正式认可的标准std_logic_1164.all。
ieee库包含了许多包集。
⽐如:std_logic_1164:定义了std_logic(8值)和std_ulogic(9值)多值逻辑系统。
std_logic_arith:定义了signal(有符号)和unsigned(⽆符号)数据类型和相关算术运算和⽐较运算操作。
它包含许多数据类型转换函数,这种函数可以实现数据类型的转换。
常⽤的数据类型转换函数包括conv_integer(p),conv_unsigned(p,b),conv_signed(p,b)和conv_std_logic_vector(p,b).std_logic_signed:内部包含⼀些函数,这些函数可以使std_LOGIC_vector类型的数据像signed类型的数据⼀样进⾏运算操作。
std_logic_unsigned:内部包含⼀些函数,这些函数可以使std_logic_vector类型的数据类型像unsigned类型的数据⼀样操作。
std库std库是VHDL设计环境的标准资源库,包括数据类型和输⼊/输出⽂本等内容。
VHDL语言简介VHDL(VHSIC Hardware Description Language)即可高速集成电路硬件描述语言,是一种用于描述数字系统和电路的硬件描述语言。
它在1981年由美国国防部的高速集成电路联合委员会(VHSIC)开发,用于设计大规模集成电路。
VHDL是一种面向对象的语言,可以用于描述各种数字系统,从简单的逻辑门到复杂的处理器。
它提供了丰富的语法和语义,使得设计人员可以准确地描述他们的电路和系统。
VHDL的优势VHDL作为一种硬件描述语言,在数字系统设计中具有许多优势。
1.可重用性:VHDL允许设计人员创建可重用的模块和子系统,这些模块和子系统可以在不同的项目中重复使用,提高了设计效率和可维护性。
2.仿真和验证:VHDL具有强大的仿真和验证能力,可以在设计之前对系统进行全面的仿真和验证。
这有助于检测和纠正潜在的问题,并确保系统在硬件实现之前达到预期的功能。
3.抽象级别:VHDL允许设计人员在不同的抽象级别上描述系统,从高级的行为级别到底层的结构级别。
这使得设计人员可以根据需要在不同的级别上工作,并且可以更容易地进行系统级别的优化。
4.灵活性和可扩展性:VHDL支持灵活的设计方法和工作流程,并允许设计人员在设计过程中进行迭代和修改。
它还可以与其他常用的设计工具和方法集成,以满足特定的需求。
VHDL语言的基本结构VHDL语言由模块、实体、架构以及信号和过程等基本元素组成。
模块(Module)模块是VHDL中描述数字系统的最基本单位。
一个模块可以包含多个实体和架构,并通过连接信号进行通信。
每个模块都有一个顶层实体和一个或多个架构。
实体(Entity)实体是描述模块的接口和行为的抽象。
它定义了输入输出端口,以及模块对外部环境的接口。
一个实体可以有一个或多个架构。
架构(Architecture)架构描述模块的具体行为和内部结构。
它定义了模块的内部信号和过程,以及对外部信号和过程的接口。
单片机电子秤设计报告秤是一种在实际工作和生活中经常用到的测量器具。
随着计量技术和电子技术的发展,传统纯机械结构的杆秤、台秤、磅秤等称量装置逐步被淘汰,电子称量装置电子秤、电子天平等以其准确、快速、方便、显示直观等诸多优点而受到人们的青睐。
和传统秤相比较,电子秤利用新型传感器、高精度AD转换器件、单片机设计实现,具有精度高、功能强等特点。
本课题设计的电子秤具有基本称重、键盘输入、计算价格、显示、超重报警功能。
该电子秤的测量范围为0-10Kg,测量精度达到5g,有高精度,低成本,易携带的特点。
电子秤采用液晶显示汉字和测量记过,比传统秤具有更高的准确性和直观性。
另外,该电子秤电路简单,使用寿命长,应用范围广,可以应用于商场、超市、家庭等场所,成为人们日常生活中不可少的必需品。
一、功能描述1、采用高精度电阻应变式压力传感器,测量量程0-10kg,测量精度可达5g。
2、采用电子秤专用模拟/数字(A/D)转换器芯片hx711对传感器信号进行调理转换,HX711 采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的24 位A/D 转换器芯片。
3、采用STC89C52单片机作为主控芯片,实现称重、计算价格等主控功能。
4、采用128*64汉字液晶屏显示称重重量、单价、总价等信息。
5、采用4*4矩阵键盘进行人机交互,键盘容量大,操作便捷。
6、具有超量程报警功能,可以通过蜂鸣器和LED灯报警。
7、系统通过USB电源供电,单片机程序也可通过USB线串行下载。
二、硬件设计1、硬件方案单片机电子秤硬件方案如图1所示:图1 单片机电子秤硬件方案称重传感器感应被测重力,输出微弱的毫伏级电压信号。
该电压信号经过电子秤专用模拟/数字(A/D)转换器芯片hx711对传感器信号进行调理转换。
HX711 采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的24 位A/D 转换器芯片,内置增益控制,精度高,性能稳定。
HX711芯片通过2线串行方式与单片机通信。
湖南理工学院课程设计报告课程名称:专业综合课程设计专业班级:学生姓名:指导教师:完成时间:报告成绩:目录摘要 (1)第一章绪论 (3)1.1引言: (3)第二章系统方案的设计 (3)2.1 电子秤的设计要求 (3)2.1.1 基本要求 (3)2.1.2 特色与创新 (4)2.2 设计作用与目的: (4)2.3 所用仪器与设备: (4)2.4 设计原理及设计基本思路: (5)2.4.1系统的原理: (5)2.4.2 系统的基本设计思路: (5)2.5 系统总体设计方案选择 (5)2.6单片机的选型:............................... 错误!未定义书签。
2.7输入输出设备指派: (5)2.7.1 键盘输入 (5)2.7.2 输出显示 (6)2.8系统电源 (6)第三章系统硬件设计 (9)3.1 基于AT89S52的主控电路 (9)3.1.1芯片介绍 (9)3.1.2 主控电路 (14)3.2 基于ICL7135的前端信号处理电路 (14)3.2.1 芯片介绍 (14)3.2.2 信号处理电路 (19)3.3 人机交互界面 (21)3.3.1 键盘控制电路 (21)3.3.2 液晶显示电路 (24)3.4 系统电源 (26)3.4.1 芯片介绍 (26)3.4.2 电源电路 (27)3.5 报警电路.................................... 错误!未定义书签。
第四章软件流程 (28)4.1 主程序流程图 (28)4.2 主要中断程序流程图 (29)第五章源程序 (32)第六章程序调试 (44)课程设计心得 (50)参考文献 (51)摘要该设计以51系列单片机AT89S52为控制核心,实现电子秤的基本控制功能。
在设计系统时,为了更好地采用模块化设计法,分步的设计各个单元功能模块,系统的硬件部分可以分为最小系统、数据采集、人机交互界面和系统电源四大部分。
VHDL语言入门教程VHDL是一种硬件描述语言,主要用于设计数字电路和系统。
它是由美国国防部门于1980年代初开发的,目的是为了改进电子设计自动化(EDA)工具的开发效率和设计文档的可重复性。
VHDL广泛应用于数字信号处理(DSP)、嵌入式系统、通信系统和各种ASIC(专用集成电路)和FPGA(现场可编程门阵列)的设计。
本教程将介绍VHDL的基础知识,包括语法、数据类型和常见的建模技术。
一、VHDL的语法VHDL的语法由标识符、关键字、运算符和分隔符组成。
其中,标识符用于给变量、信号和实体命名,关键字用于定义语言特定的操作,运算符用于数学和逻辑运算,分隔符用于分隔语句。
VHDL中的代码以一个实体(entity)的声明开始,然后是体(architecture)的声明,最后是信号声明和进程(process)的描述。
以下是一个简单的例子:```vhdlentity AND_gate isportA, B: in std_logic;C: out std_logicend entity AND_gate;architecture Behavior of AND_gate isbeginC <= A and B;end architecture Behavior;```在这个例子中,我们声明了一个名为AND_gate的实体,它有两个输入信号A和B,一个输出信号C。
然后我们定义了一个名为Behavior的体,它描述了AND门的行为:C等于A与B的逻辑与运算结果。
二、VHDL的数据类型VHDL支持许多数据类型,包括标量类型、数据类型、自定义类型和引用类型。
标量类型包括bit、bit_vector、integer、real、std_logic和std_ulogic等。
其中,bit_vector是一组连续的位,std_logic和std_ulogic用于表示单个信号。
数据类型是由标量类型和数组类型组成的。
数组类型可以是一维、二维或更高维的,用于存储多个数据。
VHDL代码[例1.4.26] 2输入与门的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY and2 ISPORT(a, b : IN STD_LOGIC;y: OUT STD_LOGIC);END and2; ARCHITECTURE one OF and2 IS BEGINy<= a and b;END one;[例2.5.1] 2输入与非门的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand2 ISPORT(a, b : IN STD_LOGIC;y: OUT STD_LOGIC);END nand2; ARCHITECTURE one OF nand2 IS BEGINy<= a nand b;END one;[例2.5.2] 2输入或门的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY or2 ISPORT(a, b : IN STD_LOGIC;y: OUT STD_LOGIC);END or2;ARCHITECTURE one OF or2 IS BEGINy<= a or b;END one;[例2.5.3]非门的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY hnot ISPORT(a : IN STD_LOGIC;y: OUT STD_LOGIC);END hnot; ARCHITECTURE one OF hnot IS BEGINy<= not a;END one;[例2.5.4] 2输入异或门的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY xor2 ISPORT(a, b : IN STD_LOGIC;y: OUT STD_LOGIC);END xor2; ARCHITECTURE one OF xor2 IS BEGINy<= a xor b;END one;[例3.8.1] 3线-8线译码器的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY decoder38 ISPORT(a : IN STD_LOGIC_VECTOR(2 DOWNTO 0); y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END decoder38;ARCHITECTURE one OF decoder38 ISBEGINPROCESS (a)BEGINCASE a ISWHEN "000" => y<= "00000001";WHEN "001" => y<= "00000010";WHEN "010" => y<= "00000100";WHEN "011" => y<= "00001000";WHEN "100" => y<= "00010000";WHEN "101" => y<= "00100000";WHEN "110" => y<= "01000000";WHEN "111" => y<= "10000000";WHEN OTHERS =>null ;END CASE;END PROCESS;END one;[例3.8.2] 8线-3线优先编码器的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY encoder83 ISPORT( d : IN STD_LOGIC_VECTOR(7 DOWNTO 0); encode: OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END encoder83;ARCHITECTURE one OF encoder83 ISBEGINencode <= "111" when d(7) = '1' else "110" when d(6) = '1' else"101" when d(5) = '1' else"100" when d(4) = '1' else"011" when d(3) = '1' else"010" when d(2) = '1' else"001" when d(1) = '1' else"000" when d(0) = '1' ;END one;[例3.8.3] 4选1数据选择器的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux41 isPORT (a,b,c,d : IN STD_LOGIC;s : IN STD_LOGIC_VECTOR(1 DOWNTO 0);z : OUT STD_LOGIC);END mux41;ARCHITECTURE one OF mux41 ISBEGINPROCESS (s ,a,b,c,d)BEGINCASE s ISWHEN "00" => z<= a;WHEN "01" => z<= b;WHEN "10" => z<= c;WHEN "11" => z<= d;WHEN OTHERS =>z<= 'x';END CASE;END PROCESS;END one;[例4.8.1] 同步复位D触发器的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY d_ff isPORT (d,clk,reset : IN STD_LOGIC;q : OUT STD_LOGIC);END d_ff;ARCHITECTURE one OF d_ff IS BEGINPROCESS (clk)BEGINIF clk'EVENT AND clk='1' THENIF reset='1' THENQ<='0';ELSE q<=d;END IF;END IF;END PROCESS;END one;[例4.8.2] 边沿JK 触发器的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY jk_ff isPORT (j,k,clk : IN STD_LOGIC;q, qn : OUT STD_LOGIC);END jk_ff;ARCHITECTURE one OF jk_ff IS SIGNAL q_s : STD_LOGIC; BEGINPROCESS (j,k,clk)BEGINIF clk'EVENT AND clk='1' THENIF J='0' AND k='0' THENq_s<= q_s;ELSIF J='0' AND k='1' THENq_s<='0';ELSIF J='1' AND k='0' THENq_s<='1';ELSIF J='1' AND k='1' THENq_s<=NOT q_s;END IF;END IF;END PROCESS;q<=q_s;qn<=not q_s;END one;[例5.6.1] 十进制计数器的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count10 isPORT (cp : IN STD_LOGIC;q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END count10;ARCHITECTURE one OF count10 ISSIGNAL count :STD_LOGIC_VECTOR(3 DOWNTO 0) ; BEGINPROCESS (cp)BEGINIF cp'EVENT AND cp='1' THENIF count <="1001" THENcount <="0000";ELSE count <= count +1;END IF;END IF;END PROCESS;q<= count;END one;[例5.6.2] 4位基本寄存器的VHDL描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY registerb isPORT (cp,reset : IN STD_LOGIC;data : IN STD_LOGIC_VECTOR(3 DOWNTO 0);q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END registerb;ARCHITECTURE one OF registerb ISBEGINPROCESS (cp)BEGINIF cp'EVENT AND cp='1' THEN IF reset='1' THENq<="0000";ELSEq<= data;END IF;END IF;END PROCESS;END one;。
VHDL电子时钟程序最近收到网上朋友们来信咨询如何设计电子时钟,也有很多热心朋友把他设计的时钟或时钟程序发给我。
因时间和水平有限不能一一回复和审查到底哪些是合格或是网络转载的。
但是感觉可能对部分网友会有所用处,就把自己手头已有的一些时钟设计的相关资料放到网上,希望大家能多多包涵。
我会不定时的把一些时钟设计资料上传到本博客,希望多多关注。
下面是电子时钟设计的部分VHDL程序代码。
VHDL电子钟程序(小时和分钟)library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity hours isPort ( rst4,selector3,ky_3j : in STD_LOGIC;C10 : in std_logic;dat40 : out std_logic_vector(7 downto 0));end hours;architecture Behavioral of hours issignal dat41,dat42 : std_logic_vector(7 downto 0):=(others =>'0');beginprocess(rst4,C10,ky_3j)begincase selector3 iswhen '1' => dat42<=dat41; if ky_3j'event and ky_3j='1' thenif dat41(7 downto 4)="0010" and dat41(3 downto 0)="0011"then dat41<="00000000";elsif dat41(3 downto 0)<"1001" then dat41(3 downto 0)<=dat41(3 downto 0)+1;else dat41(3 downto 0)<="0000";dat41(7 downto 4)<=dat41(7 downto 4)+ 1;end if ;end if ;dat40<=dat41;when '0' => dat41<=dat42; if(rst4 = '0') then dat42<=(others =>'0');elsif C10'event and C10='1' thenif dat42(7 downto 4)="0010" and dat42(3 downto 0)="0011"then dat42<="00000000";elsif dat42(3 downto 0)<"1001" then dat42(3 downto 0)<=dat42(3 downto 0)+1;else dat42(3 downto 0)<="0000";dat42(7 downto 4)<=dat42(7 downto 4)+ 1;end if;end if;dat40<=dat42;when others =>null;end case;end process;end Behavioral;VHDL电子钟程序(分频和秒计数)library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity miseconds isPort ( clk_100HZ,rst1 : in STD_LOGIC;A : out std_logic;dat10 : out std_logic_vector(7 downto 0));end miseconds;architecture Behavioral of miseconds issignal dat1 : std_logic_vector(7 downto 0):=(others =>'0');beginprocess(clk_100HZ,rst1)beginif(rst1 = '0') then dat1<=(others =>'0');elsif clk_100HZ'event and clk_100HZ='1' thenif dat1(7 downto 4)="1001" and dat1(3 downto 0)="1001"then A<='1'; dat1(7 downto 0)<="00000000";else A<='0';if dat1(3 downto 0)<"1001" then dat1(3 downto 0)<=dat1(3 downto 0)+1; else dat1(3 downto 0)<="0000";if dat1(7 downto 4)<"1001" then dat1(7 downto 4)<=dat1(7 downto 4)+1; else dat1(7 downto 4)<="0000";end if;end if;end if;end if;end process;dat10<=dat1;end Behavioral;VHDL电子钟程序(数码管显示扫描程序)library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity scannor isPort ( clk_1MHZ,T : in std_logic;clks : in std_logic_vector(5 downto 0);D : in std_logic_vector(31 downto 0);positions : out std_logic_vector(7 downto 0);segments : out std_logic_vector(7 downto 0));end scannor;architecture Behavioral of scannor issignal cnt8:STD_LOGIC_vector(2 downto 0);signal sin :STD_LOGIC_vector(7 downto 0);signal d1 : STD_LOGIC_vector(3 downto 0);signal bt1 : std_logic_vector(7 downto 0);beginP1: process(clk_1MHZ)beginif (clk_1MHZ'event and clk_1MHZ='1') thencase cnt8 iswhen "000" => sin <= "00000001" ; d1 <= D(3 downto 0) ; led8s(7) <= '0';when "001" => sin <= "00000010" ; d1 <= D(7 downto 4) ; led8s(7) <= '0';when "010" => sin <= "00000100" ; d1 <= D(11 downto 8) ; led8s(7) <= '1';when "011" => sin <= "00001000" ; d1 <= D(15 downto 12) ; led8s(7) < = '0';when "100" => sin <= "00010000" ; d1 <= D(19 downto 16) ; led8s(7) < = '1';when "101" => sin <= "00100000" ; d1 <= D(23 downto 20) ; led8s(7) < = '0';when "110" => sin <= "01000000" ; d1 <= D(27 downto 24) ; led8s(7) < = '1';when "111" => sin <= "10000000" ; d1 <= D(31 downto 28) ; led8s(7) < = '0';when others => null ;end case ;end if ;end process P1;P2 : process(clk_1MHZ)beginif clk_1MHZ'event and clk_1MHZ ='1' then cnt8 <= cnt8+1; end if ;end process P2;P3 : process(d1)begincase d1 iswhen "0000" => led8s(6 downto 0) <= "0111111" ;when "0001" => led8s(6 downto 0) <= "0000110" ;when "0010" => led8s(6 downto 0) <= "1011011" ;when "0011" => led8s(6 downto 0) <= "1001111" ;when "0100" => led8s(6 downto 0) <= "1100110" ;when "0101" => led8s(6 downto 0) <= "1101101" ;when "0110" => led8s(6 downto 0) <= "1111101" ;when "0111" => led8s(6 downto 0) <= "0000111" ;when "1000" => led8s(6 downto 0) <= "1111111" ;when "1001" => led8s(6 downto 0) <= "1101111" ;when others => null ;end case ;end process P3;bt1(0) <= sin(0) ;bt1(1) <= sin(1) ;bt1(2) <= sin(2) and clks(0) ;bt1(3) <= sin(3) and clks(1) ;bt1(4) <= sin(4) and clks(2) ;bt1(5) <= sin(5) and clks(3) ;bt1(6) <= sin(6) and clks(4) ;bt1(7) <= sin(7) and clks(5) ;bt(0)<=not(bt1(0)and T);bt(1)<=not(bt1(1)and T);bt(2)<=not(bt1(2)and T);bt(3)<=not(bt1(3)and T);bt(4)<=not(bt1(4)and T);bt(5)<=not(bt1(5)and T);bt(6)<=not(bt1(6)and T);bt(7)<=not(bt1(7)and T);end Behavioral;。
VHDL详细语法教程VHDL(Very High Speed Integrated Circuit HardwareDescription Language)是一种硬件描述语言,用于对数字电路进行描述、建模和仿真。
它是一种用于描述数字系统结构和行为的语言,广泛用于FPGA(Field Programmable Gate Array)和ASIC(ApplicationSpecific Integrated Circuit)设计中。
VHDL语言具有丰富的语法结构,可以描述数字系统的结构和行为,并可以进行仿真和综合。
下面是VHDL语言的详细语法教程:1. 实体声明(Entity Declaration):VHDL代码的第一部分是实体声明,用于定义设计的接口和名称。
实体声明是设计的顶级结构,它包含输入输出端口的定义。
语法格式如下:```vhdlentity entity_name isportport_name : in/out type;port_name : in/out type;...end entity_name;```其中,entity_name为实体名称,port_name为端口名称,type为端口类型,in表示输入端口,out表示输出端口。
2. 结构体声明(Architecture declaration):在实体声明后,需要定义该实体的结构和行为。
这一部分被称为结构体声明。
语法格式如下:```vhdlarchitecture architecture_name of entity_name issignal signal_name : type;...begin...end architecture_name;```3. 信号声明(Signal declaration):信号用于在VHDL代码中传输数据。
通过信号声明,可以定义存储或传输数据的变量。
信号声明需要在结构体声明的前面进行。
语法格式如下:```vhdlsignal signal_name : type;```其中,signal_name为信号名称,type为信号类型。
-- 输入电压范围0-5V,显示0-255数位--------------------库定义、包定义--------------------LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;--------------------实体定义--------------------ENTITY balance ISport (clk : IN STD_LOGIC; -- 全局时钟输入,12Mhz晶振产生reset : IN STD_LOGIC; -- 复位输入intr : IN STD_LOGIC; -- AD转换结束产生的中断输入data_i : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- ADC转换后的数据输入data_o : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 数码管数据输出l : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- 输出数码管位选cs : OUT STD_LOGIC; -- ADC使能wr : OUT STD_LOGIC; -- ADC写控制rd : OUT STD_LOGIC -- ADC读控制);END balance;--------------------结构体--------------------ARCHITECTURE bhv OF balance ISTYPE state IS (start, convert, read1, read2);-- 状态机定义SIGNAL current_state, next_state : state; -- 状态定义SIGNAL read_data : STD_LOGIC; -- 读数据寄存器SIGNAL clock : STD_LOGIC; -- 扫描时钟SIGNAL p : INTEGER RANGE 0 TO 255; -- 数据寄存器SIGNAL b0,b1,b2 : INTEGER RANGE 0 TO 9; -- 3位数码管显示数据寄存器SIGNAL cnt : INTEGER RANGE 0 TO 3 := 0; -- 扫描寄存器BEGIN--------------------显示进程--------------------PROCESS(p, clk)BEGINCASE p ISWHEN 0|10|20|30|40|50|60|70|80|90|100|110|120|130|140|150|160|170|180|190|200|210|220|230|240|250 => b0 <= 0;WHEN 1|11|21|31|41|51|61|71|81|91|101|111|121|131|141|151|161|171|181|191|201|211|221|231|241|251 => b0 <= 1;WHEN 2|12|22|32|42|52|62|72|82|92|102|112|122|132|142|152|162|172|182|192|202|212|222|232|242|252 => b0 <= 2;WHEN 3|13|23|33|43|53|63|73|83|93|103|113|123|133|143|153|163|173|183|193|203|213|223|233|243|253 => b0 <= 3;WHEN 4|14|24|34|44|54|64|74|84|94|104|114|124|134|144|154|164|174|184|194|204|214|224|234|244|254 => b0 <= 4;WHEN 5|15|25|35|45|55|65|75|85|95|105|115|125|135|145|155|165|175|185|195|205|215|225|235|245|255 => b0 <= 5;WHEN 6|16|26|36|46|56|66|76|86|96|106|116|126|136|146|156|166|176|186|196|206|216|226|236|246 => b0 <= 6;WHEN 7|17|27|37|47|57|67|77|87|97|107|117|127|137|147|157|167|177|187|197|207|217|227|237|247 => b0 <= 7;WHEN 8|18|28|38|48|58|68|78|88|98|108|118|128|138|148|158|168|178|188|198|208|218|228|238|248 => b0 <= 8;WHEN 9|19|29|39|49|59|69|79|89|99|109|119|129|139|149|159|169|179|189|199|209|219|229|239|249 => b0 <= 9;WHEN OTHERS => NULL;END CASE;CASE p ISWHEN 0|1|2|3|4|5|6|7|8|9|100|101|102|103|104|105|106|107|108|109|200|201|202|203|204|205|206|207|208|209 => b1 <= 0; WHEN 10|11|12|13|14|15|16|17|18|19|110|111|112|113|114|115|116|117|118|119|210|211|212|213|214|215|216|217|218|219 => b1 <= 1; WHEN 20|21|22|23|24|25|26|27|28|29|120|121|122|123|124|125|126|127|128|129|220|221|222|223|224|225|226|227|228|229 => b1 <= 2; WHEN 30|31|32|33|34|35|36|37|38|39|130|131|132|133|134|135|136|137|138|139|230|231|232|233|234|235|236|237|238|239 => b1 <= 3; WHEN 40|41|42|43|44|45|46|47|48|49|140|141|142|143|144|145|146|147|148|149|240|241|242|243|244|245|246|247|248|249 => b1 <= 4; WHEN 50|51|52|53|54|55|56|57|58|59|150|151|152|153|154|155|156|157|158|159|250|251|252|253|254|255 => b1 <= 5; WHEN 60|61|62|63|64|65|66|67|68|69|160|161|162|163|164|165|166|167|168|169 => b1 <= 6; WHEN 70|71|72|73|74|75|76|77|78|79|170|171|172|173|174|175|176|177|178|179 => b1 <= 7; WHEN 80|81|82|83|84|85|86|87|88|89|180|181|182|183|184|185|186|187|188|189 => b1 <= 8; WHEN 90|91|92|93|94|95|96|97|98|99|190|191|192|193|194|195|196|197|198|199 => b1 <= 9; WHEN OTHERS => NULL;END CASE;IF (p < 100) THEN b2 <= 0;ELSIF (p >= 100 and p < 200) THEN b2 <= 1;ELSIF (p >= 200) THEN b2 <= 2;END IF;END PROCESS;--------------------分频进程--------------------PROCESS(clk)VARIABLE cnt1 : INTEGER RANGE 0 TO 100;VARIABLE cnt2 : INTEGER RANGE 0 TO 20;BEGINIF (clk'EVENT AND clk = '1') THENIF (cnt1 = 100) THENcnt1 := 0;IF (cnt2 = 20) THENcnt2 := 0;clock <= NOT clock;IF (cnt = 3) THENcnt <= 0;ELSEcnt <= cnt + 1;END IF;ELSEcnt2 := cnt2 + 1;END IF;ELSEcnt1 := cnt1 + 1;END IF;END IF;END PROCESS;--------------------状态驱动进程--------------------sync : PROCESS(clock, reset)BEGINIF (reset = '0') THENcurrent_state <= start;ELSIF (clock'EVENT AND clock = '1') THENcurrent_state <= next_state;END IF;END PROCESS sync;--------------------ADC0804驱动进程--------------------comb : PROCESS(current_state, intr)BEGINCASE current_state ISWHEN start => -- 启动状态next_state <= convert;cs <= '0';wr <= '0';rd <= '1';read_data <= '0';WHEN convert => -- 初始化IF (intr = '0') THENnext_state <= read1;ELSEnext_state <= convert;END IF;cs <= '1';wr <= '1';rd <= '1';read_data <= '0';WHEN read1 => -- 读状态1next_state <= read2;cs <= '0';wr <= '1';rd <= '0';read_data <= '1';WHEN read2 => -- 读状态2next_state <= start;cs <= '1';wr <= '1';rd <= '1';read_data <= '0';WHEN OTHERS => -- 其他状态next_state <= start;END CASE;END PROCESS comb;--------------------读取ADC数据--------------------get_data : PROCESS(clock, reset)BEGINIF (reset = '0') THENp <= 0;ELSIF (clock'EVENT AND clock = '1') THENIF (read_data = '1') THENp <= conv_integer(data_i);END IF;END IF;END PROCESS;--------------------显示进程--------------------PROCESS(cnt)FUNCTION b_to_s7(bcd8421 : INTEGER RANGE 0 TO 9) RETURN STD_LOGIC_VECTOR IS VARIABLE smg7 : STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINCASE bcd8421 IS -- 计算输出值WHEN 0 => smg7 := "11111100"; -- ABCDEFGHWHEN 1 => smg7 := "01100000";WHEN 2 => smg7 := "11011010";WHEN 3 => smg7 := "11110010";WHEN 4 => smg7 := "01100110";WHEN 5 => smg7 := "10110110";WHEN 6 => smg7 := "10111110";WHEN 7 => smg7 := "11100000";WHEN 8 => smg7 := "11111110";WHEN 9 => smg7 := "11110110";WHEN OTHERS => smg7 := "10001110";END CASE;RETURN smg7;END b_to_s7;BEGINCASE cnt ISWHEN 0 => l <= "110"; data_o <= b_to_s7(b0);WHEN 1 => l <= "101"; data_o <= b_to_s7(b1);WHEN 2 => l <= "011"; data_o <= b_to_s7(b2)。