第一篇:数字电子技术设计性实验报告
数字电子技术设计性实验报告
设计题目:
专业
班级
学号
学生姓名
指导教师
教师评分
年月日
第二篇:数字电子时钟实验报告
华大计科学院
数字逻辑课程设计说明书
题目:
多功能数字钟
专业:
计算机科学与技术
班级:
网络工程1班
姓名:
刘群 学号:
1125111023
完成日期:
2013-9
一、设计题目与要求
设计题目:多功能数字钟 设计要求:
1.准确计时,以数字形式显示时、分、秒的时间。2.小时的计时可以为“12翻1”或“23翻0”的形式。
3.可以进行时、分、秒时间的校正。
二、设计原理及其框图 1.数字钟的构成
数字钟实际上是一个对标准频率1HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路。图 1 所示为数字钟的一般构成框图。
图1 数字电子时钟方案框图 ⑴多谐振荡器电路
多谐振荡器电路给数字钟提供一个频率1Hz 的信号,可保证数字钟的走时准确及稳定。⑵时间计数器电路
时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成。其中秒个位和秒十位计数器、分个位和分十位计数器为60 进制计数器。而根据设计要求,时个位和时十位计数器为24 进制计数器。⑶译码驱动电路
译码驱动电路将计数器输出的8421BCD 码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。⑷数码管
数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管。本设计提供的为LED数码管。2.数字钟的工作原理 ⑴多谐振荡器电路
555 定时器与电阻R1、R2,电容C1、C2 构成一个多谐振荡器,利用电容的充放电来调节输出V0,产生矩形脉冲波作为时钟信号,因为是数字钟,所以应选择的电阻电容值使频率为1HZ。⑵时间计数单元
六片74LS90 芯片构成计数电路,按时间进制从右到左构成从低位向高位的进位电路,并通过译码显示。在六位LED 七段显示起上显示对应的数值。⑶校时电源电路
当重新接通电源或走时出现误差时都需要对时间进行校正。通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可。
根据要求,数字钟应具有分校正和时校正功能。因此,应截断分个位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中。图8所示即为带有基本RS 触发器的校时电路。
三、元器件
1.实验中所需的器材 单刀双掷开关4 个.5V 电源.共阴七段数码管 6 个.74LS90D 集成块 6 块.74HC00D 6个 LM555CM 1个 电阻 6个 10uF 电容 2个
2.芯片内部结构及引脚图
图2 LM555CM集成块
图3 74LS90D集成块
五、各功能块电路图
1秒脉冲发生器主要由555 定时器和一些电阻电容构成,原理是利用555 定时器的特性,通过电容的充放电使VC 在高、低电平之间转换。其中555 定时器的高、低电平的门阀电压分别是2/3VCC 和1/3VCC电容器充电使VC 的电压大于2/3VCC 则VC 就为高电平,然
而由于反馈作用又会使电容放电。当VC 小于1/3VCC 时,VC 就为低电平。同样由于反馈作用又会使电容充电。通过555 定时器的这一性质我们就可以通过计算使他充放电的周期刚好为1S这样我们就会得到1HZ 的信号。其中555 定时器的一些功能对照后面目录。其中 555 定时器组成的脉冲发生器电路见附图4.图4 555 定时器组成的脉冲发生器
由于我们要得到1HZ 的信号,所以我们就可以通过555 定时器充放电一次所需的时间的公式。将那时间设为1S然后设定两个电阻计算出另外那个电容值.在设定电阻值时我们要记住将电阻值设为比较常用的那种电阻值,得到的电容值也尽可能让它是比较普遍使用 的。这样就避免了在实际组装过程中很难买到当初设定的那电阻和计算出 的电容值。
在这次设定中我们设定的电阻值RA=10KΩ,RB=62kΩ,C=10uF 经公式
f = 1.43 ÷【(RA + 2RB)×C 】 可得近似为1HZ。
2、利用一个LED 数码管一块74LS90D 连接成一个十进制计数器,电路在晶振的作用下数码管从0—9 显示见图5。
图5、利用2 片74LS90D 芯片连接成一个六十进制电路,电路可从0—59 显示。第一片74LS90D芯片构成10 进制计数器,第二片74LS90D 芯片构成6 进制计数器。74LS90D 具有异步清零功能。
在第一片74ls90 构成的十进制计数器中,当第十个脉冲来到时。此时他的四级触发器的状态为“1001”。这时他就会自动清零。同时给第二片74ls90 构成的6 进制计数器进一,第六个脉冲进位到来时,此时第二片74ls90 芯片的触发器的状态为“0110”,这时QB,QC 均为高电平。将QB 与RO1 相连,将Ro2 与Qc 相连,就会进行异步清零。如此循环就会构成60 进制计数器.见附图6.图6 十六进制电路
4、利用2 片74LS90D 芯片构成24 进制计数器。一片构成二进制计数器,一片构成四进制计数器。由于74LS90D 芯片清零是由两个清零端控制的,所以当第24 个脉冲到来时,第一片74lLS90D芯片的Qc 为高电平。第二片74LS90D 芯片的Qb 为高电平,让第一片74LS90D 芯片的Qc 与两片芯片的Ro1 相连.让第二片74ls90 芯片的QB 与两片芯片的Ro2 相连。当第24 个脉冲到来时就会进行异步清零。如此循环就会构成24 进制计数器。见附图7.图7 24进制电路
5、数字钟电路由于秒信号的精确性和稳定性不可能坐到完全准确无误,又因为电路中其他的原因数字钟总会产生走时误差的现象。所以,电路中就应该有校准时间功能的电路。在这次设计中教时电路用的是一个RS 基本触发器的单刀双置开关,每搬动开关一次产生一个计数脉冲.实现校时功能。见附图8。
7、利用两个六十进制和一个二十四进制连接成一个时、分、秒都会进位的电路总图。见附图8
图8 总电路图
六、心得体会
在这次设计中我们深深地体会到了理论跟实践的不同,理论学的再好不会动手那也只能是纸上谈兵。我们了解了集成电路芯片的型号命名规律,懂得了没有某种芯片时的替代方法,以及在网上查找电子电路资料的方法,掌握了各芯片的逻辑功能及使用方法,进一步熟悉了集成电路的引脚安排,掌握了数字钟的设计方法,明白了数字钟的组成原理以及工作原理。掌握了计数器的工作原理,以及计数器进制的组成方法和级联方法,实现了一次理论指导实践、理论向实践过渡的跨越,虽然期间遇到一些困难,但这些困难却增强了我们分析问题、解决问题的能力,使我们以后不仅只学习书本中的理论知识,而且知道学以致用,动过动手实践是我们对书本中的理论知识掌握地跟牢固、理解地跟深刻,这对我们今后的工作及学习有积极的影响。这次课程设计不仅再次复习了数字电子和模拟电子,而且让我对于芯片的使用更加了解。增加了我的动手操作能力,加深了对该软件的了解。这就是这次课程设计的成果,相信这些实际的操作经验会是我们以后的宝贵财富。
第三篇:模拟电子技术设计制作流程
模拟电子技术设计制作流程
1、选题:每班学生分十个小组组,设组长一名,统一管理本组人员。每个小组
只能选择一个题目。每班每个题目选择个数不能超过3个。完成选题后将组长和小组姓名交给学习委员,由学习委员统一交辅导老师。
2、准备过程:
(1)每个小组完成选题后,要对电路进行仿真和理论讲解,最终要给教师演示
仿真(仿真软件可选用multisim或proteus),制作pcb版图(使用protel软件)和说明电路工作原理。
(2)每个小组在研究明白电路工作原理后,由组长上交元件清单并领取。
(3)焊接制作。
(4)调试电路。
3、验收环节:
(1)验收过程中,产品应该能实现电路的主要功能。
(2)完成电子设计报告。电子设计报告中应该说明:设计任务,电路原理框图,电路原理,元件参数说明,电子制作心得,最后附整体电路图和PCB版图。
4、说明:
(1)电子制作是模拟电子实验课程的重要组成部分,和实验成绩挂钩。
(2)完成电子制作是模拟电子实验课程及格的先决条件。所有未完成的小组模
电实验成绩将被判为不及格。
(3)写作部分要求大家按照一定格式,格式随后公布。
2011.6.1
第四篇:数字电子钟实验报告
本科实验报告
学号: 指导教师:
2016年7月19日
课程名称:
姓名: 院系: 专业:
电子电路安装与调试 陈肖苇、李晓杰、张晨靖 信息与电子工程学院 电子科学与技术 3140104544 王子立
实验报告
课程名称:电子电路安装与调试指导老师:王子立成绩:______________ 实验名称:多功能数字钟的设计与制作实验类型:设计型同组成员:
一、实验目的和要求
实验目的:
1.学习并掌握中规模集成电路设计制作数字电路系统的方法,装调技术和数字钟的功能扩展电路的设计。
2.熟悉集成电路的使用方法。实验要求:
1.选用74系列或COMS系列中规模集成电路,LED数码显示器为主要器件设计并制作一多功能数字电子钟,要求具有如下功能:
①基本功能:以数字形式显示时、分、秒的时间,小时的显示为“12”翻“1”,手动快校时。
②扩展功能:仿广播电台整点报时,报整点时数,定时控制(时间自定)。自行设计电路,至少实现其中两个扩展功能,电路形式尽可能不与前述电路相同。
2.设计与制作要求
①拟定数字电子钟电路的组成框图,要求电路的基本功能与扩展功能同时实现,使用的器件要尽量少、成本低。
②设计、仿真、制作各单元电路,要求器件布局合理、美观,便于级联与调试。③测试数字电子钟系统的逻辑功能,同时满足基本功能与扩展功能的要求。
④画出数字钟系统的整机逻辑电路图,设计印制电路板,要求器件布局合理,布线整齐、美观。
⑤安装并调试整个数字电子钟。
二、实验内容和原理
实验内容:
1.设计主体电路,完成基本功能:以数字形式显示时、分、秒的时间,小时的显示为“12”翻“1”,手动快校时。
2.设计扩展电路,完成扩展功能:仿广播电台整点报时,报整点时数,定时控制(时间自定)。
3.仿真各单元电路。4.制作PCB板并印刷电路。5.焊接电路板并调试。实验原理:
1.数字电子钟电路原理
数字电子钟实际上是一个对标准频率(1Hz)进行计数的电路,主要由基准频率源、分频器、计数器、译码显示驱动器、数字显示器和校准电路等组成。基准频率源是数字电子钟的核心,它产生一个矩形波时间基准信号,其频率精度和稳定性决定了计时的精度。分频器采用计数器实现,以得到1秒(即频率1Hz)的标准秒信号脉冲。在计数器电路中,对秒、分计数采用60进制的计数器,对时计数器采用12翻1 的计数器。译码器采用BCD码七段译码显示驱动器。显示器采用LED七段数码管。
整个数字电路系统的原理如图2.1所示,分为主体电路和扩展电路两大部分。其中主体电路完成数字钟的基本功能,扩展电路实现数字钟的扩展功能。
图2.1多功能数字钟系统组成框图
该系统的工作原理是:由振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,经分频器输出标准脉冲信号。秒计数器满60后想分计数器进位,分计数器满60或向小时计数器进位,小时计数器按照“12翻1”规律计数。计数器的输出经译码器送显示器。计时出现误差时可以用校时电路进行校时、校分。扩展电路必须在主体电路正常运行的情况下才能进行功能扩展。
2.主体电路原理 ①振荡器
振荡器是数字钟的核心。振荡器频率的精确度及稳定度决定了数字钟计时的准确程度,通常选用石英晶体构成振荡器电路。一般来说,振荡器的频率越高,计时精度越高。
由于石英晶体振荡器的输出频率较高,为了得到1Hz的秒信号,需要对振荡器的输出信号进行分频。通常用计数器实现分频,一般用多级二进制计数器实现。
图2.2为时钟专用集成电路(CD4060)的晶体振荡电路及分频电路,取晶振的频率为32768Hz,该电路内部含有一个振荡电路和一个14级2分频电路,使用非常方便。在他的输出端可以得到2Hz的标准脉冲和其他高频信号。2Hz再经过一个D触发器二分频后得到1Hz的秒信号。
图2.2 用CD4060构成的电子钟振荡与分频电路
如果精度要求不高,也可以采用由集成逻辑门与RC组成的时钟源振荡器,或由集成定时器555与RC组成的多谐振荡器。选用555构成的多谐振荡器,设振荡频率f0=103Hz,电路参数如图2.3所示:
图2.3 555构成的振荡器
②分频器
分频器的功能主要有两个:一是产生标准秒脉冲信号,二是提供功能扩展电路所需要的信号,如仿电台报时用的1kHz的高音频信号和500Hz的低音频信号等。选用3片中规模集成电路计数器74LS90可以完成上述功能,因为每片是1/10分频,3片级联则可以获得所需要的频率信号,即第一片的Q0端输出频率为500Hz,第二片的Q3端输出为10Hz,第三片的Q3端输出为1Hz。
③时分秒计数器
时间计数单元有时计数、分计数和秒计数三个部分。分和秒都是模M=60的计数器,输出为两位的BCD嘛,其计数规律为00→01→„→58→59→00→„。选用74LS92作为十位计数器,74LS90作为个位计数器,再将他们级联组成模数M=60的计数器。
也可以选用10进制计数器,无需进制转换,只需要将Q0和CP1’相连即可。CP0’与脉冲输入信号相连,Q3可作为向上的进位信号与秒的十位计数电路CP0’相连,电路连接如图2.4所示:
图2.4 十进制计数器电路
秒十位计数电路为6进制计数器,需要进制转换。10进制计数器转换为6进制计数器的电路如图2.5所示,Q2、Q1通过与门与1清零端R相连,实现6进制转换,与门的输出同时还作为向上的进位信号与分个位计数电路CP0’相连。
图2.5 十进制-六进制计数器转换电路
分计数器与秒计数器设计相同。
时计数器是一个12翻1的特殊进制计数器,即当数字中运行到12时59分59秒时,秒的个位计数器再输入一个秒脉冲后,数字钟应自动显示为01时00分00秒,实现日常生活中习惯用的计时规律。选用74LS191和74LS74,其电路原理见图2.6:
图2.6 时计数器
74LS191是带异步置数端的16进制可逆计数器,设计成0-9的10进制加法器和2→1的减法计数器,用它做1-9的计数何从12→1的减法计数。74LS74是D触发器,用作时十位计数。
工作过程:74LS191从0开始计数,到第九个技术脉冲过后,其输出为1010,与非门G1输出低电平,计数器异步置零,与非门G1又回到高电平。与非门G1回到高电平的瞬间(上升沿),74LS74触发器被置1,完成9-10的进位过程。第十一、十二个脉冲过后计数状态分比为10001/10010,这时与非门G2输出低电平,计数控制端为高电平74LS191被设置为减法计数器,第十三个脉冲到来是74LS191的状态由0010转变为0001.这时,与非门G3的两输入端都为高电平,输出变为低电平,使D触发器清零,整个计数器的状态为00001,完成了从12→1的状态转换。同时计数器74LS191的控制端又恢复为低电平,重新开始下一个12的计数周期。
④译码、驱动及显示电路
各计数单元的计数器实现了对时间的累计,并分别从Q0-Q3端以BCD码的形式输出,译码驱动显示电路是将计数器的输出数码转换为数码显示器所需要的逻辑并驱动显示器进行显示。图2.7是使用CD4511作为译码驱动电路,选用LED数码管作为显示器。CD4511是CMOS BCD码到7段锁存、译码、驱动电路,它可以直接驱动共阴极LED,图中电阻器限流的作用,其阻值应根据电源电压来决定,一般限制LED数码管每段笔画10mA左右。
图2.7 译码、驱动及显示电路
⑤时分校正电路
当数字钟刚接通电源或计时出现误差时,需要校正时间,校时是数字钟应具备的基本功能。一般电子钟都有时、分、秒等校时功能。
对校时电路的要求是:在小时校正的时候不影响分和秒的正常计数,在分校正时不影响小时和秒的正常计数。校时方法有快校时和慢校时两种:快校时通过开关控制,使计数器会1Hz的校时脉冲计数,慢校时用手动产生单脉冲作为校时脉冲。图2.8为校时分电路,它是由基本RS触发器和与非门组成,基本RS触发器的功能是产生单脉冲,防止抖动。其中K为校正用的控制开关。校正脉冲采用1Hz的秒信号,当K处于图示位置时,与非门G1输出高电平,基本RS触发器处于1状态,这是数字钟正常工作,来自分或秒的进位信号能进入时或分计数器。拨动开关K时,与非门G2输出高电平,基本RS触发器处于0状态,这时数字钟处于校正状态,秒信号可以直接进入计数器,而进位信号被阻止,因而能够较快地校正相应计数器的计数值。校准后将校正开关K薄回原位,数字钟继续进行正常的计数工作。如果校时脉冲改由单位脉冲产生器提供,则可以进行慢校时。
图2.8 时分校正电路
3.功能扩展电路 ①仿广播电台整点报时电路
一般数字电子钟都具备整点报时的功能,及在时间到达整点前数秒钟内数字钟会自动发出声响报时。报时方式是发出连续的或者有节奏的音频信号,较复杂的也可以是实时语音提示。仿广播电台整点报时是在整点前数秒内开始报时,响1秒停1秒共5声,前4声低音,最后1声高音。电路功能要求:每当数字钟计时快要到正点时发出声响,通常按照4低音1高音的顺序发出间断声响,以最后一声高音结束的时刻为整点时刻。
设4声低音(约500Hz)分别发生在59分的51秒、53秒、55秒和57秒,最后一声高音(约1kHz)发生在59分59秒,它们的持续时间为1秒,如下表所示: CP(秒)
00 Q3S1 0 0 0 0 0 0 0 0 1 1 0
Q2S1 0 0 0 0 1 1 1 1 0 0 0
Q1S1 0 0 1 1 0 0 1 1 0 0 0
Q0S1 0 1 0 1 0 1 0 1 0 1 0
功能 低音 停 低音 停 低音 停 低音 停 高音 停
当Q3S1=0时鸣低音,当Q3S1=1时鸣高音。
只有当十位的(Q2Q0)M2=11,分个位的(Q3Q0)M1=11,秒十位的(Q2Q0)S2=11以及秒个位的Q0S2=1时,音响电路才能工作。
②定时控制电路
数字钟在制定的时刻发出信号,或驱动音响电路“闹时”,或对某装置的电源进行接通或断开控制,不管是闹时还是控制,都要求时间准确,即信号的开始时刻与持续时间必须满足规定的要求。
例:要求上午7时59分发出闹时信号,持续时间为1min。7时59对应的时个位计数器状态0111,分十位计数器状态0101,分个位计时器状态1001.若将上述计数器输出为1的所有输出端经过与门电路控制音响电路,可以使音响电路正好在7点59响,持续1min后停响。实现的电路如图2.9所示:
图2.9闹时电路
有图可见到达时刻时,音响电路的晶体管导通,扬声器发出1kHz的声音,持续1min后晶体管因为输入端为0而截至,电路停闹。
③报整点时数电路
报整点时数电路功能:每当数字钟计时到整点时发出音响,且几点响几声,实现这一功能的电路主要由以下几部分组成:
①减法计数器:完成几点响几声的功能,即从小时计数器的整点开始进行减法计数,直到零为止。
编码器:将小时计数器的5个输出端Q4、Q3、Q2、Q1、Q0按照12翻1的编码要求转换为减法计数器的4个输入端D3、D2、D1、D0所需的BCD码。
③逻辑控制电路:控制减法计数器的清零与置数,控制报时音响电路的输入信号。根据以上要求,采用过了如图2.10的报整点时数的电路。
图2.10自动报整点时数的电路
编码器是由与非门实现的组合逻辑电路,其输出端的逻辑表达式由5变量的卡诺图可得: D0=Q0
D1=((Q4’Q1)’·(Q1Q4)’)’ D2=(Q2’·(Q4Q1)’)’ D3=(Q3’Q4’)’
减法计数器选用74LS191,个控制端的作用如下:LD’为置数端,当LD’=1时将小时计数器输出的数据经数据输入端D0D1D2D3置入,CP0’为溢出负脉冲输出端,当减计数到0时,CP0’输出一个负脉冲,U’/D为加减控制器。U’/D=1做减法计数。
逻辑控制电路由D触发器74LS74与多级与非门组成。电路的工作原理是:接通电源后按出发开关S,使D触发器清零。该清零脉冲有两个作用,一是使74LS191的置数端LD’=0,即将此时对应的小时计数器输出的整点时数置入74LS191,二是封锁1kHz的音频信号,使音响电路无输入脉冲而停止发声。当分十位计数器的进位脉冲的上升沿来到时,小时计数器加1,新的小时数被置入74LS191,进位脉冲的上升沿同时又使74LS191的状态翻转,输出高电平,经G2、G3延时后使LD’=1,此时74LS191进行减法计数技术脉冲由1Hz秒信号提供。秒信号低电平时音响电路发出1kHZ声音,秒信号高电平时停响。当减法计数到0时,74LS191的CP0’会输出一个负脉冲,使D触发器的触发信号回到0,单触发器的状态保持不变,当74LS191的CP0’结束负脉冲回到高电平时,因此时分进位信号仍为高电平,经与非门G1和非门后产生一个上升沿,使D触发器翻转到0状态,74LS191又回到置数状态。
如果出现某些整点数不准确,主要原因是逻辑控制电路中的与非门延时时间不够,产生了竞争冒险现象,可以适当增加与非门的级数或接入小电容进行延时。
三、主要仪器设备
装有AD、Proteus软件的电脑,各类元件,镊子,焊锡,电烙铁等
四、操作方法和实验步骤
1.实验电路的设计:
①由图2.1所示的数字钟系统组成框图,按照信号的流向分级安装,逐级级联。②级联时如果出现时序配合不同步或尖峰脉冲干扰,引起逻辑混乱,可以增加多级逻辑门来延时,如果显示字符变化很快,模糊不清,可能由于电源电流的跳变引起,可以在集成电路器件的电流端Vcc加退耦滤波电容。
③画数字钟的主题逻辑电路图。经过联调并纠正设计方案中的错误和不足,再测试电路的逻辑功能是否满足设计要求,最后画出满足设计要求的总体逻辑电路图。
2.实验电路的仿真
①在Proteus软件中绘制电路图。
②依次进行主体电路和各扩展电路的功能仿真,观察各电路模块的功能是否满足需求,必要时在关键节点添加示波器探针观察电路的波形情况。根据仿真结果对电路进行适当的调整。
3.PCB板的绘制 4.实验电路的装调
五、设计方案及仿真分析
1.实验电路的设计: ①主体电路
图5.1主体电路
图5.2 振荡器
图5.3 计数器
图5.3 译码显示
②扩展电路
图5.4 正点报时
图5.5仿广播电台正点报时
图5.6 定时控制
图5.7 音响电路
图5.8 电源电路
2.实验电路的仿真: ①计时显示功能
起初仿真发现小时、分、秒的数字都能够正常显示,且分、秒为60进制,但小时信号出现满7复0的状况,即状态为0→1→2→3→4→5→6→7→10→11→12。此时我们的局部电路如图5.9所示:
图5.9 原小时计数显示电路 当H11=1,H13=1即Q3Q2Q1Q0=1010,U2进行置零操作,但观察仿真发现Q3Q2Q1Q0= 0111即置零。我们将H11、H12、H13和LD信号添加到示波器中观察到波形如图5.11所示。
图5.10 添加示波器
图5.11 波形显示
结合数码管显示发现,当数字从7将要变成8时,H13和LD都出现了跳变,H13原本应当从0状态变为1状态并保持一段时间但实际上H13从0变为1后又迅速跳回0,导致电路计数器被置0。
结合这一现象,我们分析原因为,当H13从0状态变成1状态时,H10、H11和H12也同时从1状态变成0,由于电路的延迟,以及计数器采用异步置数,导致跳变现象的产生。因此,我们将原本输入为H11、H13的与非门U18改为输入为H10’、H11、H12’、H13的四输入与非门,然后再进行仿真,发现功能可正常实现。
图5.12 修改后局部电路
②时间校准功能
对电路进行快速时间校准功能的仿真,发现当校时开关下按时,小时数会升高,实现小时校准;当校分开关下按时,分钟数会升高,实现分钟校准,时间校准功能正常。
③正点报时功能
图5.13 音响电路示波器
如图5.13将示波器探针放置在音响电路上,观察当整点来临时,示波器显示的波形情况。图5.14所示是4时来临时,音响发出4声提示音的波形。另外选取其他若干整时数,均能实现正点报时功能。
图5.14正点报时
④仿广播电台报时功能
图5.15仿广播电台报时
观察整点即将来临时音响的波形显示,发现在整点前10s开始报时,并从扬声器中听出先报四声低音再报一声高音,更改若干整点数功能均能正常实现。
⑤定时控制
图5.16 定时控制
利用拨码开关设定好定时的小时数和分钟数,仿真发现到达定时时间时扬声器开始发出提示音,声音持续一分钟,更换若干定时时间再次测试,发现定时控制功能都能够正常实现。
⑥电源电路
图5.15 电源电路
3.PCB板的绘制
最终设计完成的PCB版如下:
图5.16 电路整体设计
电路排版的整体设计理念是将电源以及指示灯放在右上角,通电的同时即可检验电路是否能工作以及电源电路是否正常工作,同时,将整块电路中的用户交互界面,即时间显示界面和按钮操作界面分别置于电路板的上下两侧,其中,将时间显示界面放在最上方,方便观察和调试,将按钮操作界面放在电路板的最下方,方面用户操作;至于其他的功能模块,则放在电路板的中间部分,并按功能相关的原则进行排版。
电路布线的整体设计理念是在电路板的一周布上一圈的电源线和地线,当有需要时直接横向延伸进去进行连接;电路的其它部分则采取自动布线然后手动进行调整的方法。
下面,将针对电路中的关键模块进行详细的介绍。
图5.17 电源电路
上图为电源电路,将8~12V的直流电接在JP1上,若电源正常工作,则电源指示灯LED被点亮,同时经过7805输出5V稳压;其中四个电容C11,C12,C13,C14起到滤波的作用,用来稳定稳压器输出的电压。
图5.18 晶振电路 上图为晶振电路,其中32468为频率为32.768KHz的晶体振荡器,U1是14次分频的分频器,晶振的输出信号经过U1产生一个1KHz的信号和一个2Hz的信号,其中2Hz的信号再次经过分频产生1Hz的信号,当作计数器的时钟。
图5.19 数字钟主体部分
上图为数字钟的主体部分从上到下分别是共阴数码管显示器,分压限流电阻,显示译码器和16进制计数器。首先由16进制计数器由1Hz信号进行计数和产生进位,同时将状态传递给显示译码器4511,显示译码器4511将计数器传递来的状态进行译码,输出对应的高电平信号,经电阻分压后,点亮对应的共阴数码管显示器,即可实现电路的主体功能。
图5.20 开关控制电路
上图是我们的开关控制电路,左边四个拨码开关分别对应小时的十位,小时的个位,分钟的10位,分钟的各位,用其对应的二进制代码进行控制。SW2是闹钟控制电路,其中仅开关1闭合,闹钟打开;仅开关2闭合,闹钟关闭;开关1和开关2同时断开,芯片默认高电平,闹钟打开;开关1和开关2同时闭合,则电源和地会短路,所以不能同时闭合。SW1是整点报时控制电路,当开关1闭合时,整点报时功能使能,开关1打开,整点报时功能关闭。S1是小时电路的手动快校时按键,S2为分钟电路的手动快校时按键。
4.电子钟的安装与调试 ①安装电路 按照原理图、PCB图和板子上的元件名称安装、焊接电路,芯片先焊插座,方便出现问题时进行修改。老师告知PCB板可能出现几处错误,因为修改元件时自动布线把过孔取消了,因此几根地线没有连上。我们检查PCB板与AD中的PCB图连线,计划用导线将没连上的线连上,后来发现错误已经被修改。
②电源电路
安装好电路后,在没有装芯片的情况下,测试电源电路是否正常。将直流电源调整为10V,限流在0.6A左右,按下OUTPUT,电源电路的指示LED灯亮,用万用表测量输出端的电压,在5V左右,故电源电路正常工作。
③主体电路的调试
按照原理图首先安装CD4060芯片,测试振荡电路是否正常。示波器探头首先接CD4060的4脚,接地端接电源地,测得1kHz左右的方波信号。在将探头接至5脚,测得500Hz左右的方波信号。在晶振处可以测得32.7KHz左右的信号(很遗憾忘记拍照记录波形)。因此振荡电路正常工作。
安装所有的芯片,接通电源,电源电路指示灯亮,数码管亮,显示小时的两个数码管显示18,显示分钟的两个数码管显示88,显示秒的两个数码管从零开始以1Hz的频率计数。秒数码管的变化说明秒计数正确,分钟和小时则说明了我们在设计中忽略了自启动问题。通过校时、校分按键调节小时和分钟数合适。
当秒到“59”后,两数码管变为0,同时分钟位加1,说明秒到分钟的逻辑正确。
长按校分按钮,可以看到两个分钟的数码管显示按60进制以秒计数,到达59后小时加1,说明分钟模块正常工作。
长按校时按钮,小时以1Hz频率实现1→12计数,小时模块正常工作。主体电路数字钟正常工作。
在测试按钮短按实现快校时时,发现短按校时按钮,小时显示有可能不变、或有可能乱跳,如从12跳到6跳到2;校分按钮短按时有不变情况,在校分计数超过40后经常直接置零;并且校分按钮会影响到小时的显示;长按时按键按下和松开时也会影响计数变化。这可能与按键开关的抖动有关系;在测试过程中还发现PCB板的抖动也会影响到数码管显示。开关防抖动与上拉电阻与并联电容组成的RC电路有关,所以通过改变电容电阻的值来增大RC电路的时间常数。我们把104的电容换成220uF的电容,使RC电路的时间常数在100ms左右,焊接时注意电容的正负极。但是改变电容后按键短按校时校分情况并没有明显改变。
最后我们决定将按键开关换成拨码开关来得到电平,通过1Hz信号来校时。换成拨码开关后,打开拨码开关后小时、分钟能够正常计数。但是拨码开关与底座有些接触不良,拨动开关时也有可能有抖动,因此拨动拨码开关时需要小心,固定电路板和拨码开关拨动开关可以正常工作。
在调节校时、校分时曾经在板子后方接一个电容,并接过示波器,这个过程中分钟数码管曾突然不显示,按校时、校分按钮并不能使其恢复正常。后发现电路板上分钟电路用到的74LS390非常烫,可能已被烧坏。拆下74LS390后用万用表测试插座上各个管脚的电压,发现电压并没有异常情况,接地脚与电源地直接的电压为0V左右。检查电路板电路没有发现问题。猜测可能背后接电容和示波器测波形时可能有短路等情况发生导致74LS390烧坏。更换74LS390后,电路正常工作,390有稍微发热但不会发烫,390接地脚电压与电源地相同,可以正常使用。
④调节闹钟功能。
闹钟电路通过拨码开关设置闹钟时间。
首先确定电路板上从左到右四个开关顺序按照小时的十位、个位,分钟的十位、个位排列,之后按照当前时间设置拨码开关的数值。此处输入分别为数码管上显示数字的二进制编码,打开闹钟开关后发现喇叭并没有响。检查原理图和电路板,发现每个拨码开关的高位到低位是从右向左的,重新调整拨码开关的拨码后,喇叭持续发出1kHz的声音。关闭闹钟电路的控制开关后声音停止,在同一分钟内,再次打开控制开关,仍然发出声音,当分钟改变时,声音停止。说明闹钟电路正常工作。
调试过程中,应该注意控制开关的作用。由于设计电路的原因,控制开关有两个拨码开关接入状态,左数第一个与电源相接,第二个与地相接,当第二个开关未接通(0)时不论第一个拨码开关接通与否输入都为高电平(1),闹钟电路工作;当状态为01时,闹钟电路控制开关处于打开状态,相当于闹钟电路不工作。但是如果同时使两个开关状态处于“ON”状态,电源直接与地相接,整个电路都被短路,停止工作。因此调试时应小心不能同时拨开两个开关。
⑤调节仿广播台报时功能
首先通过校分按钮使分钟显示为59分,当秒数达到50后,每逢奇数秒数会响一低音声音,持续一秒钟,到达59分响一高音。实现来四声低音一声高音的仿广播电台报时功能。该电路能够正常工作。
⑥调节仿广播台报时功能
打开该电路模块的控制开关后,发现喇叭一直发出一秒一响的声音。电路存在问题。找到该模块的电路,与原理图对照的过程中发现有一网络名写错,在最后版本的原理图中没有改正过来。我们将电路板上相连的LD线用小刀刮断,通过导线将正确的两个相连的管脚连接后,接通电源,在非整点时喇叭不再发声。
因为该电路是在小时数变化时工作,所以我们只需要通过校时开关改变小时数,而不需要将数字钟调至整点来测试电路。
测试过程中,首先我们将时间调至整点,此时仿广播电台报时与整点报时接连工作,我们在数整点报小时数时发现少一声认为可能两功能报时在整点处重叠。
之后再改变校时按钮后,听报小时数是正常的。但多次测试后,发现报小时数的声音普遍比当前的小时数少一声。并且在12→1过程中,小时数报了12声。这说明该电路中存在竞争冒险现象,置数信号LD1比置数要先到达减法计数器导致电路报了之前的小时数,我们通过接入电容来增加LD1所在电路的延迟时间,使置数先传到减法器后再有置数信号的变化。
在LD1的输出端与计数器74LS191的置数管脚之间并联一个104电容,注意焊接时使电容管脚与其他管脚不相接,以免发生短路情况。并联电容后再次测试,发现所有时间的整点报小时数功能所报声音数都正常。
仿广播电台报时模块能够正常工作。
六、讨论、心得 李晓杰:
在本次实验过程我主要承担的工作有闹钟电路和电源电路的设计,利用Proteus对电路进行仿真并修改电路,协助进行电路板的安装,与组员一起进行电路的调试。
在确定实验项目后,首先对给出的电路原理进行理解掌握。在学习过程中,发现数字钟的显示是一一分开的,因此每一个个位、十位都可以看成一个单独的计数器,而不能整体地看成秒钟和分钟是60进制而小时是从1计数到12的11进制计数器,因为这样不利于数码管每一位的显示,超过9的数无法通过7段译码器使数码管有显示数值。另外,整点报小时数电路中通过D触发器来实现减法计数器和置数状态的转换也值得学习。原理部分也加深了我对边沿触发的理解。
在设计闹钟电路时,运用了拨码开关拨二进制数来实现闹钟时间的设定,又用数值比较器来确定数字钟到达了设定时间。在设计过程,要注意TTL门电路中输入悬空时输入的是高电平,所以设计电路时要注意添加接地,同时也要加电阻。我们在设计闹钟电路的控制开关时经过多次修改,与数值比较器相连设置时间的拨码开关电路在此处仿真会出现问题,最终我们确定用两个拨码开关一个接电源一个接地实现控制作用。电源电路能使8~12V左右的电压转换为稳定的5V左右的电压,提供了稳压电源,因此电源输入时可能有的变化使提供的电压造成太大的影响,能保证电路的正常工作。
在电路仿真过程中,我们学习了Proteus软件的使用。Proteus在绘制出电路原理图后可以很方便地进行仿真,同时还可以提供激励电源和虚拟的示波器,方便我们观察电路中的时序变化图和仿真的波形图。在用Proteus仿真振荡、分频电路中,发现晶振不能起振,在网上查询发现这个问题很普遍,Proteus仿真振荡电路是一个短板,我们可以直接设置CD4060的振荡频率为32768Hz来实现振荡电路的观察,但是此时仿真会提示CPU负载达到99~100%使仿真时间与实际时间相差非常大,时间变化得非常慢,并且在示波器上无法显示波形。我们通过对显示出的红蓝块指示高低电平经过一段时间观察可以看出能得到1Hz的信号。在后续仿真中,我们不加入振荡电路,而通过给予激励电源来提供输入信号。在主体电路调试中发现了小时电路变化至7时就发生了进位,通过示波器观察波形发现因为从7(0111)到8(1000)存在着1变0,0变1的情况使LD瞬间有低电平,而将置数电路改成在同时满足1001情况下置数可以解决问题。后来发现将7400改为74LS00后就不会存在这个问题。在仿真过程学习了Proteus软件的使用方法,也对数字电路的内容加深了理解。软件的仿真与实际还是存在差别的,并且每个软件的长处和优点都不一样,我们要根据电路功能选择合适的软件进行仿真。而我们在计数器的设计时,置数电路中只考虑置数数字的1信号,只将1信号对应的网络接至与非门而不考虑0信号对应的网络,是因为计数是由高到低有顺序的,而仿真告诉我们这样做可能会在实际电路中遇到问题;7400和74LS00也说明这个问题的存在也与不同类型的芯片有关系。
调试过程加深了我对各个芯片作用的理解,也积累了调试和修改电路的经验。我们在调试中也遇到了很多问题,首先电路在设计绘制时有一网络名写错,在修改时我们将连线断开后用导线重新连线解决了问题。在实际电路调试中,我们也遇到了竞争冒险的问题,通过增加电容延时的方法来解决问题。在调试过程中,理解了增加并联电容通过电容的充放电来延迟电平达到的时间来达到延迟目的。我们也对开关防抖动电路加深了理解,开关防抖动是通过一个RC电路来减轻开关抖动产生的时间很短的脉冲尖刺等造成电路的变化,可以通过R、C来改变时间常数达到防抖动。
这次实验帮助我们对数字电路的知识进行复习和加深理解,数字电路的理论多数是逻辑问题,当逻辑正确时,实际电路中会遇到的竞争冒险、开关抖动、尖刺等现象,在实验过程中更清晰地展现在我们面前,也让我们掌握对这些问题的解决方法。另外,我觉得我们在设计原理图和绘制PCB板时对后续问题的预见和为调试过程做准备的意识有待增强,我们可以提前增加多余的引脚方便我们接示波器等设备对波形进行测量。这是我们需要提高的能力。张晨靖:
通过这次实验,我学习了中规模集成电路如何设计制作数字电路系统,了解了数字钟的基本功能和扩展功能的设计实现方法,学会使用protuesISIS软件进行电路的仿真以及仿真出错后怎样快速寻找问题原因并进行修调,同时进一步熟练了AD软件的使用和电路板的安装调试。
在此次实验中,我们小组三个组员都有各自的分工,我主要负责答辩ppt的准备、电路的仿真分析和部分电路的修改以及最后的电路调试等。
在进行电路仿真的过程中,由于是第一次使用protues ISIS软件,我一开始还不太熟悉软件的操作方法和功能。开始的时候我认为在AD中已经绘制完成的原理图应当存在某种方法可以直接兼容至ISIS使用而无需重新绘制,后来查询了各种资料,发现ISIS的电路图可以在AD中打开,而AD中的原理图无法使用ISIS打开,所以最后我们决定重新绘制一遍原理图。
在protues中画好原理图后,我们开始进行电路仿真。但仿真一开始,就立刻出现了问题,电路的分、秒显示和进位都正确,但是小时的计数功能在进制却有错误,出现了满7复0的情况,即状态为0→1→2→3→4→5→6→7→10→11→12→0。我们分析错误原因,观察仿真显示的高低电平,发现D触发器的输入没有任何变化,但输出却会自行变化,我们知道,因为D触发器的下一位输出状态是取决于上一位输入的,所以对于这一现象的发生完全不能理解,另外,74191计数器的状态转换也存在问题,当输出状态达到0111时,下一状态就会变成0000,即高位一直无法出现1状态。
在请教过老师之后,老师建议我们在仿真电路中添加示波器观察波形,于是我们在H11(74191计数器的Q1)、H12(74191计数器的Q2)、H13(74191计数器的Q3)和LD四处防止了示波器探针,并再次执行仿真,这一次我们通过观察波形发现了问题所在。
当0111转换为1000状态时,Q3从0变成1,Q0、Q1、Q2则应“同时”从1变成0,电路中出现了竞争冒险现象,而原本的进位信号是Q3=1,Q0=1,在状态改变的过程中出现了7直接进位的情况,而我们之前观察到的的触发器输入没有变化,输出却发生了变化的现象也找到了原因,是因为我们开始观察电平高低变化的方法无法显示出电路波形的跳变,即当信号快速变化又快速跳回时,肉眼是看不到电平有所变化的,而我们采用示波器就可以很明显地看到这一现象了。分析出电路问题原因后,我们也很快地找到了解决问题的方法,将原本的进位信号Q3=1,Q0=1改为Q3=1,Q2=0,Q1=0,Q0=1,这样只有四位到达稳定状态后,才会产生进位信号,再次仿真就发现功能已经可以正确实现了。
之后的仿真都比较顺利,在获得了正确的仿真结果后,我们心里也变得有底,觉得电路板焊接完成后应该也不会出现大的问题,但真正安装完成电路板进行调试时还是出现了一些问题。
调试的第一天上午,我们的电路板的功能基本还正确,但下午回来后再进行调试一段时间后,却发现数字钟的分突然不显示了,并且芯片U22发烫非常严重,后来我们找老师更换了一块芯片,发现数字钟工作一段时间之后芯片还是会微微发热,怀疑是电路哪里存在短路问题,但是测量芯片接地和连接VCC的管脚,发现电压是正常的,直观来看电路板的器件焊接也没有明显问题,所以一直也没有找到芯片发热的具体原因,好在之后的调试我们会时常留意U22的温度,没有再出现严重发烫的问题。
另外数字钟还有一个问题,就是整点报时功能不准确,到达1点时会报时12声,2点会报时1声,3点会报时2声等等,以此类推。我们分析认为,出现这种整点不准确的现象,原因应该是逻辑控制电路的与非门延时时间不够,也产生了竞争冒险现象,查询资料和讲义后我们觉得可以直接接入一个小电容,延长延时获得正确的报时数,在接入电容之后,这一问题得到了解决。
在板子的装调过程中,我们发现了之前电路的设计上存在一些细节问题,很多实际电路中可能存在的细节在先前的设计中没有考虑到。比如部分电容的封装选择不合适,导致焊接时接入不便,也影响了电路的美观,还有校时电路的滤波电容距离主体较远,对于抖动的消除作用很不明显,另外,定时电路的拨码开关排布也很不方便操作,我们定时电路拨码开关的排布十位个位顺序和表示某位数字的二进制高低位是相反的,导致调节定时时刻不方便等,这让我更加深刻地意识到,电路板的设计是一个不断调整不断完善的过程,需要考虑到各种实际情况,才能设计出美观实用的电路板。另外,我们在调试过程中不断的发现问题、寻找原因、探索解决方法,进一步完善电路板的功能,这一过程需要足够的耐心和严谨,有时解决一个问题需要尝试多种方法,寻找最佳方案,才能最终获得一个功能比较健全的电路板,获得一个自己满意的结果。
陈肖苇:
这次实验主要担任的工作是原理图主体部分以及两个扩展部分的绘制,PCB的全部设计以及修改过程,PCB的安装与焊接以及电路板的调试几个过程,下面我讲分块讲一下我在几个方面的心得体会:
PCB版图的设计与修改 为了节约时间考虑,所以在原理图绘制完成之后,PCB版图就和原理图的仿真同步进行了,但是由于一些细节上的原因,导致提前进行版图设计并没有很好的提高时间利用率。
PCB版图的绘制主要包括了元器件的导入与检查,排版,手动布线与自动布线,手动布线更改,以及原理图更改逻辑设计之后的大改和经过老师检查之后的大改几部分组成。
首先第一步就是进行元器件的导入,但是导入之后,经过元器件的对比检查之后,发现一些元器件的封装不对,或者是一些元器件甚至没有选择封装,于是经过了更改之后,继续进行下面的工作。
接下来,进行的是元器件的排版工作。首先最容易想到的就是将数码管显示器即数字钟的显示部分放到板子的最上方,这样可以一眼就看到整个电路的工作性质;其次就是想到了要将手动校时和闹钟开关等按键以及开关放在板子的最下面,方便进行操作;至于其它的部分,主要就是为了美观进行了一个相对整齐的排布,同时也留出了一定的空间,为以后的布线留下余地。当然,中间这一步并没有按照功能排布,仅仅是按照美观排布,为版子的功能实现埋下了隐患(虽然这个隐患经过老师指导后进行了大改,已经基本排除,但是修改的过程也是相当的复杂,以后尽可能要做到一步到位);其次,经过这一次的实践,发现当初元器件之间留下的空间对于这么大的一个工程来说还是相当有限的,以后对于空间要有更合理的把握。
图1:main_saved2(排好版)接下来,就是进行布线了。因为上一次的电子工程训练,我全部都是手动布的线,所以这一次是第一次尝试自动布线,结果发现自动布线速度这么快,看起来结果也很可靠,所以我还有一点惊喜,因为上一次布线所耗费的时间实在是太久了,下面就是布线之后的版图。
图2:main_saved3(第一次自动布线)然而这样的自动排版的最大的问题就是电源和地线过细,而且又不能直接批量修改,因为在内部的地方,直接修改会导致电路互联,引起短路。所以,我参考了一下别人设计的版图,于是设计成了将电源和地在外圈周围布线,然后通过横向的布线将电源和地导入到所需位置,经修改后的电路板如下:
图3:电源和地布完
上面这块板子算是我们第一版的最终版了,这是基于我们设计是正确的前提。几乎就在我布完线的同时,晓杰她们的仿真结果出来了,小时的翻转是不正确的,所以我们在讨论了之后,对小时控制电中的D触发器的输入逻辑进行了修改,然后加入了两个芯片,分别是74LS04的非门和74LS20的与非门。因为电路板内部没有空隙,所以考虑将两片芯片放在了右下角单独开出的一片小区域里。如下图:
图4:逻辑错误修改 修改完逻辑错误之后就产生了我们电路的第二版的最终版,然后就拿去给老师检查我们的板子有没有什么问题。经过检查之后,老师给我们指出了两个比较重要的设计失误,一个就是电源的四个滤波电容离电源太远,效果不好,二是晶振和14次分频器距离太远。于是回去之后我就将这两部分电路单独拿了出来,放在了右上方,改正了电路设计没有按功能排在一起的失误。修改后的部分如下图:
图5:修改后的电源电路
图6:修改后的晶振电路 经过以上三大步的修改,在对一些小的地方自动布线没有解决的错误进行修改之后,产生了我们上交的电路的最终版,如下
图7:最终上交版
在这份最终上交版中,经过老师的检查,还是发现了四处错误,分别是两根连线没有连上,以及两个过孔没有打通。这既是我当时检查不够仔细导致的问题,同时也是我不会使用DRC的原因,在电路板发下来之后,经过向老师请教,知道了如何用软件检查布线的结果,即DRC(design rule check 设计规则检查),极大的减少了以后出现这种细节性错误的可能性,也算是一种进步吧。
这块PCB板总共花了我一天的时间进行排版和布线,然后花了整整三天的时间,更改铜线的粗细,修改电源和晶振电路,然后还修改了四十多处没连上或者过孔没打通的错误,不得不说PCB的设计是一个集技术与耐心于一体的工作。四天的时间里让我对PCB的设计产生了更深刻的认识,包括电源和地的布线方式,模块化设计的方法以及DRC确认设计等等,同时也切身的体会到了自己经验的不足,也有了以后努力的方向。
调试过程中的经验谈
调试的具体过程已经附在上文的安装与调试环节了,所以在此就不再赘述了,这里简单讲一下在调试过程中所发现的一些设计上的注意事项以及小组成员沟通之间的注意事项。
在这次的调试中发现的主要的设计错误和不合理的地方有网络名在组员的原理图更改之后没有更新,闹钟的数值比较器比较的开关和计数器的二进制顺序相反,没有设计自启动,以及整点报时功能存在竞争冒险现象,以及按钮开关存在较大不确定性等问题。
其中,网络名的问题属于组内成员沟通问题,因为坐在一起,我们此次的交流基本上就是将原理图直接发给对方,然后口头告诉对方所更改的地方,然后对方再将所修改的地方直接复制过去。这种交流方式的优点当然就是交流效率非常高,但是缺点就是如果一次性有太多修改的时候,尤其是只是更改网络名,而没有更改其他设计的时候,容易被忽视。建议以后如果需要一个小组一起努力完成一个项目的话,每次都应该将自己修改过的地方写成文档,让其他成员按照文档修改,而且这样以后在调试的时候也有可以参考的文献。
而对于数值比较器的问题,设计的时候是按3210的数序进行高低比较的,但是拨码开关上的顺序是1234(错位的以为因为不影响正常的大脑译码,所以不考虑,即对人脑来说不论是3210,还是4321只要是连续的四位数,结果都是一样的),因此出现的问题就是逻辑上的高低和物理上的高低相反,因此对于单个拨码开关使用的时候,最高位在右边,要从右向左读数,增加了使用难度,而让用户违反常规思维使用,让用户适应产品的做法,是一款产品设计的非常大的缺陷,这也是以后在设计电子产品的时候要考虑的重要问题——在功能以及价格相同的时候,用户体验往往决定了产品的出路。
图8:拨码开关的设计问题
至于没有设计自启动,也是一个很严重的问题,虽说刚通电的时候,数字中可以处在任何有用的状态,但有时候进去就是10:62,这样还要通过校时30多秒才能进入正常的循环,这也是一个弊端。鉴于修改自启动问题需要对整个电路的逻辑进行修改,工作量很大,而且对电路整体功能影响不大,所以这一问题我们小组暂未修改,且经过所有其他调整之后,一般开机后会处于10:00(不稳定),已经不需要很长的校时调整。
至于整点报时不准确的问题,开始的时候我们以为是计数器少数了一个,或者是和电台报时重叠。但我仔细考虑了一下,认为事实并不是这样,因为怎么想也不觉得每次计数器都会少数,原因肯定在输入数据部分。结果接下来就发现了1点的时候报时是响12下,于是,我立马确定了错误是跟我想的一样,存在于输入部分,即输入部分存在竞争冒险——时钟脉冲到达时,对应的译码器因为众多门电路的延时还没有将新的状态传递过来,减法计数器的数据输入端还是上一个状态,然后当时钟到达时,置入了上一个状态,所以才存在报时的错位现象。修改的关键就是延迟时钟信号的到达,修改方案有加两级反相器或者加上一个电容进行延时,因在调试的时候加入反相器过于麻烦,选择了第二个方案,即加上一个电容进行延时。经过修改之后,整点报时功能正常,符合设计要求。
图9:整点报时的数据输入端最多经过了三段延时
最后,不得不说这么大的一个项目真的是对自己的一个锻炼,不仅仅开始的时候要进行逻辑设计和改错,要耗费那么长的时间进行一个PCB的设计和修改,要把一块漏洞百出的电路调试到正常状态,无论哪一步都很烧脑子,但是无论哪一步收获都很大。
我还要感谢我的两个可爱的组员,没有她们协助和付出,凭我一个人,很难在这么短的时间内完成这么一个产品设计开发的全过程。还要感谢王老师的指导,指出了我们电路设计的不合理的地方,并告诉了我们修改方式,并且因为之前我不会DRC,在板子加工之前还帮我们修正了四处设计错误,使我们调试过程中的工作量极大的降低。
附录:原始调试记录
调试日期:2016/7/17 早上来到,安装好芯片和拨码开关之后,我们就安上了电源,开始了调试过程。 UH2引脚错误(没错,是两个等效的网络)
开关与计数器大小顺序,对应拨码开关右侧为高位(对应问题) H1H2对应顺序等
开关没有防抖动,长按可正常调时(大部分),短按不确定 6,9不好看
电台报时和整点报时重叠 没有设计自启动
网络名不对(LD与LD1,外加飞线)下午调试:
1. 长按的不确定性
2. 分钟和小时按键互相影响 3. 版子震动会改变状态
4. 分钟不显示——390发烫——按键失灵——整点报时一直响——换掉芯片,恢复正常。5. 整点报时少一声(或许是重叠)
调试日期:2016/7/18 接着昨天的进行调试,认为需要修改的主要存在以下三个方面 U22即74LS390存在发热现象
整点报时存在错位现象(加电容延时)
按钮开关存在抖动现象,长按正常,短按不确定(怀疑是版子震动问题,换成拨码开关并固定住版子,功能正常)
设计的不合理:
拨码开关方向,按钮开关,闹钟开关
因未出现乱码问题,所以开关上没有出现对应功能的提示,这也是一个很大的遗憾。
AD布线
1.交互式布线:小键盘上的星号;或者shift+ctrl+滚轮 2.先自动布线,后手动布线 3.电源和地绕圈布线
1.PCB板留白问题——方便修改
2.电源和地的双层布线问题——分不同层,同时绕圈,区分纵横
3.模块化设计的重要性——同一功能的元件尽量放在一起,尤其是电源,晶振等地方的电容,不然就没用惹。
4.布线查错:design——DRC——右下角message——下方窗口
小组分工:
李晓杰:答辩展示,闹钟电路原理图绘制,电路行为仿真,原理图修改,电路调试 张晨靖:答辩PPT制作,电路行为仿真,原理图修改,电路调试 陈肖苇:答辩展示,原理图主体部分及整点报时和仿电台报时部分绘制,PCB排版布线,PCB版修改,PCB版焊接,电路调试
第五篇:北航_电子实习_数字部分实验报告
报告名称:电子电路设计训练数字部
分
学院:仪器科学与光电工程学院
目录
实验报告概述:...............................................................................................................3
一、选做实验总结:.................................................................................................3(1)补充练习2:楼梯灯设计.............................................................................3(2)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序...................................................................................................................5(3)(4)(5)
二、(1)(2)(3)(4)(5)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形..................6 练习题4:运用always块设计一个8路数据选择器......................................6 练习题5:设计一个带控制端的逻辑运算电路.............................................7 练习一:简单组合逻辑设计.........................................................................7 练习三:利用条件语句实现计数分频失序电路.............................................7 练习四:阻塞赋值与非阻塞赋值得区别.......................................................8 练习五:用always块实现较复杂的组合逻辑电路........................................8 练习六:在verilog HDL中使用函数..............................................................9 必做实验总结:.................................................................................................7(6)练习七:在verilog HDL中使用任务..............................................................9(7)练习八:利用有限状态机进行时许逻辑设计..............................................10
三、实验总结及体会:............................................................................................10
四、选作程序源代码...............................................................................................11(1)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形................11(2)练习题4:运用always块设计一个8路数据选择器....................................12(3)练习题5:设计一个带控制端的逻辑运算电路...........................................13(4)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序.................................................................................................................14(5)补充练习2:楼梯灯设计...........................................................................16
图表目录
Figure 1 楼梯灯任务4..............................................................................................5 Figure 2 组合逻辑.....................................................................................................5 Figure 3 时序逻辑.....................................................................................................6 Figure 4 周期波形....................................................................................................6 Figure 5 8路数据选择器..........................................................................................6 Figure 6 逻辑运算电路.............................................................................................7 Figure 7 组合逻辑设计.............................................................................................7 Figure 8 计数分频时序电路......................................................................................8 Figure 9 阻塞赋值与非阻塞赋值得区别....................................................................8 Figure 10 always块组合逻辑电路.............................................................................9 Figure 11 使用函数..................................................................................................9 Figure 12 使用任务................................................................................................10 Figure 13 有限状态机............................................................................................10
电子电路设计训练(数字部分)实验报告
实验报告概述:
本实验报告为对四次电子电路设计训练(数字部分)实验的总结,主要包括以下四部分:
第一部分为选做实验总结,主要包括每个选择实验的设计思路、运行结果、注意事项、心得体会;
第二部分为必做实验总结,包括运行结果、总结、心得体会; 第三部分为课程总结和体会,是对全部实验及课程的总结; 第四部分为选做实验部分源代码;
一、选做实验总结:
(1)补充练习2:楼梯灯设计
设计思路:
本题给出楼梯的运行规则,并分别给与四个相应任务进行编程设计,考虑到程序的通用性及FPGA高速并行处理的优点,主要思路如下:
根据运行规则(8s内和大于8s等),对每个灯的相应状态进行编程,设计时序逻辑及有限状态机;由于在总体上看,每个灯的状态变化相对独立(只有一个人上楼除外),故对每个灯编程所得到的程序代码可通用于其它灯(只需要改变相应寄存器定义即可),此即为灯控制模块,对4个不同的任务,只需设计其它部分判断逻辑,即可完成任务要求;如此设计,可大大提高程序设计效率、易用性,同时如果面对更多的灯控制需要,也可快速进行修改部署。
下面针对不同任务给出不同处理方法:
任务1/任务3:由于任务1和任务3在定义上有很大相同点,比如同样是一个人走楼梯,若不考虑一个人同时在两层使两个灯亮,则事实上就是一个人始终只能使一盏灯亮,亮起后盏时熄灭前一盏;在保持每个灯控制模块不改变的情况下,利用非阻塞赋值,判断该人目前所处状态及位置(上楼/下楼,楼层),同时规定输出,同时只能亮一盏灯;
任务2:由于输入信号已被赋值给寄存器变量,此时只需在系统时钟作用下对寄存器中输入变量进行判断,满足要求即为正确信号,再输入灯控制模块;
任务4:由于已有灯控制模块,此时只需结合任务2防抖电路,直接输出状态信号所对应的结果即可;
(单个)灯控制模块代码:
always @(posedgeclk)begin signal_test[0]<=signal[0];if(signal_test[0]==signal[0])
begin
i0=i0+1;
end else
i0=0;if(i0>=5)
begin signal_reg[0]=signal[0];
end
if(state0==light_off)
begin
k0=0;
k0a=0;
k0b=0;
end else
k0=k0+1;
case(signal_reg[0])
1: if(!reset)
begin
state0=light_off;
end
else
begin
k0a=k0a+1;*分栏显示,详细代码见报告第四部分;
运行结果:
if((k0a >= 79)&&(k0<=119))
state0=light_on12;
else
state0=light_on8;
end
0:if(!reset)
begin
state0=light_off;
end
else if(k0a==0)
state0=light_off;endcase
case(state0)
light_off:light_reg[0]=0;
light_on8:
begin light_reg[0]=1;
if(k0b==79)
state0=light_off;
else
k0b=k0b+1;
end
light_on12:
begin
light_reg[0]=1;
if(k0b==119)
state0=light_off;
else
k0b=k0b+1;
end endcase end
Figure 1楼梯灯任务4
Figure 2楼梯灯信号防抖部分放大结果
(2)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序
设计思路:
纯组合排序中,设计sort排序任务对数列中的元素进行排序,通过调用任务实现对不同元素的排序功能,并将排序完成的结果直接输出;
冒泡排序即为每次将两个相邻数进行比较,大的数后“浮”,每一趟比较获得较大值并置于数列末位;
根据题目要求,每比较一次,即将调换位置的数字进行输出;同样设计sort任务,对两数字进行比较并排序;
通过排序控制和逻辑判断代码,控制sort任务的有效调用,进而实现冒泡排序功能;
根据设计要求,程序中只设计有一个输入端口,通过对输入信号不断移位,模拟串并行信号转换,从而完成穿行输入,并行比较的功能;
运行结果:
Figure 3组合逻辑
Figure 4时序逻辑
(3)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形
设计思路:
对输入时钟进行计数,通过if语句进行判断,若满足判断条件,则按要求改变输出信号;如此循环往复,即可产生所需单周期形状的周期波形;
运行结果:
Figure 5周期波形
(4)练习题4:运用always块设计一个8路数据选择器
设计思路:
利用define宏定义预先定义,利于后期程序功能的扩充和调整;同时利用case语句判断信号,并将相对应信号输出,进而完成系统目标功能;
运行结果:
Figure 68路数据选择器
(5)练习题5:设计一个带控制端的逻辑运算电路
设计思路:
设计三个函数分别完成三个要求的计算,通过函数调用实现相应功能;设计的控制端为同步控制端,需要通过时钟信号从而进行检测复位;
运行结果:
Figure 7逻辑运算电路
二、必做实验总结:
(1)练习一:简单组合逻辑设计
语法要点:
Assign语句构成的组合逻辑电路,若输入a,b改变,则输出equal;
利用assign equal=(a==b)?1:0语句,可同时完成判断赋值功能,大大减少代码量; 运行结果:
Figure 8组合逻辑设计
(2)练习三:利用条件语句实现计数分频时序电路
语法要点:
此程序主要练习了对输入时钟进行计数,判断,从而实现分频输出;
在实际应用中,可以通过该方式获得不同占空比或频率的信号供系统使用;
课本程序问题修改:
课本测试程序中未定义F10M_clk变量,故应将测试程序fdivision_TOP中出现的该变量改为已定义的F10M;
运行结果:
Figure 9计数分频时序电路
(3)练习四:阻塞赋值与非阻塞赋值的区别
语法要点:
阻塞赋值呈现的是一种立即赋值的状态,即同一个变量在前后语句中用到,语句间的顺序会影响到输出的结果;
非阻塞赋值对每一个块中语句间的相对位置没有要求,只在该块语句全部运行完成后同一进行赋值;
运行结果:
Figure 10阻塞赋值与非阻塞赋值得区别
(4)练习五:用always块实现较复杂的组合逻辑电路
语法要点:
Always@实现了对若干输入信号的敏感,即只要有一个信号改变,输出即改变; 通过case语句,实现了选择性输出,对不同功能进行综合;
运行结果:
Figure 11 always块组合逻辑电路
(5)练习六:在verilog HDL中使用函数
语法要点:
函数最基本功能即实现计算,通过对不同函数定义,实现不同的计算功能;同时定义函数,可以利于在该模块外对某函数功能的调用,增强了程序的通用性和功能性,同时可以使程序结构更加清晰,易读易懂;
运行结果:
Figure 12使用函数
(6)练习七:在verilog HDL中使用任务
语法要点:
相比函数,任务的调用功能更强大,可以实现运算并输出多个结果的功能,同时任务并不返回计算值,只通过类似C语言中的形参和实参的数据交换,实现功能;任务的定义和调用可
以只程序结构更明晰,功能更丰富;
程序中通过对比较顺序的设计,实现了对4个数字,进行5次比较即可成功完成排序功能的目的;
运行结果:
Figure 13使用任务
(7)练习八:利用有限状态机进行时许逻辑设计
语法要点:
设计有限状态机主要需要进行状态分配,状态编码,然后利用case语句进行判断,从而改变相应状态,实现状态转移和输出变换;
对涉及时钟的一般时序逻辑,主要运用非阻塞(〈=)赋值完成功能;
课本程序问题修改:
在modelsim 10中,测试文件时钟无法仿真,故只能保持与课本测试文件相同的思路,重新编写测试文件,仿真结果如下,与课本完全一致;
运行结果:
Figure 14有限状态机
三、实验总结及体会:
通过半个学期的学习和实验,我初步掌握了verilogHDL语言和modelsim软件,可以通过编程实现数字电路基础中几乎全部简单逻辑芯片的功能,同时可以用编程实现相对复杂一点的逻辑电路和功能.总体而言,四次实验内容相对简单,几乎是在课后实验的基础上稍稍做了提高,以利于我们掌握并巩固课上学习的知识。有几个课后实验内容,按照程序输入后无法进行波形仿真,在改正一些错误定义,或者重写测试程序后,都能顺利完成实验任务。通过实验上机,巩固了我们的理论知识,加强了实际运用的能力,对整个课程的学习起到了很好的作用。
最后一个补充实验相对复杂,但实现的方法却可以有很多,在实际写代码前进行构思分析,在这个实验中显得尤为重要,例如,如何发挥FPGA并行处理的能力,如何提高程序的通用性,能够将所设计的模块结构同时完成四个任务,如何设计代码提高效率的同时节省硬件资源„„都是在设计构思中不得不考虑的环节,因此,通过最后一个实验的设计,能够很好的锻炼我们解决实际生活中问题的能力,使我们对所学的知识能够真正有所使用。
运用verilog HDL语言进行硬件电路设计,已成为未来电路设计的主要趋势,学习这门语言及相应软件,能够帮助我们在以后的学习及科研中,大大提高我们的效率,使我们能够快速搭建实验平台,完成目标功能。
虽然8周的课,时间相对较短,但通过这8周的学习,我对verilog HDL语言有了全面的认识,对基本的语法都有了很好的掌握,虽然时间有限,不能对verilog HDL语言有更深入的认识,但通过这8周的学习,我为我将来进一步深化使用这个工具打下了坚实的基础。
四、选作程序源代码(1)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形 主程序:
module fdivison_2(RESET,F10M,clk_out,j);input F10M,RESET;output clk_out;output[12:0] j;
regclk_out;
reg[12:0] j;always @(posedge F10M)begin if(!RESET)begin clk_out<=0;j<=0;end
else begin if(j==199)
begin
j<=j+1;clk_out<=1;
end
else if(j==299)
begin
j<=j+1;clk_out<=0;
end
else if(j==499)
j<=0;
else j<=j+1;end end
endmodule
output[3:0] out;
reg[3:0] out;
always @(a or b or c or d or e or f or g or h or selet)
begin
case(selet)
`s1:out=a;
`s2:out=b;
`s3:out=c;
`s4:out=d;
`s5:out=e;
`s6:out=f;
`s7:out=g;
`s8:out=h;default:out=4'hz;endcase
end
endmodule
测试程序: `timescale 1 ns/1 ns
module muxtest;
wire[3:0] out;reg[3:0] a,b,c,d,e,f,g,h;reg[2:0] selet;
parameter times1=8;
initial
begin
a=0;
b=1;
c=2;d=3;
e=4;
f=5;
g=6;
h=7;selet=3'h0;
repeat(5)测试程序:
`timescale 1ns/100ps `define clk_cycle 50 module TOP_2;reg F10M,RESET;wire clk;wire[12:0] j;always #`clk_cycle
F10M = ~F10M;
initial
begin
RESET=1;
F10M=0;
#100 RESET=0;
#100 RESET=1;
#10000 $stop;
end
fdivison_2 fdivison_2(.RESET(RESET),.F10M(F10M),.clk_out(clk),.j(j));
endmodule
(2)练习题4:运用always块设计一个8路数据选择器
主程序: `define s1 3'd0 `define s2 3'd1 `define s3 3'd2 `define s4 3'd3 `define s5 3'd4 `define s6 3'd5 `define s7 3'd6 `define s8 3'd7
module mux_8(a,b,c,d,e,f,g,h,selet,out);
input[3:0] a,b,c,d,e,f,g,h;
input[2:0] selet;
begin
#100 selet=selet+1;
end
selet=0;repeat(times1)
begin
#100 selet=selet+1;
a={$random}%16;
b={$random}%16;
c={$random}%16;
d={$random}%16;
e={$random}%16;
f={$random}%16;
g={$random}%16;
h={$random}%16;
end
#100 $stop;
end
mux_8 m0(a,b,c,d,e,f,g,h,selet,out);endmodule
(3)练习题5:设计一个带控制端的逻辑运算电路
主程序:
`define sqrR 4'd0 `define triR 4'd0 `define factR 4'd0
module sqr(a,reset,clk,sqr_out,tri_out,fact_out);
input[3:0] a;input reset,clk;output[7:0] sqr_out,tri_out,fact_out;reg[7:0] sqr_out,tri_out,fact_out;
always @(posedgeclk)begin
if(!reset)
{sqr_out,tri_out,fact_out}={`sqrR,`triR,`factR};
else
begin
sqr_out=sqr_cal(a);tri_out=tri_cal(a);fact_out=fact_cal(a);
end end
function[7:0] sqr_cal;
input[3:0] a;
begin sqr_cal=a*a;
end endfunction
function[7:0] tri_cal;
input[3:0] a;
begin tri_cal=a*a*a;
end endfunction
function[7:0] fact_cal;
input[3:0] a;
begin
if(a>5)fact_cal=0;
else
begin
case(a)
0:fact_cal=1;
1:fact_cal=1;
2:fact_cal=2;
3:fact_cal=6;
4:fact_cal=24;
5:fact_cal=120;endcase
end
end endfunction
endmodule
测试程序:
`timescale 1 ns/100 ps `define clk_cycle 50
module sqrTEST;
reg[3:0] a,i;regreset,clk;
wire[7:0] sqr_out,tri_out,fact_out;
initial
begin clk=0;
a=0;
reset=1;
#100 reset=0;
#100 reset=1;
for(i=0;i<=6;i=i+1)
begin
#200 a=i;
end
#100 $stop;
end
always #`clk_cycleclk=~clk;
sqr m(a,reset,clk,sqr_out,tri_out,fact_out);
endmodule
(4)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序
组合逻辑实现程序:
module bub(ai,bi,ci,di,ao,bo,co,do);
input[7:0] ai,bi,ci,di;output[7:0] ao,bo,co,do;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n;
parameter so=4;
//
always @(ai or bi or ci or di)begin
{ar,br,cr,dr}={ai,bi,ci,di};
for(n=so;n>1;n=n-1)
//
bb(ar,br,cr,dr,n);
{ao,bo,co,do}={ar,br,cr,dr};end
task bb;
// inout[7:0] x1,x2,x3,x4;
input[3:0] n;
// reg[7:0] temp;reg[3:0] s;
if(n>0)
for(s=1;s begin case(s) 1:sort2(x1,x2);2:sort2(x2,x3); 3:sort2(x3,x4);endcase end endtask task sort2;inout[7:0] x,y;reg[7:0] temp; if(x>y) begin temp=x; x=y; y=temp; end endtask endmodule 组合逻辑测试程序: `timescale 1 ns/100 ps module bubTEST;reg[7:0] ai,bi,ci,di;wire[7:0] ao,bo,co,do; initial begin ai=0;bi=0;ci=0;di=0; repeat(4) begin #100 ai={$random}%256; bi={$random}%256; ci={$random}%256; di={$random}%256; end #100 $stop; end bub m0(ai,bi,ci,di,ao,bo,co,do); endmodule 时序逻辑实现程序: module bub_1(in,clk,ar,br,cr,dr,ao,bo,co,do); input[7:0] in;input clk;output[7:0] ao,bo,co,do;output[7:0] ar,br,cr,dr;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n,s,q; parameter so=4; initial begin n=0; s=0; q=0; end always @(posedgeclk)begin if(n<=so) begin n=n+1;ar<=in;br<=ar;cr<=br;dr<=cr; end if(n==so+1) begin n<=so+2; s<=so; q<=1; end if(s>1) begin {ao,bo,co,do}<={ar,br,cr,dr}; if(q begin case(q) 1:sort2(ar,br); 2:sort2(br,cr); 3:sort2(cr,dr);endcase q<=q+1; end else begin s<=s-1; q<=1; end end end task sort2;inout[7:0] x,y;reg[7:0] temp; if(x>y) begin temp=x; x=y; y=temp; end endtask endmodule 时序逻辑测试程序: `timescale 1 ns/100 ps module bubTEST_1;reg[7:0] in;regclk; wire[7:0] ao,bo,co,do,ar,br,cr,dr; initial begin clk=0; in=0; begin repeat(4) #100 in={$random}%256; end #100 $stop; end always #50 clk=~clk; bub_1 m0(in,clk,ar,br,cr,dr,ao,bo,co,do); endmodule (5)补充练习2:楼梯灯设计 主程序: module final2(signal,reset,clk,light); input[2:0] signal; input reset,clk; output[2:0] light; reg[2:0] signal_reg,light_reg,light_test,signal_test; reg[11:0] k0,k1,k2,k0a,k1a,k2a,k0b,k1b,k2b; reg[1:0] state0,state1,state2; reg[3:0] i0,i1,i2; parameter light_off=2'b00,light_on8=2'b01,light_on12=2'b10;initial begin k0=0;k1=0;k2=0; k0a=0;k1a=0;k2a=0; k0b=0;k1b=0;k2b=0; i0=0;i1=0;i2=0;light_reg=3'b000; state0=light_off; state1=light_off; state2=light_off;signal_reg=0;signal_test=signal;end // // always @(posedgeclk)begin signal_test[0]<=signal[0];if(signal_test[0]==signal[0]) begin i0=i0+1; end else i0=0;if(i0>=5) begin signal_reg[0]=signal[0]; end if(state0==light_off) begin k0=0; k0a=0; k0b=0; end else k0=k0+1; case(signal_reg[0]) 1: if(!reset) begin state0=light_off; end else begin k0a=k0a+1; if((k0a >= 79)&&(k0<=119)) state0=light_on12; else state0=light_on8; end 0:if(!reset) begin state0=light_off; end else if(k0a==0) state0=light_off;endcase case(state0) light_off:light_reg[0]=0; light_on8: begin light_reg[0]=1; if(k0b==79) state0=light_off; else k0b=k0b+1; end light_on12: begin light_reg[0]=1; if(k0b==119) state0=light_off; else k0b=k0b+1; end endcase end always @(posedgeclk)begin signal_test[1]<=signal[1];if(signal_test[1]==signal[1]) begin i1=i1+1; end else i1=0; if(i1>=5) begin signal_reg[1]=signal[1]; end if(state1==light_off) begin k1=0; k1a=0; k1b=0; end else k1=k1+1; case(signal_reg[1]) 1: if(!reset) begin state1=light_off; end else begin k1a=k1a+1; if((k1a >= 79)&&(k1<=119)) state1=light_on12; else state1=light_on8; end 0:if(!reset) begin state1=light_off; end else if(k1a==0) state1=light_off;endcase case(state1) light_off:light_reg[1]=0; light_on8: begin light_reg[1]=1; if(k1b==79) state1=light_off; else k1b=k1b+1; end light_on12: begin light_reg[1]=1; if(k1b==119) state1=light_off; else k1b=k1b+1; end endcase end // // always @(posedgeclk)begin signal_test[2]<=signal[2];if(signal_test[2]==signal[2]) begin i2=i2+1; end else i2=0;if(i2>=5) begin signal_reg[2]=signal[2]; end if(state2==light_off) begin k2=0; k2a=0; k2b=0; end else k2=k2+1; case(signal_reg[2]) 1: if(!reset) begin state2=light_off; end else begin k2a=k2a+1; if((k2a >= 79)&&(k2<=119)) state2=light_on12; else state2=light_on8; end 0:if(!reset) begin state2=light_off; end else if(k2a==0) state2=light_off;endcase case(state2) light_off:light_reg[2]=0; light_on8: begin light_reg[2]=1; if(k2b==79) state2=light_off; else k2b=k2b+1; end light_on12: begin light_reg[2]=1; if(k2b==119) state2=light_off; else k2b=k2b+1; end endcase casex(light_reg) 3'b000:light_test=000; 3'b001:light_test=001; 3'b01x:light_test=010; 3'b1xx:light_test=100;endcase end assign light=light_test;endmodule 测试程序: `timescale 10ms/10ms module final_TOP2;reg[2:0] signal;regclk,reset; wire[2:0] light; initial begin clk=0; reset=1; #2 reset=0; #10 reset=1; #10 signal=3'b111; #10 signal=3'b000; #900 signal=3'b111; #100 signal=3'b000; #900 signal=3'b011; #100 signal=3'b000; #900 signal=3'b001; #900 signal=3'b000; #100 $stop;end always #5 clk=~clk; final2 m(signal,reset,clk,light);endmodule