【cryengine3.8 源码】【jdk 源码查看】【seafile 源码 安装】秒脉冲的vhdl源码_秒脉冲的vhdl描述

时间:2024-11-26 21:46:44 编辑:思科源码实例 来源:asp 源码加密

1.?秒脉秒脉描述??????vhdlԴ??
2.基于vhdl电子秒表的系统设计怎么做?
3.EDA课程设计,用VHDL编程做出租车计费器

秒脉冲的vhdl源码_秒脉冲的vhdl描述

???????vhdlԴ??

       举个例子:

       对应的顶层文件:

       U3的输入不就是U2和U1的输出啊。推理,冲的冲你的源码设计里面时钟(进制计数器)的输入是分钟(进制计数器)的输出,分钟计数器的秒脉秒脉描述输入是秒钟计数器的输出,秒钟计数器的冲的冲输入是分频器秒脉冲模块的输出。如果再实在是源码cryengine3.8 源码弄不明白,建议你的秒脉秒脉描述顶层文件使用图形化编程,直接画电路连线就好了阿!冲的冲希望能够采纳!源码

基于vhdl电子秒表的秒脉秒脉描述系统设计怎么做?

       一、实验原理 :

       用层次化设计的冲的冲方法以VHDL语言编程实现以下功能:

       1 具有“时”、“分”、源码“秒”计时功能;时为进制,秒脉秒脉描述分和秒都为进制。冲的冲

       2 具有消抖功能:手工按下键盘到是源码否这个过程大概ms左右,在按下开始到弹簧片稳,定接触这段时间为5-ms,从释放到弹片完全分开也是jdk 源码查看5-ms,在达到稳定接触和完全分开的微观过程中,电平是时高时低的,因此如果在首次检测到键盘按下时延时ms再检测就不会检测到抖动的毛刺电平了。Hz的信号周期为.6ms,正适合做消抖信号。

       3 具有校时和清零功能,能够用4Hz脉冲对“小时”和“分”进行调整,并可进行秒零;

       4 具有整点报时功能。在分秒、秒、秒、秒发出低音Hz信号,在分秒发出一次高音Hz信号,音响持续1秒钟,在Hz音响结束时刻为整点。

       5 具有一键设定闹铃及正常计时与闹铃时间的显示转换。闹时时间为一分钟。

       二、程序流程:

       1、秒计数器模块设计:

       模块图如图1。六十进制带进位计数器,seafile 源码 安装可清零,clk输入信号为1Hz脉冲,当q0计满9后q1增加1,当q0满9且q1记满5,q1、q0同时归零,co输出为高电平。q1为十位q0为个位。

       图1

       程序如下:

       library IEEE;

       use IEEE.STD_LOGIC_.ALL;

       use IEEE.STD_LOGIC_ARITH.ALL;

       use IEEE.STD_LOGIC_UNSIGNED.ALL;

       entity c is

       Port ( clk,clr : in std_logic;

       co :out std_logic;

       q1,q0 : out std_logic_vector(3 downto 0));

       end c;

       architecture one of c is

       begin

       process (clk,clr)

       variable cq1,cq0:std_logic_vector(3 downto 0);

       begin

       if clr='1' then cq1:=(others=>'0');cq0:=(others=>'0');

       elsif (clk'event and clk='1') then

       if cq0<9 then cq0:=cq0 +1;co<='0';

       elsif cq1<5 then cq1:=cq1+1;cq0:=(others=>'0');

       elsif cq1=5 and cq0=9

       then co<='1';cq1:=(others=>'0'); cq0:=(others=>'0');

       else co<='0';

       end if;

       end if;

       q1<=cq1;

       q0<=cq0;

       end process;

       end one;

       仿真结果如下图2

       2、分计数器同上。注:不同之处为分的clk输入信号为秒的进位信号。

       3、时计数器:

       模块图如图3。进制无进位计数器,当计数信号计到后再检测到计数信号时会自动零。带清零,clk输入为分秒进位相与的notepad 1.0源码结果。q1为十位,q0为个位。

       图3

       程序如下:

       library IEEE;

       use IEEE.STD_LOGIC_.ALL;

       use IEEE.STD_LOGIC_ARITH.ALL;

       use IEEE.STD_LOGIC_UNSIGNED.ALL;

       entity c is

       Port ( clk : in std_logic;

       q1,q0 : out std_logic_vector(3 downto 0));

       end c;

       architecture one of c is

       begin

       process (clk)

       variable cq1,cq0:std_logic_vector(3 downto 0);

       begin

       if (clk'event and clk='1') then

       if cq1="" and cq0="" then

       cq1:=""; cq0:="";

       elsif cq0<"" then

       cq0:=cq0+1;

       else cq0:=""; cq1:=cq1+1;

       end if;

       end if;

       q1<=cq1;q0<=cq0;

       end process;

       end one;

       仿真波形如下图4:

       图4

       4、分频器:

       模块图如图5。由四个分频器构成,输入信号in_clk为Hz脉冲信号。把输入的Hz信号分频为四个脉冲信号,即1Hz的秒脉冲,4Hz的校时、校分脉冲,Hz的消抖脉冲以及Hz的蜂鸣器低音输入。

       图5

       程序如下:

       library IEEE;

       use IEEE.STD_LOGIC_.ALL;

       use IEEE.STD_LOGIC_ARITH.ALL;

       use IEEE.STD_LOGIC_UNSIGNED.ALL;

       entity div is

       Port ( in_clk : in std_logic;

       clk_, clk_1,clk_4 ,clk_:out std_logic);

       end div;

       architecture one of div is

       signal q,a,b,c:std_logic;

       signal c1,c4,c:integer range downto 0;

       begin

       process(in_clk)

       begin

       if in_clk'event and in_clk='1' then

       q<=not q;

       if c>=7 then c<=0;c<=not c;else c<=c+1;end if;

       if c4>= then c4<=0;b<=not b;else c4<=c4+1;end if;

       if c1>= then c1<=0;a<=not a;else c1<=c1+1;end if;

       end if;

       end process;

       clk_<=q;

       clk_1<=a;

       clk_4<=b;

       clk_<=c;

       end one;

       仿真波形如下图6:

       图6

       5、消抖:

       模块图如图7。分频出的用Hz信号对sa校时信号、sb校分信号、sc秒清零信号、sd闹时设置信号进行防抖动处理。心里fm源码是由四个两级d触发器构成的,分别对输入的sa、sb、sc、sd

       信号的相邻两个上升沿进行比较以确定按键的按下,从而达到消抖的目的。

       图7

       程序如下:

       library IEEE;

       use IEEE.STD_LOGIC_.ALL;

       use IEEE.STD_LOGIC_ARITH.ALL;

       use IEEE.STD_LOGIC_UNSIGNED.ALL;

       entity xd is

       Port ( clk_ : in std_logic;

       hj,mj,sclr,sdo :out std_logic;

       sa,sb,sc,sd : in std_logic);

       end xd;

       architecture one of xd is

       begin

       process(clk_)

       variable sa_n,sa_p,sb_n,sd_n,sb_p,sc_n,sc_p,sd_p:std_logic;

       begin

       if clk_'event and clk_='1' then

       sa_p:=sa_n;sa_n:=sa;

       sb_p:=sb_n;sb_n:=sb;

       sc_p:=sc_n;sc_n:=sc;

       sd_p:=sd_n;sd_n:=sd;

       if sa_p= sa_n then hj<=sa;end if;

       if sb_p= sb_n then mj<=sb;end if;

       if sc_p= sc_n then sclr<=sc;end if;

       if sd_p= sd_n then sdo<=sd;end if;

       end if;

       end process;

       end one;

       仿真波形如下图8:

       图8

       6、闹钟时间的设定:

       模块图如图9。一键设定闹铃时间,内部由四个d触发器构成。当确定sd键按下时,将当前时间的小时和分的个位十位分别存入四个d触发器内,作为闹时时间。

       图9

       程序如下

       library IEEE;

       use IEEE.STD_LOGIC_.ALL;

       use IEEE.STD_LOGIC_ARITH.ALL;

       use IEEE.STD_LOGIC_UNSIGNED.ALL;

       entity df4 is

       Port ( sd :in std_logic;

       hh,hl,mh,ml : in std_logic_vector(3 downto 0);

       hh_o,hl_o,mh_o,ml_o: out std_logic_vector(3 downto 0));

       end df4;

       architecture one of df4 is

       begin

       process (sd,hh,hl,mh,ml)

       begin

       if sd='1' then

       hh_o<=hh;hl_o<=hl;mh_o<=mh;ml_o<=ml;end if;

       end process;

       end one;

       仿真波形如下图:

       图

       7、二选一电路

       (1)一位二选一:

       模块图如图。用以进行正常计时和校时/分的选择。alarm为经过消抖的校时/分信号。当按键未曾按下时,即校时/分信号没有到来时,二选一选择器会选择输出a(正常计时输入)信号,否则当alarm按键按下时输出y为校时/分输入信号——4Hz。

       图

       程序如下:

       library IEEE;

       use IEEE.STD_LOGIC_.ALL;

       use IEEE.STD_LOGIC_ARITH.ALL;

       use IEEE.STD_LOGIC_UNSIGNED.ALL;

       entity xuan is

       Port ( alarm,a,b: in std_logic;

       y:out std_logic);

       end xuan ;

       architecture one of xuan is

       begin

       process(alarm,a,b)

       begin

       if alarm='0' then y<=a;else y<=b;

       end if;

       end process;

       end one;

       仿真波形如下图:

       图

       (2)三位二选一:

       模块图如图。用以进行正常计时时间与闹铃时间显示的选择,alarm输入为按键。当alarm按键未曾按下时二选一选择器会选择输出显示正常的计时结果,否则当alarm按键按下时选择器将选择输出显示闹铃时间显示。

       图

       程序如下:

       library IEEE;

       use IEEE.STD_LOGIC_.ALL;

       use IEEE.STD_LOGIC_ARITH.ALL;

       use IEEE.STD_LOGIC_UNSIGNED.ALL;

       entity x is

       Port ( alarm : in std_logic;

       y:out std_logic_vector(3 downto 0);

       a,b: in std_logic_vector(3 downto 0));

       end x;

       architecture one of x is

       begin

       process(alarm,a,b)

       begin

       if alarm='0' then y<=a;else y<=b;

       end if;

       end process;

       end one;

       仿真结果如下图:

       图

       8、整点报时及闹时:

       模块图如图。在分秒、秒、秒、秒给扬声器赋以低音Hz信号,在分秒给扬声器赋以高音Hz信号,音响持续1秒钟,在Hz音响结束时刻为整点。当系统时间与闹铃时间相同时给扬声器赋以高音Hz信号。闹时时间为一分钟。

       图

       程序如下:

       library IEEE;

       use IEEE.STD_LOGIC_.ALL;

       use IEEE.STD_LOGIC_ARITH.ALL;

       use IEEE.STD_LOGIC_UNSIGNED.ALL;

       entity voice is

       Port ( hou1,huo0,min1,min0,sec1,sec0,hh,hl,mh,ml: std_logic_vector(3 downto 0);

       in_,in_:in std_logic;

       q : out std_logic);

       end voice;

       architecture one of voice is

       begin

       process(min1,min0,sec1,sec0)

       begin

       if min1="" and min0="" and sec1="" then

       if sec0="" or sec0="" or sec0="" or sec0=""

       then q<=in_;

       elsif sec1="" and sec0="" then q<=in_;

       else q<='0';

       end if;

       else q<='0';

       end if;

       if min1=mh and min0=ml and hou1=hh and huo0=hl then

       q<=in_;

       end if;

       end process;

       end one;

       仿真波形如下图

       图

       9、顶层原理图:

       三、感想

       通过这次设计,既复习了以前所学的知识,也进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在画顶层原理图时,遇到了不少问题,最大的问题就是根本没有把各个模块的VHD文件以及生成的器件都全部放在顶层文件的文件夹内,还有就是程序设计的时候考虑的不够全面,没有联系着各个模式以及实验板的情况来编写程序,以至于多考虑编写了译码电路而浪费了很多时间。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示

       :在分频模块中,设定输入的时钟信号后,却只有二分频的结果,其余三个分频始终没反应。后来,在数十次的调试之后,才发现是因为规定的信号量范围太大且信号的初始值随机,从而不能得到所要的结果。还有的仿真图根本就不出波形,怎么调节都不管用,后来才知道原来是路径不正确,路径中不可以有汉字。真是细节决定成败啊!总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。

       四、

参考资料:

       1、潘松,王国栋,VHDL实用教程〔M〕.成都:电子科技大学出版社,.(1)

       2、崔建明主编,电工电子EDA仿真技术北京:高等教育出版社,

       3、李衍编著,EDA技术入门与提高王行西安:西安电子科技大学出版社,

       4、侯继红,李向东主编,EDA实用技术教程北京:中国电力出版社,

       5、沈明山编著,EDA技术及可编程器件应用实训北京:科学出版社,

       6、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计西安: 西安电子科技大学出版社,

       7、辛春艳编著,VHDL硬件描述语言北京:国防工业出版社,

EDA课程设计,用VHDL编程做出租车计费器

       è¯¾ç¨‹è®¾è®¡å†…容与要求

       1,用开关按键表示脉冲,每个脉冲代表米,个脉冲1公里,每公里1.4元,能同步显示里程和费用;

       2,低于2公里5元计费,高于2公里总费用=起步费用+(里程-2公里)*里程单价+

       ç­‰å€™æ—¶é—´*等后单价;

       3,等候时间大于2分钟,按每分钟1.3元计费;

       4,可以设定起步价和里程单价。

        一、设计原理与技术方法:

       åŒ…括:电路工作原理分析与原理图、元器件选择与参数计算、电路调试方法与结果说明;

       è½¯ä»¶è®¾è®¡è¯´æ˜Žä¹¦ä¸Žæµç¨‹å›¾ã€è½¯ä»¶æºç¨‹åºä»£ç ã€è½¯ä»¶è°ƒè¯•æ–¹æ³•ä¸Žè¿è¡Œç»“果说明。

        根据设计要求,系统的输入信号clk,计价开始信号start,等待信号stop,里程脉冲信号fin。系统的输出信号有:总费用数C0—c3,行驶距离k0—k1,等待时间m0—m1等。系统有两个脉冲输入信号clk_k,fin,其中clk_k将根据设计要求分频成hz,hz和1hz分别作为公里计费和超时计费的脉冲。两个控制输入开关start,stop;控制过程为:start作为计费开始的开关,当start为高电平时,系统开始根据输入的情况计费。当有乘客上车并开始行驶时,fin脉冲到来,进行行驶计费,此时的stop需要置为0;如需停车等待,就把stop变为高电平,

       å¹¶åŽ»é™¤fin输入脉冲,进行等待计费;当乘客下车且不等待时,直接将start置为0,系统停止工作;价格开始归为起步价5.0元。

        整个设计由分频模块,计量模块,计费模块,控制模块和显示模块五个部分组成。

       å…¶ä¸­è®¡é‡æ¨¡å—是整个系统实现里程计数和时间计数的重要部分;控制模块是实现不同计费方式的选择部分,根据所设计的使能端选择是根据里程计费还是根据等待时间计费,同时设计通过分频模块产生不同频率的脉冲信号来实现系统的计费。计量模块采用1hz的驱动信号,计费模块采用hz,hz的驱动信号;计量模块每计数一次,计量模块就实现次或者次计数,即为实现计时的1.3元/min,计程时的1.4元/km的收费。组成框图如下所示:

       1.百进制模块:

       å®žçŽ°ç™¾ç±³è„‰å†²çš„驱动信号,元件框图如图3所示:

       å›¾3 百进制模块框图

       æºç¨‹åºå¦‚下:

       library ieee;

       use ieee.std_logic_.all;

       use ieee.std_logic_unsigned.all;

       entity baijinzhi is

       port(start,clk2: in std_logic; --秒脉冲

        a: out std_logic_vector(3 downto 0));

       end baijinzhi;

       architecture rt1 of baijinzhi is

       signal count_1:std_logic_vector(3 downto 0);

       begin

        a<=count_1;

       process(start,clk2)

        begin

        if(start='0')then

        count_1<="";

        elsif(clk2'event and clk2='1')then

        if(count_1="")then

        count_1<="";

        else

        count_1<=count_1+'1';

        end if;

        end if;

       end process;

       end rt1

       2.计费模块

       ; 实现里程和等候时间的计费并输出到显示,元件框图4如下:

       å›¾4 计费模块框图

       æºç¨‹åºå¦‚下:

       Library IEEE;

       use IEEE.std_logic_.all;

       use IEEE.std_logic_arith.all;

       use IEEE.std_logic_unsigned.all;

       entity jifei is

       port(clk2:in std_logic; --计费驱动信号

        start:in std_logic; --计费开始信号

        c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));

       end jifei;

       architecture rt1 of jifei is

       begin

       process(clk2,start)

       begin

        if start='0'then c3<="";c2<="";c1<="";c0<=""; --起步价5元

        elsif clk2'event and clk2='1'then

        if c0="" then c0<="";

        if c1="" then c1<="";

        if c2="" then c2<="";

        if c3="" then c3<="";

        else c3<=c3+1;

        end if;

        else c2<=c2+1;

        end if;

        else c1<=c1+1;

        end if;

        else c0<=c0+1;

        end if;

       end if;

       end process;

       end rt1;

       3.公里模块

       å®žçŽ°åŽ†ç¨‹çš„计数和输出计费脉冲,元件框图5如下:

       å›¾5 公里模块框图

       æºç¨‹åºå¦‚下:

       library ieee;

       use ieee.std_logic_.all;

       use ieee.std_logic_unsigned.all;

       entity gongli is

       port(clk1,start: in std_logic; --百米脉冲

        k1,k2,k3,k4: out std_logic_vector(3 downto 0); --里程显示

        temp2 : out std_logic);

       end gongli;

       architecture rt1 of gongli is

       signal count_1: std_logic_vector(3 downto 0);

       signal count_2: std_logic_vector(3 downto 0);

       signal count_3: std_logic_vector(3 downto 0);

       signal count_4: std_logic_vector(3 downto 0);

       begin

        k1<=count_1;

        k2<=count_2;

        k3<=count_3;

        k4<=count_4;

        process(start,clk1)

        begin

        if(start='0')then

        count_1<="";

        count_2<="";

        count_3<="";

        count_4<=""; ---公里清零

        elsif(clk1'event and clk1='1')then

        if(count_1="")then --公里计数器

        count_1<="";count_2<=count_2+1;temp2<='1';

        if(count_2="")then

        count_2<="";count_3<=count_3+'1';

        if(count_3="")then

        count_3<="";count_4<=count_4+'1';

        end if;

       end if;

        else

        count_1<=count_1+'1';temp2<='0';

        end if;

        end if;

        end process;

        end rt1;

       4.输出模块

       å®žçŽ°æ‰€æœ‰æ•°æ®çš„输出,元件框图6如下:

       å›¾6 输出模块框图

       æºç¨‹åºå¦‚下:

       library ieee;

       use ieee.std_logic_.all;

       use ieee.std_logic_unsigned.all;

       entity shuchu is

       port(y: in std_logic_vector(3 downto 0);

        e: out std_logic_vector(6 downto 0));

       end shuchu;

       architecture rt1of shuchu is

       begin

       process

       begin

        case y is

        when""=>e<="";

        when""=>e<="";

        when""=>e<="";

        when""=>e<="";

        when""=>e<="";

        when""=>e<="";

        when""=>e<="";

        when""=>e<="";

        when""=>e<="";

        when""=>e<="";

        when others=>e<="";

        end case;

       end process;

       end rt1;

       5.显示模块

       å®žçŽ°æ‰€æœ‰æ•°æ®çš„显示,元件框图7如下:

       å›¾7 显示模块框图

       æºç¨‹åºå¦‚下:

       library ieee;

       use ieee.std_logic_.all;

       use ieee.std_logic_unsigned.all;

       entity xianshi is

       port(start: in std_logic;

       a:in std_logic_vector(3 downto 0); --选择信号

        c1,c2,c3,c4,out1,out2,out3,out4:in std_logic_vector(3 downto 0); --里程显示,时间显示输入

        y:out std_logic_vector(3 downto 0)); --里程显示,时间显示输出

       end xianshi;

       architecture rt1 of xianshi is

       begin

       process

       begin

        if(start='0')then

        y<="";

        else case a is

        when ""=> y<=c1 ;

        when ""=> y<=c2 ;

        when ""=> y<=c3 ;

        when ""=> y<=c4 ;

        when ""=> y<=out1 ;

        when ""=> y<=out2;

        when ""=> y<=out3 ;

        when ""=> y<=out4;

        when others =>y<= "";

        end case;

        end if;

       end process;

       end rt1;

       6.dian模块

       å›¾8 dian模块框图

       æºç¨‹åºå¦‚下:

       library ieee;

       use ieee.std_logic_.all;

       use ieee.std_logic_unsigned.all;

       entity dian is

       port(a: in std_logic_vector(3 downto 0);

        e: out std_logic);

       end dian;

       architecture rt1 of dian is

       begin

       process

       begin

        case a is

        when ""=>e<='1';

        when ""=>e<='1';

        when others=>e<='0';

        end case;

       end process;

       end rt1;

       ä¸‰ã€ä¸­å„个模块设计分析

       ç³»ç»Ÿæ€»ä½“顶层框图如下:

       ç³»ç»Ÿæ€»ä½“顶层框图

       ç¨‹åºæœ€ç»ˆåŠŸèƒ½å®žçŽ°æ³¢å½¢ä»¿çœŸ

       1. 分频模块

       ç”±äºŽå®žéªŒç®±ä¸Šæ²¡æœ‰hz和hz的整数倍时钟信号,因此采用频率较大的khz进行分频,以近似得到hz,hz和1hz的时钟频率。通过以上三种不同频率的脉冲信号实行出租车行驶,等待两种情况下的不同计费。模块元件如下:

        分频模块框图

       æºç¨‹åºå¦‚下:

       Library IEEE;

       use IEEE.std_logic_.all;

       use IEEE.std_logic_arith.all;

       use IEEE.std_logic_unsigned.all;

        entity fenpin is

       port(clk_k:in std_logic; --系统时钟

        clk_:buffer std_logic; --分频

        clk_:buffer std_logic; --分频

        clk_1 : buffer std_logic); --1分频

       end fenpin ;

       architecture rt1 of fenpin is

       signal q_:integer range 0 to ; --定义中间信号量

       signal q_:integer range 0 to ;

       signal q_1:integer range 0 to ;

        begin

        process(clk_k)

        begin

       If(clk_k' event and clk_k='1')then

       If q_= then q_<=0;clk_<=not clk_;

        else q_<=q_+1;

        end if; --得hz频率信号

       If q_= then q_<=0;clk_<=not clk_;

        else q_<=q_+1;

        end if; --得hz频率信号

       If q_1= then q_1<=0;clk_1<=not clk_1;

        else q_1<=q_1+1;

        end if; --得1hz频率信号

       end if;

       end process;

        end rt1;

       2. 计量模块

       è®¡é‡æ¨¡å—主要完成计时和计程功能。

       è®¡æ—¶éƒ¨åˆ†ï¼šè®¡ç®—乘客的等待累积时间,当等待时间大于2min时,本模块中en1使能信号变为1;当clk1每来一个上升沿,计时器就自增1,计时器的量程为min,满量程后自动归零。

       è®¡ç¨‹éƒ¨åˆ†ï¼šè®¡ç®—乘客所行驶的公里数,当行驶里程大于2km时,本模块中en0使能信号变为1;当clk每来一个上升沿,计程器就自增1,计程器的量程为km,满量程后自动归零。

       å…ƒä»¶æ¡†å›¾ä¸ºï¼š

       è®¡é‡æ¨¡å—框图

       è®¡é‡æ¨¡å—仿真波形为:

       æºç¨‹åºå¦‚下:

       library ieee;

       use ieee.std_logic_.all;

       use ieee.std_logic_arith.all;

       use ieee.std_logic_unsigned.all;

       entity jiliang is

       port(start:in std_logic; --计费开始信号

        fin:in std_logic; --里程脉冲信号

        stop:in std_logic; --行驶中途等待信号

        clk1:in std_logic; --驱动脉冲

        en1,en0:buffer std_logic; --计费单价使能信号

        k1,k0:buffer std_logic_vector(3 downto 0); --行驶公里计数

        m1,m0:buffer std_logic_vector(3 downto 0)); --等待时间计数

       end jiliang;

       architecture rt2 of jiliang is

       signal w:integer range 0 to ; --计时范围0~

       begin

       process(clk1)

       begin

       if(clk1'event and clk1='1')then

        if start='0' then

        w<=0;en1<='0';en0<='0';m1<="";

        m0<="";k1<="";k0<="";

       elsif stop='1' then --计时开始信号

        if w= then

        w<=0;

        else w<=w+1;

       end if;

       if m0="" then

        m0<="";

       if m1="" then

        m1<="";

       else m1<=m1+1;

       end if;

       else m0<=m0+1;

       end if;

       if stop='1' then en0<='0';

       if m1&m0>"" then en1<='1'; --若等待时间大于2min则en1ç½®1

       else en1<='0';

       end if;

       end if;

       elsif fin='1' then --里程计数开始

       if k0="" then k0<="";

       if k1="" then k1<=""; --计程范围0~

       else k1<=k1+1;

       end if;

       else k0<=k0+1;

       end if;

       if stop='0' then

       en1<='0';

       if k1&k0>"" then

       en0<='1'; --若行使里程大于2km,则en0ç½®1

       else en0<='0';

       end if;

       end if;

       end if;

       end if;

       end process;

       end rt2;

       3. 控制模块

        本模块主要是通过计量模块产生的两个不同的输入使能信号en0,en1,对每个分频模块输出的hz,hz的脉冲进行选择输出的过程;本模块实现了双脉冲的二选一;最终目的为了计费模块中对行驶过程中不同的时段进行计价。

       æ¨¡å—元件如下:

       æŽ§åˆ¶æ¨¡å—框图

       æŽ§åˆ¶æ¨¡å—仿真波形为:

       æºç¨‹åºå¦‚下:

       Library IEEE;

       use IEEE.std_logic_.all;

       use IEEE.std_logic_arith.all;

       use IEEE.std_logic_unsigned.all;

        entity kongzhi is

       port(en0,en1:in std_logic; --使能选择信号

        clk_in1:in std_logic; --分频输入信号

        clk_in2:in std_logic; --分频输入信号

        clk_out:out std_logic); --输出信号

        end kongzhi;

        architecture rt3 of kongzhi is

       begin

       process(en0,en1)

       begin

        if en0='1' then --实现二选一功能

        clk_out<=clk_in1;

        elsif en1='1' then

        clk_out<=clk_in2;

        end if;

        end process;

       end rt3;

       4.计费模块

        当计费信号start一直处于高电平即计费状态时,本模块根据控制模块选择出的信号从而对不同的单价时段进行计费。即行程在2km内,而且等待累计时间小于2min则为起步价5元;2km外以每公里1.4.元计费,等待累积时间超过2min则按每分钟1.3元计费。c0,c1,c2,c3分别表示费用的显示。

       æ¨¡å—元件为:

       è®¡è´¹æ¨¡å—框图

       è®¡è´¹æ¨¡å—仿真波形为:

       æºç¨‹åºå¦‚下:

       Library IEEE;

       use IEEE.std_logic_.all;

       use IEEE.std_logic_arith.all;

       use IEEE.std_logic_unsigned.all;

       entity jifei is

       port(clk2:in std_logic; --计费驱动信号

        start:in std_logic; --计费开始信号

        c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));

       end jifei;

       architecture rt4 of jifei is

       begin

       process(clk2,start)

       begin

        if start='0'then c3<="";c2<="";c1<="";c0<=""; --起步价5元

        elsif clk2'event and clk2='1'then

        if c0="" then c0<="";

        if c1="" then c1<="";

        if c2="" then c2<="";

        if c3="" then c3<=""; --计价范围0~.9

        else c3<=c3+1;

        end if;

        else c2<=c2+1;

        end if;

        else c1<=c1+1;

        end if;

        else c0<=c0+1;

        end if;

       end if;

       end process;

       end rt4;

       5.显示模块

        显示模块完成计价,计时和计程数据显示。计费数据送入显示模块进行译码,最后送至以百元,十元,元,角为单位对应的数码管上显示。计时数据送入显示模块进行译码,最后送至以分为单位对应的数码管上显示。计程数据送入显示模块进行译码,最后送至以km为单位的数码管上显示。

        模块元件为:

        显示模块框图

       æºç¨‹åºå¦‚下:

       library ieee;

       use ieee.std_logic_.all;

       use ieee.std_logic_unsigned.all; --定义库包

       entity xianshi is --定义实体

       port(

        clk_scan:in std_logic; --扫描时钟信号端口设置

        c3,c2,c1,c0:in std_logic_vector(3 downto 0); --总费用输入端口

        k0,k1:in std_logic_vector(3 downto 0); --里程输入端口

        m0,m1:in std_logic_vector(3 downto 0); --等待时间输入端口

        sel:out std_logic_vector(2 downto 0); --控制数码管位选信号的扫描信号输出端口

        led:out std_logic_vector(6 downto 0); --数码管的控制端口

        led_dp:out std_logic --数码管的小数点输出端口

        );

       end xianshi;

       architecture rt5 of xianshi is

       signal duan:std_logic_vector(6 downto 0); --数码显示管中间变量

       signal shuju:std_logic_vector(3 downto 0); --选择输入端的中间变量

       signal cnt:std_logic_vector(2 downto 0); --控制数码管的中间变量

       signal xiaodian:std_logic; --小数点的中间变量

       begin

       process(clk_scan) --开始进程

       begin

        if clk_scan'event and clk_scan='1' then

        cnt<=cnt+1; --每有一个扫描信号上升沿实现加1扫描

        end if;

       end process; --结束进程

       process(cnt) --开始进程(选择扫描显示数码管)

       begin

        case cnt is --扫描时给每个数码管赋值

        when ""=>shuju<=c0;

        when ""=>shuju<=c1;

        when ""=>shuju<=c2;

        when ""=>shuju<=c3;

        when ""=>shuju<=k0;

        when ""=>shuju<=k1;

        when ""=>shuju<=m0;

        when ""=>shuju<=m1;

        when others=> null;

        end case;

        if (cnt="" or cnt="")

        then xiaodian<='1'; --在里程和总费用的个位处显示小数点

        else xiaodian<='0';

        end if;

       end process; --结束进程

       process(shuju) --开始进程(译码显示)

       begin

        case shuju is

        when ""=>duan<=""; --0

        when ""=>duan<=""; --1

        when ""=>duan<=""; --2

        when ""=>duan<=""; --3

        when ""=>duan<=""; --4

        when ""=>duan<=""; --5

        when ""=>duan<=""; --6

        when ""=>duan<=""; --7

        when ""=>duan<=""; --8

        when ""=>duan<=""; --9

        when others=>null;

        end case;

       end process;

       sel<=cnt;

       led<=duan;

       led_dp<=xiaodian;

       end rt5;

       äºŒã€è¯¾ç¨‹è®¾è®¡å·¥ä½œè®°å½•ï¼š

       åŒ…括:设计步骤与时间安排、调试步骤与时间安排、课题完成结果说明

       2.课题完成结果说明:

       æ­¤è®¡è´¹å™¨èƒ½å®žçŽ°èµ·æ­¥ä»·æ˜¯5元;实现实验要求的1公里计费一次单价,行驶公里大于2km时每公里按1.4元计费并能显示里程和总共的费用。当行驶了6公里,等待了4分钟时,费用显示为.8元。与计算公式总费用=起步费用+(里程-2公里)*里程单价+等候时间*等后单价;即.8=5+(6-2)*1.4+4*1.3。实验结果与理论结果完全一致,实验设计成功。