资源描述
北邮数电实验报告4人表决器-北邮电子4多人乘车,分段计价。5自拟其他功能。二、设计思路与构造框图1.设计思路图1 构造框图由构造框图可以分析p 得出,该系统的的主体是计数控制器。该系统由外部控制载客控制信号和等待控制信号,以时钟信号的翻转为计数根据,完成对时间、里程和费用的计数,并将结果通过数码管译码电路显示出来。该系统的控制信号可由拨码或按键输入,时钟由开发板内部时钟分频得出,输出有点阵输出和数码管输出。因此,可将系统分为分频器、计数控制器、数码管译码和显示以及点阵显示四局部。并以此得出系统的逻辑框图如下:图2 逻辑框图2.控制器局部的状态转移图该控制器一共有三个根本状态: 空驶状态、载客状态和等待状态。分别由v 、和w 来进展控制。三、分块电路和总体电路设计一总体电路设计图3 状态转移图整体电路由数码管译码电路、转换电路、点阵译码电路、技术控制电路、分频电路五局部构成。分频电路将开发板内部的50MHz 时钟分为500hz 供应数码管和点阵、1Hz(控制器计时) 、0.5Hz 行驶路程计费、0.3Hz 等待时间计费以及用于进步分频效率的其他假设按频率。计数控制电路由四局部构成,整体完成行驶间隔 的计数、等待时间的计数以及费用的计数。输出为三组十位二进制数。转换电路有转换数据类型和在数码管上分时显示两个功能。首先将输入的十位二进制数转换为4位十进制数,并且利用除法和取余数的运算提取出个位、十位、百位、千位,并转换为四位二进制BCD 码。其次利用0.5hz 的时钟,将行驶里程、等待时间、计费金额以2秒为周期依次out14,供应数码管以便分时显示。数码管译码电路以500HZ 实现动态扫描,并将转换电路输出的5组BCD码依次译码,完成显示。点阵译码器根据载客控制信号,分别显示“O ”、“ ”静态图案。二分块电路设计 1.分频器以100分频为例1.1 电路模块 1.2 关键代码ENTITY div100 IS PORT(clk100 : IN STDLOG; - clear: IN STDLOG;clk1: OUT STDLOG); -END div100;ARCHITECTURE a100 OF div100 ISSIGNAL tmp100: INTEGER RANGE 0 TO 99; -BENp1:PROCESS(clear,clk100) -p1 BENIF clear =“0” THEN tmp100ELSIF clk100“event AND clk100=”1“ THEN IF tmp100=99 THEN tmp100tmp100END PROCESS p1;clk100 :输入时钟clear : 复位端 clk1 : 输出时钟 输入时钟 输出时钟 计数信号 进展100进制的计数p2:PROCESS(clk100) -p2输出占空比为50的新时钟 BENIF clk100”event AND clk100=“1” THEN IF tmp10049 THEN clk1clk1END PROCESS p2; END a100;1.3仿真波形图5 20分频仿真波形图6 5分频仿真波形2.计数控制器2.1 电路模块计数控制器由四局部组成,输入为三个不同频率的时钟、载客控制信号v 和等待控制信号w 。control1完成里程的计数cd 和行驶费用cm1,control2完成等待时间ct 的计数和等待开场计费ct5s信号outt ,control3接收到outt 后输出为等待时间的计费cm2,control4为总费用cm1+cm2+燃油附加费1图7 电路控制器设计关键思想是将费用、行驶里程、等待时间三个计数过程分开处理,并且将行驶计费和等待计费也分开处理。通过载客信号v 、等待信号w 分别触发不用的进程完成计数。因为行驶过程中每两秒1公里,每公里两元,等待过程中每三秒1元,因此分别用1hz 、0.5hz 、0.33hz 的时钟完成计时、计费、记里程。2.2 模块control1 2.2.1 电路模块行驶里程计数cd 和行驶计费cm12.2.2 关键代码ENTITY control1 IS PORT(clk2: IN STDLOG; -输入是0.5Hz 的时钟 v: IN STDLOG; -载客控制输入信号 w: IN STDLOG; -等待信号cm1: OUT STDLOGVECTOR(9 DOWNTO 0); -里程计费 cd: OUT STDLOGVECTOR(9 DOWNTO 0) ); -行驶间隔 END control1 ;ARCHITECTURE c OF control1 ISSIGNAL temp1: STDLOGVECTOR(9 DOWNTO 0) ;SIGNAL tempcm: STDLOG; BENp1:PROCESS(clk2,v,w) -p1里程计数 BENIF (clk2“event and clk2=”1“) THENIF v=”0“ THEN -v=0时重新计数 temp1ELSIF w=”1“ THEN -开场等待时里程保持不变 temp1ELSE temp1p2:PROCESS(clk2,temp1) BENIF (clk2”event and clk2=“1”) THENIF temp1ELSE cm1cdEND PROCESS p2; END c;2.3 模块control2 2.3.1电路模块等待时间计数ct 和等待开场计费信号outt ct5s2.3.2关键代码ENTITY control2 IS PORT(clk1: IN STDLOG; -输入是1Hz 的时钟 v: IN STDLOG; -载客控制输入信号 w: IN STDLOG; -等待信号outt: out STDLOG; -假设大于5秒,输出1ct: out STDLOGVECTOR(9 DOWNTO 0);-等待时间输出 END control2 ;ARCHITECTURE c OF control2 IS SIGNAL tempt: STDLOGVECTOR(9 DOWNTO 0) ; SIGNAL temp1: INTEGER RANGE 0 TO 999; BENp3:PROCESS(clk1,v,w) -累加等待时间 BENIF (clk1“event and clk1=”1“) THEN IF v=”0“ THENtemptELSIF w=”0“ THEN -行驶时保持状态 tempttemp1ELSE temptIF temp14 THEN -大于5秒时outt=1 outtEND IF;END IF; END PROCESS p3;p4:PROCESS(clk1,tempt) -将信号赋给输出ct BENctEND PROCESS p4; END c;2.4 模块control3 2.4.1电路模块当输入outt 为1时,开场计数 cm2为等待时间计费2.4.2关键代码ENTITY control3 IS PORT(clk3: IN STDLOG; -输入是0.3Hz 的时钟outt: IN STDLOG; -为1时,等待时间大于5s v: IN STDLOG; -载客控制输入信号 w: IN STDLOG; -等待信号cm2: out STDLOGVECTOR(9 DOWNTO 0);-等待计费 END control3 ;ARCHITECTURE c OF control3 ISSIGNAL tempm: STDLOGVECTOR(9 DOWNTO 0) ; BENp5:PROCESS(clk3,outt,v,w) BENIF outt=”1“THEN -大于5秒时开场计费 IF (clk3”event and clk3=“1”) THEN IF v=“0” THENtempmELSE tempmEND PROCESS p5;p6: PROCESS(clk3,tempm)BENIF V=“0” THENcm2cm2END PROCESS p6; END c;2.5 control4 2.5.1 电路模块将等待计费cm2和行驶计费cm1相加,并加上燃油费1元,得到总费用cm2.5.2 关键代码ENTITY control4 IS PORT(clk2: IN STDLOG; -输入是0.5Hz 的时钟 v: IN STDLOG; -载客控制输入信号 cm1: in STDLOGVECTOR(9 DOWNTO 0);-行驶费用 cm2: in STDLOGVECTOR(9 DOWNTO 0); -等待费用cm: out STDLOGVECTOR(9 DOWNTO 0);-总费用 END control4 ;ARCHITECTURE c OF control4 IS BENp5:PROCESS(clk2,v) BENIF (clk2“event and clk2=”1“) THEN IF v=”0“ THEN cmEND PROCESS p5; END c;2.6控制计数局部的总仿真波形图8 控制计数器仿真波形3.转换器3.1 电路模块由三个输入:行驶间隔 cd 、等待时间ct 、计费金额cm输出out1-5为四位二进制BCD 码实现功能:将十位二进制数按照位数转为为BCD 码3.2 关键代码ENTITY transform IS PORT(clk: IN STDLOG; -0.5hz的时钟 v: IN STDLOG; cd: in STDLOGVECTOR(9 DOWNTO 0);-行驶间隔 ct: in STDLOGVECTOR(9 DOWNTO 0); -等待时间 cm: in STDLOGVECTOR(9 DOWNTO 0) ;-总费用 out1: out stdlogvector(3 downto 0) ;-输出个位 out2: out stdlogvector(3 downto 0); -输出十位 out3: out stdlogvector(3 downto 0); -输出百位 out4: out stdlogvector(3 downto 0); -输出千位out5: out stdlogvector(3 downto 0); -输出ABC END transform ;ARCHITECTURE c OF transform ISsignal cc : integer range 0 to 1023 ;signal t : stdlogvector(1 downto 0) ; signal q1,q2,q3:integer range 0 to 1000; BENp1:PROCESS(clk,v) -p1进展3进制的计数 BENIF (clk”event and clk=“1”) THEN IF v=“0” THEN telsif t=“00” then telsif t=“01” then telsif t=“10” then telse tEND IF;END IF;END PROCESS p1; p2:process(clk,t) BENif (clk“event and clk=”1“) thenCASE t is -实现分时显示when ”00“ = cc cc cc ccq1q3out1end process p2; END c;4.数码管译码电路4.1电路模块4.2关键代码ENTITY shumaguan IS PORT(clk1: IN STDLOG; 500hz数码管扫描时钟 out5,out4,out3,out2,out1: IN STDLOGVECTOR(3 DOWNTO 0); g:OUT STDLOGVECTOR(6 DOWNTO 0); cat:OUT STDLOGVECTOR(5 DOWNTO 0); END shumaguan;ARCHITECTURE a OF shumaguan ISSIGNAL tmpg:STDLOGVECTOR(6 DOWNTO 0); SIGNAL tmpn:STDLOGVECTOR(3 DOWNTO 0); SIGNAL tmpc:INTEGER RANGE 0 TO 5; BENp1:PROCESS(clk1) -六进制计数 BENif(clk1”event and clk1=“1”)thenif tmpc = 5 then tmpctmpcEND PROCESS p1;p2:PROCESS(clk1) -数码管选通轮流显示 BENif(clk1“event and clk1=”1“)then -将个位、十位等赋给各个数码管 case tmpc isWHEN 0 = tmpn tmpn tmpn tmpnWHEN 5 = tmpn tmpnEND PROCESS p2;p3:PROCESS(tmpn) -译码电路 BENCASE tmpn ISWHEN”0000“= tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg5.点阵译码电路5.1电路模块5.2关键代码 ENTITY dz is PORT(clk500: IN STDLOG; v : IN STDLOG;row : OUT STDLOGVECTOR(7 DOWNTO 0); -行col : OUT STDLOGVECTOR(7 DOWNTO 0); -列 END dz;ARCHITECTURE a OF dz ISSIGNAL tmprow:STDLOGVECTOR(7 DOWNTO 0); SIGNAL tmpcol:STDLOGVECTOR(7 DOWNTO 0); benprocess(v,clk500) benif (clk500”event and clk500=“1”)then if v = “0”then case tmpcol isWHEN= tmpcol tmpcol tmpcol tmpcol tmpcol tmpcol tmpcol tmpcol tmpcolcase tmpcol isWHEN= tmpcol tmpcol tmpcol tmpcol tmpcol tmpcolWHEN= tmpcolWHEN= tmpcol tmpcol5.3仿真波形图9 空载时显示“”图10 载客时显示“ ”四、实现功能说明1,实现功能实现计时、计里程、计费功能数码管可分时显示行驶间隔 、费用、等待时间 点阵显示载客和空载状态 2.器材的资占用情况图11 编译报告图 逻辑元件表由图11可得:本电路一共用了576个逻辑元件,占总逻辑元件数的45,总管脚数37,占总管脚的32。由图看到,除了transform 模块之外,各模块占用资均不大。transform模块因为用到了除法、取余数等运算。因此占用资较多,应在后期进展优化,降低资利用率。3.仿真波形图见电路分析p 局部 4.必要的测试方法控制计数器整体仿真 控制器与转换器整体仿真 数码管赋值检查是否显示故障时中间接输出,并且管脚设置为LED 灯,看是否正常传输五、故障与问题分析p 1计数显示不正确,有延迟 解决方法:在控制计数器内部,将组合逻辑局部和计数局部分到不同的进程,防止在时序进程出现大量运算,造成延迟。2计数时采用十位二进制计数,无法逐位读取,赋给各个数码管解决方法1:先将二进制转为十进制,再利用除法和取余数运算得到各位数 值改动小,但运算量大,占用资多2:计数时改为逐位计数,后一位满十后向前一位进1改动大,但 运算量减少3仿真时计数器正常工作,但下载到板子时一直显示为0,无法确定是计数器的问题还是数码管的问题解决方法:将计数器的一个输出作为LED 的输入,发现LED 不亮,说明控制器有问题。后来经过检查发现是原理图连接有误六、总结和结论这次数字电路综合实验是一次将理论、实验与现实应用结合在一起的实验。当第一次课拿到题目时,我感觉无从下手,几乎没有思路。但当三周后我根本完成了实验任务时,却又觉得整个电路构造无比明晰,甚至知道我的方案哪里做得好、哪里做得不好。在这三周的时间里,我觉得我有如下的收获: 1.根底知识与动手操作并重 由于我觉得自己根底不好,又加上是上学期的内容,因此在拿到题目后我并没有立即动手做,而是完好地阅读了一编实验教材,并且认真做了笔记。在之后的设计中,无论是对于详细语句还是设计思想,都有了成竹在胸的感觉,甚至还可以帮助同学们解决一些小的知识点,做一些小的改良。但光看书也是不够的,在编程的过程中,一开场仍有一些生涩,随着时间的推移,我的进度也逐渐加快。因此,这说明,在做详细的工程时一定首先要打好根底,不能过于着急动手,当然也不能一味地抠细节,无视实验的重要性。2.整体的设计比详细的实现更重要 在教师的讲课过程中,不止一遍强调数字电路的模块的划分、上层的设计要比详细的编程语句更重要。一开场我并没有意识到这一问题,在做逻辑框图时细节和准确性都不够。因为我习惯一边开场做,一边想下一步怎么做。但在教师检查过程中我的框图被指出错误之后,我又重新做了逻辑框图。这一次,我感觉到在我认真考虑后,我对整个电路的构造有了明晰地认识,特别是将电路划分为每一个细小的模块后,模块的详细实现就变得很简单,甚至很多都是现成的。这让我明白上层的设计、模块的划分才是最有创造性、最有技术含量的局部,我们作为设计师,应当将重点放在设计思想上,而不是详细的一个个语句。只有这样,我们的工作才是最具有价值的,而不是简单的模拟和重复。3.硬件编程语言与普通编程语言是有区别的 硬件编程语言侧重于10的逻辑实现,任何一段程序有一局部电路与之对应。在编程的过程中,要养成做硬件的思维习惯。比方这次,计数局部用了10位二进制来表示。但后来的数码管显示需要提取出各位的数值。不得已我用了除法和取余运算,造成的结果是用了大量的逻辑元件。但是我看到我的同学在计数时就将各位单独进展运算,比我节省了大量的元器件。这就是硬件语言的思维,在编程过程中应该尽量防止数据类型的转换、乘除法等,造成资的浪费。4.测试是编程的重要环节因为我们做比拟大型的工程不多,而这次实验,因为用了大量的模块化设计,合理、准确的测试就很重要了。因为整体仿真的运算量太大,而且一旦出错很难发现什么地方出了问题,因此这就要求我们事先要对每一个模块都要进展仿真、测试。而且最好还要对相连的模块进展整体仿真,防止出现问题。而且在仿真、测试的过程中,选择合理的方法也很重要,设置适当的条件、选择适宜的输入、输出等会让测试事半功倍。总之,这次实验让我收获宏大。当我实现了生活中可能用到的一个功能时,不仅让我收获了成就感与信心,还让我对生活中各种数字电路的实现产生了浓重的兴趣。看到生活中的电子产品时,有时候就会不自觉地考虑这是怎么实现的?可能要分为哪些模块?这些模块有哪些功能,彼此又有什么联络?这让我对进一步理解数字电路的应用提供了强大的推动力。七、完好程序电路原理图、程序代码见电路分析p 局部第 12 页 共 12 页
展开阅读全文