电子秤VHDL代码
vhdl基本语法 ifdef

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介绍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

四、各功能模块的源程序代码 :
-- CONTOR 模块 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity contor is
1 )“小时” 校时状态: 进入“小时”校时状态后,显示 “小时” 的数码管闪烁,每按动“ k” 键一次,“小时” +1,若不按动“ k”键 则小时数不变,一直按下“ k” 键则小时数一 4Hz 的频率递增计数。
2 )“分”校时状态:进入“分”校时状态后,显示“分”的数 码管闪烁,每按动“ k” 键一次,“分” +1,若不按动“ k”键则分数 不变,一直按下“ k” 键则分数一 4Hz的频率递增计数。
chs,cms,css,f4 :in std_logic; bsg,bmg,bhg,bsd,bmd,bhd :buffer std_logic_vector(3 downto 0); comout :out std_logic); end time_com; architecture time_comx of time_com is begin com:process(hh,mh,sh,hl,ml) begin if(bhg=hh and bhd=hl and bmg=mh and bmd=ml and bsg=sh)then comout<='1'; else comout<='0'; end if; end process; set:process(f4) begin if(f4'event and f4='1')then if(chs='1'and k='0')then if(bhg="0010" and bhd="0011")then bhd<="0000";bhg<="0000"; elsif(bhd="1001")then bhd<="0000";bhg<=bhg+1; elsif(bhd="0000"or bhd="0001" or bhd="0010"or bhd="0011"or bhd="0100"or bhd="0101"or bhd="0110"or bhd="0111"or bhd="1000")then bhd<=bhd+1; end if; end if; end if; end process; process(f4) begin if(f4'event and f4='1')then if(cms='1'and k='0')then if(bmg="0101" and bmd="1001")then
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-- 输入电压范围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)。