EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
( g" {; u- _9 O# ^
% `5 o8 b% ]& ]% ]7 {; Q这个项目的主要目的是通过设基于Xilinx FPGA计数字跑表,掌握于Xilinx FPGA的工作原理,掌握动态LED的显示原理,数字跑表的工作原理。 原理: 该跑表有3个输入端,分别为时钟输入(clk)、复位(clr)和启动/暂停(pause)。其结构示意图如下图所示: ![]() ! l; f! H! U( ?
复位信号高电平有效,可对整个系统异步清0;当启动/暂停键为低电平时跑表开始计时,为高电平时暂停,变低后在原来的数值基础上再计数。 跑表的计数可以分为以下三个模块: a.对百分秒进行计数,每计满100,产生一个进位cn1。 b.对秒进行计数,每计满60,产生一个进位cn2。 c.对分钟进行计数,每计满60,系统自动清0。 对所计时间的显示也是本实验的重要组成部分。在此处,我们用了6个LED数码显示管,采用动态扫描的方式进行数字的显示。采用直接位驱动,对应接口:SEL0~SEL3,每一位控制一个LED,悬空为高电平。 % K- S& S8 \5 G2 M6 I. x! Y4 q
( e! o, N3 @: o' r0 j
源代码
$ o$ `0 [+ } Z1.Verilog源代码,StopWatch.v
1 T: _! N7 |" R: f- _. [! }module stopwatch(led_clk, led_rst, led_sel, led_seg, pause);2 ?0 ]* @- V" ~/ |
input led_clk, led_rst, pause;
" J8 C& ?- R% ^1 Z output reg[3:0] led_sel;+ O0 f+ }8 S( L* X. I# O. Z1 R: L
output reg[7:0] led_seg;
# v7 o, B* v9 P$ j8 E. X8 v1 ~' l' ^9 B0 C2 {: i- ?
integer countsel, countscan;& c* u# v5 }3 o7 V
reg [3:0] led_num1, led_num2, led_num3, led_num4;& H: |; m9 p$ C8 r
reg divclk;5 l% ]: z7 R; w- z) x2 x. ?
reg run;8 p+ b9 N5 r- N% \$ n6 o
/ k/ f' A3 {* X4 X4 y
parameter ZERO = 8'b11111100,ONE = 8'b01100000, TWO = 8'b11011010;
5 T6 b* Z' F+ f/ k( K parameter THREE = 8'b11110010, FOUR =8'b01100110;
' U. s* F5 h3 D+ D parameter FIVE = 8'b10110110, SIX = 8'b10111110, SEVEN =8'b11100000;
0 c& t3 W M! }6 ^ parameter EIGHT = 8'b11111110, NINE = 8'b11110110, BLANK = 8'b00000000;1 y5 L1 m8 O. ~6 Q6 L2 d& D' v- R
6 F$ C1 f% ~8 ^ always @(posedge led_clk or negedge led_rst)9 I$ y4 T9 }' r; R
begin
' g' e* Q( j" [) S if (!led_rst)
6 R4 u- ]& M- W" l3 x begin
1 j( e- q, }# | c countscan = 0;
, N$ i# N5 L: o7 a3 h) h9 n- M: @+ @ divclk = 0;; F% Z) s7 Z& r/ ~! i2 S: g6 p
end$ k+ P8 C" Z9 R2 h7 ]1 {
else
+ {- e/ {5 g- ?' M8 y begin' m/ p( k4 L7 G+ T0 K, s& Z( \
if (countscan == 99)+ ] G1 I7 z7 j" n9 Q* v4 m$ N
begin
) ~0 S( i8 S! \( J- ?; V; L/ R, j3 X3 F3 M countscan = 0;
) J0 |1 u; O! N. Y1 E divclk = ~divclk;
4 H9 m N/ g" A0 S1 e J, w2 K' s end8 D, U% C4 c4 R* c1 [9 a
else: _* l3 A3 E# C \2 s1 c2 ?
countscan = countscan + 1;
. n/ K; e1 g2 u! z end9 o3 u3 n6 V2 ^3 x8 p8 B
end7 }* i# ?' Q, Q; R+ E! F+ E# }
% X+ g8 H# _6 ]( |5 h I
always @(posedge divclk or negedge led_rst)
! U! L/ x8 k& k' [ begin
! U( Y) q2 z9 W$ a8 ]5 v3 _ if (!led_rst)
5 J5 k4 S5 a$ u begin
^' ~% u9 f7 ]# @7 o. J led_num1 = 0;
3 P* y8 t( w* Q led_num2 = 0;
; p' P, A j2 r+ }, p$ G) e" w3 _ [ led_num3 = 0;1 p& W G) [" f4 z" w' L+ F
led_num4 = 0;
2 W0 @, j2 u& j6 ]) _* B! U8 z# S run = 0;
; f7 j; r4 [$ T/ v# S end; k8 G: H+ b0 q
else if (!pause)
. v* A! q- t% L$ { run = ~run;
0 t V! L' P4 n, p; S+ S else if(run)$ m3 r v+ R; @; q- B
begin
& Y0 R; c2 P4 K0 j if (led_num1 >= 9)/ }9 u8 }; w7 f
begin, I. Y, {- P1 l# P+ ^ L) m
led_num1 = 0;
/ \0 Z8 C) ~/ s& S: S if (led_num2 >= 9)
/ w5 n; F5 U4 f/ r begin+ Y5 \8 o' S& P3 Z& b7 g, |/ N( o
led_num2 = 0;/ @4 D+ d" q8 s6 z: ]: G8 ^% {
if (led_num3 >= 9)7 M2 a8 U2 K+ T x& @: Z2 d0 J
begin
! g* ?' W5 c& G2 W* G5 w9 E# z. s led_num3 = 0;; N$ [0 h e+ @9 |# Z
if (led_num4 >= 5): |1 G3 a* p7 N6 q. C$ @
led_num4 = 0;1 h' Z2 _! c# |, `
else0 m' r5 r4 X9 W& X& `
led_num4 = led_num4 + 1;0 Y; S2 e @, d, e
end6 N( w- K: X3 s$ P# e
else: G ]1 c, \9 o
led_num3 = led_num3 + 1;
+ L N2 l n# _, _; A/ v end
) S! ^1 q+ V- k E5 p6 U else
+ R1 Y6 r1 ]& d6 u led_num2 = led_num2 + 1;
+ f7 t K2 ?( h5 s k* { end" h$ \' d, E2 m% q7 J9 i- _# W
else
0 g. u8 k1 _2 I6 e$ ]* c& b. v led_num1 = led_num1 + 1;
" P; s/ g: a0 ~- e( U end
" ~$ u6 A- o5 d else
8 i0 H) M. ?1 y) }- w8 ]* o begin
' K) ` p! [' u7 P: c* x led_num1 = led_num1;# }/ M6 p6 C" R' R1 W$ Y0 Y0 u
led_num2 = led_num2;
8 ^, l/ {9 ~( U5 i led_num3 = led_num3;
/ h' s; r0 [8 z/ d8 D/ z led_num4 = led_num4;, z3 N" a0 q3 v7 D4 h4 `! [
end
6 J# C; f6 C _* d8 X/ q end
" ~3 N) L3 n: g/ l5 T
3 l3 A, n8 C5 I# y% { always @(posedge led_clk or negedge led_rst)
# K$ B5 N$ c; H begin
# E8 x1 r$ M" j- |3 b if (!led_rst)
* T' a/ K! y' `. `( p# { begin' ]6 s7 m7 _& s) x
countsel = 0;9 r8 x2 D O: k' ?( c
led_sel = 4'b0001;
" @9 }8 a6 \$ f# e2 l4 a end" E( {7 D; e( t7 M8 a
else
) l1 R1 d3 U3 w6 f+ Y; G- W begin @. m; R6 G5 _% ?5 u' N2 O
if (countsel == 4)1 X! g! U. v/ l8 h# Q y
begin# W4 s0 ?$ l9 k- [$ u/ U- C' d" ]
countsel =0;9 t4 Y2 {, t4 V7 A0 M
if (led_sel == 4'b1000)
# t8 E9 [& i. i9 \. K& z4 f$ T: o led_sel = 4'b0001;0 G L+ T% o. k( D, b7 b# I9 |+ n4 ~
else+ E; [; A3 u, Q' z
led_sel = led_sel << 1;
' T$ a# L' V6 X end( b# A$ r0 m5 S8 r. {4 c' g
countsel = countsel + 1;
# d8 M( q9 r1 n7 t' O+ s# e; r end
, t, A7 x- y: X( p6 w% [ end9 t- f+ j9 o( _7 e' B, m! x3 m$ y }9 d
3 d/ D( S6 f. \ always @(led_sel)
1 j3 |! x$ P2 J begin: v- T$ {% W. L0 q
case (led_sel)8 H. f' e0 y5 J, f D2 d$ j3 ^
4'b0001 :# J/ d% j0 Z% w/ z
begin: c, A+ j- P- j Y. L
case (led_num1)' p# n, x- R% `
0 : led_seg = ZERO;( u3 a, D0 ` u( `- O% l4 J8 L. |
1 : led_seg = ONE;
6 C y: a" M6 ? 2 : led_seg = TWO;" S9 v4 G8 a3 ^9 K9 a) O( m
3 : led_seg = THREE;
9 e' \' P# o) s0 K$ Z% B2 _3 R$ k 4 : led_seg = FOUR;/ Z' N- q7 ^3 H2 S
5 : led_seg = FIVE;- X4 i |. k9 ^7 k7 |6 ?$ C
6 : led_seg = SIX;
) y9 O' I! @* k7 v z3 d- S# g e 7 : led_seg = SEVEN;
% G9 L$ `% C' F* P9 { 8 : led_seg = EIGHT;
+ f; m# F! h) ] 9 : led_seg = NINE;0 y U2 q8 H1 ]. S# N( x5 u! y
default : led_seg = BLANK;" @ K G& U7 p
endcase
# V) S7 a6 D4 o' v end( I) w$ I; d8 C/ i, d; r8 z( W
4'b0010 :% b/ v: t3 M* @5 V* q+ n
begin6 s- c/ L1 p9 i) f5 W
case (led_num2)9 ]5 Z' X2 G' a4 R0 p) L9 Y1 W, l
0 : led_seg = ZERO;$ ~3 s# `8 D" H. v6 t+ J6 B& v
1 : led_seg = ONE;
) U, k! _: [1 o# {, \ 2 : led_seg = TWO;: `( {% b. ?4 g
3 : led_seg = THREE;
4 Y* c& W! N6 t7 q* Z1 s 4 : led_seg = FOUR;
1 Q2 F! d! B4 R% Y, K7 d: t 5 : led_seg = FIVE;8 I: n V d" F3 c% P
6 : led_seg = SIX;
# a, ~2 ?2 e. q8 C2 ~) t 7 : led_seg = SEVEN;( H" o7 F9 o) \2 A) C
8 : led_seg = EIGHT;7 g& R5 q- z+ S5 a9 b0 U
9 : led_seg = NINE;
/ r/ ]( J* Q( o: J0 \: b2 Z default : led_seg = BLANK;: H% y" @ v( }, i4 _7 H4 \
endcase
4 J2 @+ C% I8 I+ @5 M% E0 o2 n end, Q8 a$ K0 M/ j5 w" l! [
4'b0100 :
6 U; H% S9 U8 B% |7 ` begin
" {2 e# `: t p7 H case (led_num3)# f- Y+ B) W7 m4 \8 a0 K4 U
0 : led_seg = ZERO+1;8 G. D ?# I. `. x
1 : led_seg = ONE+1;
) c# f% f5 n' `7 N/ ~% P 2 : led_seg = TWO+1;8 c/ Z& d) P# m, a. {
3 : led_seg = THREE+1;/ |, e. e8 z( i- w4 |5 a+ s' m8 q
4 : led_seg = FOUR+1;
, f; V; }' J8 T$ l2 a9 ?3 S* v 5 : led_seg = FIVE+1;
- F3 e; V! p2 n 6 : led_seg = SIX+1;/ ^, b% f: o% L) V0 w
7 : led_seg = SEVEN+1;0 O5 d$ S/ B& G/ i
8 : led_seg = EIGHT+1;
; p$ v9 w0 O3 A" d4 Z 9 : led_seg = NINE+1; @, T; k$ v% r3 a
default : led_seg = BLANK;8 ^! ^3 w2 p. _, G% W1 K# m
endcase
* S. `; W- @! Q- t end
4 _7 f! C/ R: b4 ] [, z 4'b1000 :
! v; U7 _& w+ l- W8 I/ X0 V begin' l% D; i1 L/ y4 q
case (led_num4)
% S5 n6 W3 p, ]4 Y, `) c 0 : led_seg = ZERO;
7 _: E/ R" d/ ?& @) f5 r 1 : led_seg = ONE;; n/ @& W& x& [, y: g
2 : led_seg = TWO;# ^, `% g+ K' v" [% s$ d
3 : led_seg = THREE;) J1 k/ ]/ K- @% b) ]' H; z6 Z( ~
4 : led_seg = FOUR;- E6 Z* [# h+ s5 B/ H- D9 v) e
5 : led_seg = FIVE;
% \; I& {% N; H- Z$ k 6 : led_seg = SIX;, j$ e& E! \& ~: I: _4 B
7 : led_seg = SEVEN;' y& R) R# v4 N7 ?
8 : led_seg = EIGHT;
' y0 S+ u( ?' P3 z 9 : led_seg = NINE;
( O4 Y( q, h- w8 X5 h default : led_seg = BLANK;! {! M5 ?" q _
endcase2 V# C: R6 w. H6 {
end8 u- J" ~/ @6 X# r
default6 G" C% F% j! u1 w
begin2 e U8 I& O9 k. ?7 Z2 D
led_seg = 'hx;9 Q! M% ^1 y! P6 O
end
4 Z- P- t# \3 M, Z endcase
- V& D" \$ M* i7 I* ] end6 ^$ `& b% c6 [0 R$ Q
5 c3 z3 \1 s$ Fendmodule
- `) ? q) @9 P5 [0 u2.引脚分配源代码,StopWatch.ucf' t3 w4 p$ i4 W, ~1 _
net led_clk loc = p80; #1KHZ. S T w. i+ ~( q: l
net led_rst loc = p57;
/ t, ?" f- U( a+ znet pause loc = p59;! t4 v- g1 \$ k- f6 I# e
+ o% r; D& r/ t8 v
net led_sel<3> loc = p3;
2 I. L- m9 U$ _- V1 h7 Jnet led_sel<2> loc = p5; A0 I: i6 l n: Y* w9 K4 D# H# k
net led_sel<1> loc = p7;
! l$ ]; w0 d1 h2 Z5 }9 `: a% \: X- Vnet led_sel<0> loc = p9;
+ m* F3 w; A9 b/ f$ ~7 {
: g2 n6 J( ]/ ^net led_seg<7> loc = p14;7 a: [: i$ e J n8 C
net led_seg<6> loc = p16;/ b/ c$ c2 Z0 |+ I# ~3 K0 f
net led_seg<5> loc = p18;
5 f, j/ ~ s7 u! S3 Mnet led_seg<4> loc = p21;4 a( m: `$ d# ?! N( f
net led_seg<3> loc = p23;
7 P+ [, m) K) T2 a7 W2 Hnet led_seg<2> loc = p27;
; w! L4 l9 S# G% L3 D v4 ^net led_seg<1> loc = p30; @/ t2 G! M9 r9 u
net led_seg<0> loc = p33;
+ K3 }" V+ u2 L; F% ?3 s
9 T: A4 J, z% c9 _! R; H) K设计比较简单,但是亮点不少,主要为:1.使用XilinxXC2S200型FPGA器件设计实现2.使用电子EDA实验开发系统的2位拨动开关作为A方向和B方向有车通过的传感器的输入,使用系统的6位发光二级管作为A方向的红绿黄灯和B方向红绿黄灯输出,使用系统的数字时钟作为系统运行的时钟。3.使用Xilinx ISE 6.3软件进行Verilog HDL开发。有感兴趣的朋友可以扩展一下,成功的感觉固然喜悦,但是追求成功的感觉,更让人觉得激情昂扬。( E) ~& T# ]' n; x5 m2 d) W# x7 l+ {
|