找回密码
 注册
关于网站域名变更的通知
查看: 381|回复: 1
打印 上一主题 下一主题

基于Xilinx FPGA的数字跑表实现

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-3 19:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
基于Xilinx FPGA的数字跑表实现
( 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+ {

该用户从未签到

2#
发表于 2019-5-5 17:50 | 只看该作者
发帖是心得 回帖是美德
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-1 23:35 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表