EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做的是出租车计费系统,VHDL语言做的,也就是从网上下载的。请问一下下面的程序中SE模块和DI模块是干什么用的啊?拜托帮忙,快答辩了!3.3.1, K3 H5 t- D l% l# }4 D
模块
- _$ w7 r) A# q; \ dJIFEI
4 {0 F' Y7 T( _; a% h的实现
0 V1 F- D& R, U* f& y. q. |该模块是模拟汽车启动,停止,暂停加速。模块如图4: CLKSTART. }1 Q9 f0 u5 U1 H. Q7 r
CHEFEI[12...0]STOP
1 N, g2 m2 d' \; w/ \LUC[12...0]PAUSEJS: }; h; o( H1 }
| $ w1 v4 G9 `8 \# h, B7 ^1 _
图 4
( M& u2 Z C) q: I# c0 l. Q( gJIFEI模 块 输入端口
' }, d1 A+ k& [. g* d* kSTART、STOP、PAUSE、JS& t( U+ \ C/ X4 T# |/ M
分别为汽车起动、停止、暂停、加速按键。程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity jifei is port (clk,start,stop,pause,js:in std_logic; chefei,luc ut integer range 0 to 8000); end jifei; architecture rtl of jifei is begin process(clk,start,stop,pause,js) variable a,b:std_logic; variable aa:integer range 0 to 100; variable chf,lc:integer range 0 to 8000; variable num:integer range 0 to 9; begin if(clk'event and clk='1')then if(stop='0')then chf:=0; num:=0; b:='1'; aa:=0; lc:=0; elsif(start='0')then b:='0'; chf:=700; lc:=0; elsif(start='1' and js='1'and pause='1')then if(b='0')then num:=num+1; end if; if(num=9)then lc:=lc+5; num:=0; aa:=aa+5; end if; elsif(start='1'and js='0'and pause='1')then lc:=lc+1; aa:=aa+1; end if; if(aa>=100)then a:='1'; aa:=0; else a:='0'; end if; if(lc<300)then null; elsif(chf<2000 and a='1')then chf:=chf+220; elsif(chf>=2000 and a='1')then chf:=chf+330; end if; end if; chefei<=chf; luc<=lc; end process; end rtl; 3.3.2; a1 u: l1 w2 K# v+ n' Z8 X D0 b
模块6 ?: b d: G4 _, j1 j
X
7 O# Q8 ~+ U, W+ T0 F! P的实现
* o6 @2 }9 F/ K6 Y- @2 `模块X见图5。该模块把车费和路程转化为4位十进制数,daclk的频率要比 clk快得多。 AGE[3...0] ASH[3...0]DACLK
+ a2 M& Y6 ^& U4 h& v" O% TABAI[3...0]ASCORE4 i3 i7 b8 i, X' T
AQIAN[3...0]BSCORE+ a5 o$ Q( G) J8 K! p
BGE[3...0BSHI[3...0]BBAI[3...0]BQIAN[3...0]7 z6 B/ H* S4 o5 L/ P+ @
| 1 L( L2 C! Y R* f! l( G1 C5 Q- b
图5 X模块 该模块的程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity x is port(daclk:in std_logic; ascore,bscore:in integer range 0 to 8000; age,ashi,abai,aqian,bge,bshi,bbai,bqian ut std_logic_vector(3 downto 0)); end x ; architecture rtl of x is begin process(daclk,ascore) variable comb1:integer range 0 to 8000; variable comb1a,comb1b,comb1c,comb1d:std_logic_vector(3 downto 0); begin if(daclk'event and daclk='1')then if(comb1<ascore)then if(comb1a=9 and comb1b=9 and comb1c=9)then comb1a:="0000"; comb1b:="0000"; comb1c:="0000"; comb1d:=comb1d+1; comb1:=comb1+1; elsif(comb1a=9 and comb1b=9)then comb1a:="0000"; comb1b:="0000"; comb1:=comb1+1; comb1c:=comb1c+1; elsif(comb1a=9)then comb1a:="0000"; comb1b:= comb1b+1; comb1:= comb1+1; else comb1a:= comb1a+1; comb1:= comb1+1; end if; else ashi<= comb1b; age<= comb1a; abai<= comb1c; aqian<= comb1d; comb1:=0; comb1a:="0000"; comb1b:="0000"; comb1c:="0000"; comb1d:="0000"; end if; end if; end process; process(daclk,bscore) variable comb2:integer range 0 to 8000; variable comb2a,comb2b, comb2c,comb2d:std_logic_vector(3 downto 0); begin if(daclk'event and daclk='1')then if(comb2<bscore)then if(comb2a=9 and comb2b=9 and comb2c=9)then comb2a:="0000"; comb2b:="0000"; comb2c:="0000"; comb2d:=comb2d+1; comb2:=comb2+1; elsif(comb2a=9 and comb2b=9)then comb2a:="0000"; comb2b:="0000"; comb2:= comb2+1; comb2c:= comb2c+1; elsif(comb2a=9)then comb2a:="0000"; comb2b:=comb2b+1; comb2:=comb2+1; else comb2a:= comb2a+1; comb2:= comb2+1; end if; else bshi<=comb2b; bge<=comb2a; bbai<=comb2c; bqian<=comb2d; comb2:=0; comb2a:="0000"; comb2b:="0000"; comb2c:="0000"; comb2d:="0000"; end if; end if; end process; end rtl; 3.3.3
5 A1 z! |6 E+ r8 [" v' E! T模块& {4 t! A0 k9 P( z0 ?$ i4 i) B
XXX1& L% L1 J- N: ]2 O N8 W3 C' {: r
实现
' q+ `: h% _1 ?模块XXX1见图6。经过该八进制模块将车费和路程显示出来。该设计采用的是共阴极七段数码管,根据16进制和七段显示段码表对应关系,用VHDL的CASE语句可方便的实现他们的译码。 动态扫描时利用人眼的视觉暂留原理,只要扫描频率不小于34HZ,人眼就感觉不到显示器的闪烁。本系统24HZ的扫描脉冲由相对应的外围电路提供。动态扫描电路设计的关键在于位选信号要与显示的数据在时序上一一对应,因此电路中必须提供同步脉冲信号。 C[2...0]A1[3...0]A2[3...0] A3[3...0]; k, D9 d. C! P. d! [
2 K: _) T. F% v* C
DPA4[3...0]B1[3...0], k7 W( ~& p- U
+ d$ E: o6 Y. h
D[3...0]B2[3...0]B3[3...0]B4[3...0]
# P/ H# ^ v) V8 @) }: z |
% g. D3 |2 N; R4 s- x7 t图 6 模块XXX1 这里采用八位计数器提供同步脉冲,VHDL语言如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity XXX1 is port(c:in std_logic_vector(2 downto 0); dp ut std_logic; a1,a2,a3,a4,b1,b2,b3,b4:in std_logic_vector(3 downto 0); d:out std_logic_vector(3 downto 0)); end XXX1; architecture rtl of xxx1 is begin process(c,a1,a2,a3,a4,b1,b2,b3,b4) variable comb:std_logic_vector(2 downto 0); begin comb:=c; case comb is when”000”=>d<=a1; dp<=’0’; when”001”=>d<=a2; dp<=’0’; when”010”=>d<=a3; dp<=’1’; when”011”=>d<=a4; dp<=’0’ ;
9 C( X1 _1 [( P/ b: jwhen”100”=>d<=b1; dp<=’0’; when”101”=>d<=b2; dp<=’0’;
h$ k( ]6 T) B- @' `when”110”=>d<=b3;
dp<=’1’; when”111”=>d<=b4; dp<=’0’; when6 F: ]4 r% O/ v+ b9 D
others=>null; end5 x4 a( p: e" a4 D7 b) @
case; end
3 R+ `& s& n7 p# C1 E4 Dprocess; end
! b4 F4 ^: X4 p+ v% Hrtl; 3.3.4
! I) O" B' k$ J" Q# v) d模块
: G3 v* ?9 U) H: eSE
6 l1 J- E2 @: |5 N) s ]( u的实现- ]6 u% R0 I0 L$ y7 H
模块
- p8 k4 ]9 i$ {3 H! ]SE
+ V$ u* B% F- k2 g3 W. I5 q见图
) H" \8 G6 I4 f, C6 [9 G7:该模块是系统检测模块。 CLK! E( j$ O+ h' l' J
8 h: m c5 U7 t
A[2...0]
8 {. w5 _$ c$ I |
5 f) H& v$ Y+ q图/ o. N9 ~3 F( O9 b7 }
7 + n, }0 Q% K$ z
SE模
$ t+ [; k! o( j块 模块SE程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity se is port(clk:in std_logic; a:out std_logic_vector(2 downto 0)); end se; architecture rtl of se is begin process(clk) variable b:std_logic_vector(2 downto 0); begin if(clk’event and clk=’1’)then if(b=”111”)then b:=”000”; else b:=b+1; end if; end if; a<=b; end process; end rtl; 3.3.5
# v4 x+ ~% D; H( d8 d3 d" }; g模块
3 `- I; v p" L8 N& eDI) D. {; B% ~& p) ^, ]- k l
的实现" x( r" F7 [7 V7 @# R4 O
模块DI见图 8 D[3..0]
t% v6 G' w9 S1 D) H; V
- x5 F" Q9 {/ J% _5 s0 bQ[6..0]3 x( |/ I" |4 o4 X$ R" T
|
/ I) [1 k, z7 g2 j, W p
# h6 `- L7 z+ Q- J/ \% W
) j' q4 H5 i) q3 D X! p t: |
# O9 S1 U: N0 R: n; I" q图8 DI模块 模块DI的程序如下0 m& S) ^0 _/ C# {4 d2 e( z2 {* s
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity di is port(d:in std_logic_vector(3 downto 0); q:out std_logic_vector(6 downto 0)); end di; architecture* j* Q$ W" g$ N5 ^) y0 }
rtl of di is begin process(d) begin case d is when”0000”=>q<=”0111111”; when”0001”=>q<=”0000110”; when”0010”=>q<=”1011011”; when”0011”=>q<=”1001111”; when”0100”=>q<=”1100110”; when”0101”=>q<=”1101101”; when”0110”=>q<=”1111101”; when”0111”=>q<=”0100111”; when”1000”=>q<=”1101111”; when others=>q<=”1101111”; end case; end process; end rtl; |