基于VHDL的出租车计价器系统设计_第1页
基于VHDL的出租车计价器系统设计_第2页
基于VHDL的出租车计价器系统设计_第3页
基于VHDL的出租车计价器系统设计_第4页
基于VHDL的出租车计价器系统设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于VHDL的出租车计价器系统设计大家好!大家好!l本次我们设计的任务是出租车计程计价表,利用QuartusII进行设计,对编好的VHDL程序进行编译、仿真、下载。实现一个出租车计程计价表,具有车型设置、起步里程设置、起步价设置、分时计价设置、里程显示、计费显示、计时显示、点阵数码管显示及汉字数字钟的报时及发光二极管花色显示等功能。 本次设计主要分六个部分本次设计主要分六个部分第一部分:里程计价部分第一部分:里程计价部分第二部分:计时部分第二部分:计时部分第三部分:数码管显示部分第三部分:数码管显示部分第四部分:点阵显示部分第四部分:点阵显示部分第五部分:数字钟的报时及发光二极第五部分:数字钟

2、的报时及发光二极 管花色显示部分管花色显示部分第六部分:整体电路连接部分第六部分:整体电路连接部分第一部分第一部分 里程计价部分里程计价部分lDiv模块作用l对芯片给的10MHZ的频率进行分频,然后传输给计数器A,提供扫描频率。第一部分第一部分 里程计价部分(续)里程计价部分(续)LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;use ieee.std_logic_arith.all; ENTITY div IS PORT (clk_sys: IN std_logic; clk: OUT std_

3、logic; clk_scan:out std_logic); END div;ARCHITECTURE a OF div IS signal q: std_logic_vector(23 DOWNTO 0); BEGIN PROCESS (clk_sys) BEGIN if(clk_sysevent and clk_sys = 0) then q = q + 1; end if; clk = q(4); clk_scan=q(2); - -注:为方便仿真,在此 clk = q(4); clk_scan=q(2);而在计程车的设计中用clk = q(18); clk_scan=q(9); en

4、d process;end a;第一部分第一部分 里程计价部分(续里程计价部分(续)l计数器A作用l对车轮传感器送来的车轮脉冲信号clk进行计数分频,车轮每转一圈送出一个脉冲。车每行驶100m,计数器A输出1个“100m脉冲信号oclk”,不同车型的车轮直径不一样,计数器A的分频系数也不一样。 第一部分第一部分 里程计价部分(续里程计价部分(续)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity cnt_A isport(rese

5、t,clk:in std_logic;start:in std_logic;cartype:in std_logic_vector(1 downto 0);oclk:out std_logic);end cnt_A;architecture behave of cnt_A issignal mode:std_logic_vector(5 downto 0);signal temp:std_logic_vector(5 downto 0);beginmode=000011 when cartype=00 else-注:为方便仿真,在此mode=000011 而在计程车的设计中用mode=“111

6、100 111010 when cartype=01 else111000 when cartype=10 else 110110 ;process (start,clk)beginif (reset=0) then temp0);elsif rising_edge (clk) thenif start=1 thenif temp= (mode) thentemp0);elsetemp=temp+1;end if;end if;end if;end process;oclk=1 when (temp=mode) else0;end behave;第一部分第一部分 里程计价部分(续里程计价部分(

7、续)计数器B作用对输入的100m脉冲oclk进行累加在开始时输出起步里程数据,而当超出起步里程时自动输出实际公里数据给译码/动态扫描模块每计满500m路程送出1个脉冲clkout给 计数器C。第一部分第一部分 里程计价部分(续里程计价部分(续)LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;USE ieee.std_logic_arith.ALL;ENTITY cnt_B isport (reset,clkin: in std_logic;dip:in std_logic_vector (2 do

8、wnto 0);length:out std_logic_vector(12 downto 0);clkout:out std_logic);end cnt_B;ARCHITECTURE behave of cnt_B issignal licheng: std_logic_vector(6 downto 0);signal temp0: std_logic_vector(12 downto 0);signal temp1:std_logic_vector(3 downto 0); beginwith dip selectlicheng=conv_std_logic_vector(30,7)

9、when000,conv_std_logic_vector(40,7) when001,conv_std_logic_vector(50,7) when010,conv_std_logic_vector(60,7) when011,conv_std_logic_vector(70,7) when100,conv_std_logic_vector(80,7) when101,conv_std_logic_vector(90,7) when110,conv_std_logic_vector(100,7) when others;p1:process (clkin)Beginif (reset=0)

10、 then temp00);elsif rising_edge (clkin) thentemp0=temp0+1;end if;end process p1;p2:process (temp0,clkin)beginif (reset=0) then temp10);elsif rising_edge (clkin) thenif (temp0=licheng) thenif (temp1=conv_std_logic_vector (4,4) thentemp10);else temp1=temp1+1;end if;end if;end if;end process p2;clkout=

11、1 when (temp1=conv_std_logic_vector(4,4) else 0;length=000000& licheng when(temp0=licheng) else temp0;end behave;第一部分第一部分 里程计价部分(续里程计价部分(续)计数器C作用实现步长可变(即单价可调)的累加计数分时计价控制端“hourin”输入信号为0时,每500m计费0.6元分时计价控制端“hourin”输入信号为1时,每500m计费0.9元。 第一部分第一部分 里程计价部分(续里程计价部分(续)library ieee;use ieee.std_logic_1164.

12、all;use ieee.std_logic_unsigned.all;use ieee.numeric_std.all;use ieee.std_logic_arith.all;entity cnt_c isport(hourin:in std_logic;reset:in std_logic;clkin:in std_logic;dip:in std_logic_vector(1 downto 0);money:out std_logic_vector(12 downto 0);end cnt_c;architecture behave of cnt_c issignal qibu:std

13、_logic_vector(12 downto 0);Signaltemp0:std_logic_vector(12 downto 0);beginwith dip selectqibu=conv_std_logic_vector (50,13) when 00,conv_std_logic_vector (60,13) when 01,conv_std_logic_vector (80,13) when 10,conv_std_logic_vector (100,13) when others;process (clkin)beginif(reset=0) then temp00);elsi

14、f rising_edge (clkin) thenif hourin=0 thentemp0=temp0+0110;else temp0=temp0+1001;end if; end if;end process;money=qibu+temp0;end behave;第二部分第二部分 计时部分计时部分lSecond模块作用l输入100m脉冲信号oclk作为“秒”输入l调“分”端口setmin用于设定“分”l对秒输入进行60分频,输出enmin即“分”信号l输出“秒”数据第二部分第二部分 计时部分(续)计时部分(续)LIBRARY ieee;use ieee.std_logic_1164.a

15、ll;use ieee.std_logic_unsigned.all;ENTITY second ISPORT(clk, reset,setmin : INSTD_LOGIC;enmin : OUT STD_LOGIC;daout: out std_logic_vector (6 downto 0);END entity second;ARCHITECTURE fun OF second ISSIGNAL count: STD_LOGIC_VECTOR( 6 downto 0);SIGNAL enmin_1,enmin_2:STD_LOGIC;BEGINdaout = count;enmin_

16、2=(not setmin and clk);enmin=(enmin_1 or enmin_2);process ( clk , reset , setmin) begin if (reset=0) thencount = 0000000;elsif (clk event and clk=1) thenif (count(3 downto 0)=1001) thenif (count 16#60#) thenif (count=1011001) thenenmin_1=1; count=0000000; ELSEcount=count+7; end if;else count=0000000

17、;end if;elsif (count 16#60#) then count = count+1;enmin_1=0 after 100 ns; else count=0000000;end if;end if;end process;END fun;第二部分第二部分 计时部分(续)计时部分(续)lMinute模块作用l输入enmin即“分”信号l调“时”端口sethour用于设定“时”l对分输入进行60分频,输出enhour即“时”信号l输出“分”数据第二部分第二部分 计时部分(续)计时部分(续)LIBRARY ieee;use ieee.std_logic_1164.all;use ie

18、ee.std_logic_unsigned.all;ENTITY minute ISPORT(clk, clk1,reset,sethour : IN STD_LOGIC;enhour : OUT STD_LOGIC;daout: out std_logic_vector (6 downto 0);END entity minute;ARCHITECTURE fun OF minute ISSIGNAL count: STD_LOGIC_VECTOR( 6 downto 0);SIGNAL enhour_1,enhour_2:STD_LOGIC;BEGINdaout = count;enhou

19、r_2=(not sethour and clk1);enhour=(enhour_1 or enhour_2);process ( clk,reset,sethour) begin if (reset=0) thencount = 0000000;elsif (clk event and clk=1) thenif (count(3 downto 0)=1001) thenif (count 16#60#) thenif (count=1011001) thenenhour_1=1; count=0000000;ELSEcount=count+7; end if;else count=000

20、0000;end if;elsif(count 16#60#) then count = count + 1;enhour_1=0 after 100 ns;elsecount=0000000;end if;end if;第二部分第二部分 计时部分(续)计时部分(续)lhour模块作用l输入enhour即“时”信号l输出“时”数据第二部分第二部分 计时部分(续)计时部分(续)LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY hour ISPORT(clk,reset: IN STD_L

21、OGIC;daout: out std_logic_vector (5 downto 0);END entity hour;ARCHITECTURE fun OF hour ISSIGNAL count: STD_LOGIC_VECTOR( 5 downto 0);BEGINdaout = count;process ( clk,reset) begin if (reset=0) thencount = 000000;elsif (clk event and clk=1) thenif (count(3 downto 0)=1001) thenif (count 16#23#) thencou

22、nt=count + 7; else count=000000;end if;elsif(count 16#23#) then count = count + 1;else count=000000;end if;end if;end process;END fun;end process;END fun;第三部分:数码管显示部分第三部分:数码管显示部分lBCD7模块作用l输入licheng信号和money信号转换成相应的七段数码管数据信号和地址信号输出第三部分:数码管显示部分(续)第三部分:数码管显示部分(续)library ieee;use ieee.std_logic_1164.all;

23、use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity BCD7 isport(money,licheng:in std_logic_vector(13 downto 0);clk_scan:in std_logic;SEG:out std_logic_vector(7 downto 0);DIP:out std_logic_vector(7 downto 0);end BCD7;architecture Arch of BCD7 issignal q:std_logic_vector(2 downto 0);si

24、gnal Dq,Db,Ds,Dg:std_logic_vector(3 downto 0);signallDq,lDb,lDs,lDg:std_logic_vector(3 downto 0);signal data: std_logic_vector(3 downto 0);signal sel:std_logic_vector(2 downto 0);beginP1:process(clk_scan)beginif(rising_edge(clk_scan) then q=q+1;end if;end process P1;P2:process(money)variable money_i

25、nt:integer range 0 to 9999;variable rb:integer range 0 to 1000;variable rs:integer range 0 to 100;beginmoney_int:=conv_integer(money);Dq=conv_std_logic_vector(money_int/1000,4);rb:=money_int rem 1000;Db=conv_std_logic_vector(rb/100,4);rs:=rb rem 100;Ds=conv_std_logic_vector(rs/10,4);Dg=conv_std_logi

26、c_vector(rs rem 10,4);end process P2;P2_2:process(licheng)variable licheng_int:integer range 0 to 9999;variable rb:integer range 0 to 1000;variable rs:integer range 0 to 100;beginlicheng_int:=conv_integer(licheng);lDq=conv_std_logic_vector(licheng_int/1000,4);rb:=licheng_int rem 1000;lDb=conv_std_lo

27、gic_vector(rb/100,4);rs:=rb rem 100;lDs=conv_std_logic_vector(rs/10,4);lDg=conv_std_logic_vector(rs rem 10,4);第三部分:数码管显示部分(续)第三部分:数码管显示部分(续)end process P2_2;P3:process(q)beginseldata= lDq; DIPdata= lDb; DIPdata= lDs; DIPdata= lDg; DIPdata= Dq; DIPdata= Db; DIPdata= Ds; DIPdata= Dg; DIPdata=0000;DIPS

28、EGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEG=00000000; end case;end if;end process P4;end Arch;第三部分:数码管显示部分(续)第三部分:数码管显示部分(续)c47模块作用输入second数据信号、minute数据信号和hour数据信号转换成相应的七段数码管数据信号和地址信号输出当hour输入为236时,hourout输出为1,当hour输入为722时,hourout输出为0。第三部分:数码管显示部分(续)第三部分:数码管显示部分(续)library ieee;

29、use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity c47 isport(sec,min:in std_logic_vector(6 downto 0);hour:in std_logic_vector(5 downto 0);clk_scan:in std_logic;SEG:out std_logic_vector(7 downto 0);DIP:out std_logic_vector(7 downto 0);hourout:out std_logi

30、c);end;architecture one of c47 issignal q:std_logic_vector(2 downto 0);signal dig1,dig2,dig3,dig4:std_logic_vector(3 downto 0);signaldig5,dig6,dig7,dig8:std_logic_vector(3 downto 0);signal data: std_logic_vector(3 downto 0);signal sel:std_logic_vector(2 downto 0);beginP1:process(clk_scan)beginif(ris

31、ing_edge(clk_scan) then q=q+1;end if;end process P1;P2:process(hour,min,sec) begin dig1=00& hour(5 downto 4);dig2=hour(3 downto 0);dig3=1111;dig4=0& min(6 downto 4);dig5=min(3 downto 0);dig6=1111;dig7=0& sec(6 downto 4);dig8=sec(3 downto 0);end process P2;P4:process(q)beginseldata= dig1;

32、DIPdata= dig2;DIPdata= dig3;DIPdata= dig4;DIPdata= dig5;DIPdata= dig6;DIPdata= dig7;DIPdata= dig8;DIPdata=1111;DIPSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEGSEG=00000000; end case;end if;end process P5;P6:process(hour)beginif ( hour=100011 or hour=000000 or hour=000001 or hour=00

33、0010 or hour=000011 or hour=000100 or hour=000101 or hour=000110 ) then hourout=1;else hourout=0;end if;end process P6; end one;第四部分第四部分 点阵显示部分点阵显示部分lDM_ROM点阵显示模块作用l将要显示的汉字或字母按照“1”为点亮,“0”为熄灭的规则设计程序,并显示在两个8行8列的点阵显示模块上。第四部分第四部分 点阵显示部分(续)点阵显示部分(续)library ieee;use ieee.std_logic_1164.all;use ieee.std_lo

34、gic_unsigned.all;use ieee.std_logic_arith.all;entity DM_ROM isport(reset:in std_logic;clk_scan:in std_logic;DM_OUT:out std_logic_vector(7 downto 0);add_rom:out std_logic_vector(7 downto 0);end DM_ROM;architecture Arch of DM_ROM issignal q:std_logic_vector(4 downto 0);signal sel:std_logic_vector(4 do

35、wnto 0);beginadd_rom=000&sel;P1:process(clk_scan,reset)beginIF reset=0 THEN q0);ELSIF(rising_edge(clk_scan) then q=q+1;end if;end process P1;P3:process(q)beginselDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUTDM_OUT=00000001; end case;end process

36、P3;end Arch;第五部分:数字钟的报时及发光二极第五部分:数字钟的报时及发光二极 管花色显示部分管花色显示部分lalert_new模块作用l00分钟时从00秒59秒时段speaker按照1K赫兹的频率报时l循环点亮发光二极管。第五部分:数字钟的报时及发光二极管花色显示部分(续)第五部分:数字钟的报时及发光二极管花色显示部分(续)LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY alert_new ISPORT(clk : INSTD_LOGIC;cp1khz:INSTD_LOG

37、IC;dain : IN STD_LOGIC_VECTOR(6 DOWNTO 0);speak: OUT STD_LOGIC;lamp :OUT STD_LOGIC_VECTOR(2 DOWNTO 0);END alert_new ;ARCHITECTURE fun OF alert_new ISsignal count :lamper:process(clk)beginif (rising_edge(clk)then if (count = 10) thenif (count =00) thenlamp = 001 ;elsif (count = 01) thenlamp = 010 ;el

38、sif(count=10) then lamp = 100 ;end if;count = count + 1;else count = 00;end if;end if;end process lamper;END fun ;std_logic_vector( 1 downto 0);signal count1: std_logic_vector( 1 downto 0);BEGINspeaker:process (clk)begin speak =10) then count1=00;elsecount1 = count1 + 1;end if; end if;end if;end pro

39、cess speaker;第六部分:整体电路连接部分第六部分:整体电路连接部分l64选32数据选择器作用lsel=1时选择输出里程计费部分lsel=0时选择输出计时部分。第六部分:整体电路连接部分(续)第六部分:整体电路连接部分(续)LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY MUX64_32 IS PORT( d_in1,add_rom1,seg_in1,dip1 :IN STD_LOGIC_VECTOR(7 DOWNTO 0);seg_in2,dip2,d_in2,add_

40、rom2 :IN STD_LOGIC_VECTOR(7 DOWNTO 0);SEL :IN STD_LOGIC;d_out,add_rom_out,seg_o,dip_out :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END MUX64_32; ARCHITECTURE ARCH OF MUX64_32 IS BEGIN seg_o=seg_in1 WHEN SEL=1 ELSE seg_in2;dip_out=dip1 WHEN SEL=1 ELSE dip2;d_out=d_in1 WHEN SEL=1 ELSE d_in2;add_rom_out=add_

41、rom1 WHEN SEL=1 ELSE add_rom2; END ARCH;第六部分:整体电路连接部分(续)第六部分:整体电路连接部分(续)l32选16数据选择器作用lsel=1时选择输出数码管数据和地址信息lsel=0时选择输出点阵数据和地址信息第六部分:整体电路连接部分(续)第六部分:整体电路连接部分(续)LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MUX32_16 IS PORT( d_in, add_rom :IN STD_LOGIC_VECTOR(7 DOWNTO 0);seg_in,dip :IN STD_LOGIC_VE

42、CTOR(7 DOWNTO 0);SEL :IN STD_LOGIC;seg_o,d_out :OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END MUX32_16; ARCHITECTURE ARCH OF MUX32_16 IS BEGIN seg_o=seg_in WHEN SEL=1 ELSE d_in ;d_out=dip WHEN SEL=1 ELSE add_rom ; END ARCH;第六部分:整体电路连接部分(续)第六部分:整体电路连接部分(续)控制模块作用当SEL=0时add_PIO对应点阵地址当SEL=1时add_PIO对应数码管地址当RST_P

43、IO = 0时不写入底板当RST_PIO = 1时写入底板第六部分:整体电路连接部分(续)第六部分:整体电路连接部分(续)library ieee; use ieee.std_logic_1164.all;entity KH_Cntrl_2 is port(SEG: in std_logic_vector(7 downto 0);DIO: in std_logic_vector(7 downto 0);sel,RST_PIO: in std_logic;nCS0_PIO: out std_logic;nOE_PIO,nWE_PIO: out std_logic;data_PIO: inout

44、std_logic_vector(7 downto 0);add_PIO: out bit_vector(4 downto 0);end KH_Cntrl_2;architecture KH_Model_A of KH_Cntrl_2 is SIGNAL temp:std_logic_vector(8 downto 0);begintemp=sel & DIO;process(temp,RST_PIO,sel)begin if(RST_PIO = 0) thennCS0_PIO = 1;nOE_PIO = 1;nWE_PIO = 1;elsenCS0_PIO = 0;nOE_PIO = 1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论