EDA365电子工程师网

标题: FPGA问题 [打印本页]

作者: 1292569609    时间: 2014-6-30 11:53
标题: FPGA问题
//偶数分频器,外部带入两个参数决定分频系数。默认是2分频0 `* ]" |: P5 r- }" i* g
//divdFACTOR--分频系数,实际分频数为divdFACTOR*2
+ c9 O/ a& F) K3 M//divdWIDTH--分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR9 J, c8 w* W2 l; q* t; [( U
module gen_divd(reset,clkin,clkout);/ t, M% U$ N! E! m, g( M1 g
        input reset,clkin;
0 H. I6 T' E- ^& O        output clkout;1 W' e/ W* h- M" H4 _) U# ]
        parameter divdWIDTH=1;//分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR9 t6 A7 J) P4 X0 P
        parameter divdFACTOR=1;//分频系数是divdFACTOR*2
6 P/ {& d, P7 n. ^+ A' R7 |  a        reg clkout;
, ?+ _+ [0 s& O0 ~        reg [divdWIDTH:0] cnt;
5 e% o$ U' `2 o0 P        8 W" }* I% L; j6 y9 Y1 u" i
        - q1 G* I. I$ F% ?* K) L
        always @ (negedge reset or posedge clkin), o6 t9 q8 M8 ?  I
                if(reset==1'b0)9 g! z: m: c7 E) D- A# F
                        begin  \' }9 Q+ c( _. S2 i! J
                        cnt=0;! z( _2 [$ `! w5 g4 i' L! ~: q4 G
                        clkout=0;9 B7 P$ l$ \' E; J) \5 _% t
                        end9 G- U& |6 O) C9 ~5 `$ n( G
                else
& Z+ E  r  R0 z! U# e$ b                        begin& A  E" ?# V0 n. v2 l* K
                        cnt=cnt+1'b1;//常数1要指定位数,否则默认是32位的5 `7 R/ K- x8 h, E' C( d: i) o2 w+ g
                        if(cnt>=divdFACTOR)
" J2 U; D! Q& R& o7 y                                begin
% ~* g9 N3 o5 p$ z4 o                                cnt=0;
4 j# T' _; d2 {9 Q! z2 X                                clkout=~clkout;
# X  p9 L' c; Z7 W/ J! b                                end ( B1 W2 S, I) ~0 |6 v
                        end* W$ T+ a+ y$ i- I2 {6 t! I: V
! ^  I/ j" @/ S9 Z0 c
endmodule
+ v9 @( M- m+ l  t& `( N) p  ]7 L0 W) X/ V
`include "gen_divd.v"4 w( `. E. ]  ]
# X* Q8 W! M% a6 c0 O% N: G
module led_w_dir
; r3 J1 t! u0 ~        (  Y% ~" F8 X' o' w7 f( I6 x% t
                ClkIn,
, L3 }5 `' \- {                KeyIn,/ e, M& d8 O6 \6 j1 k( p* ?
                Resetb,' V2 x, O3 o) A1 r
                LedOut6 i- y( N" v) E  m
        );, |$ M& `5 j/ K3 h
        input ClkIn,Resetb;
6 _/ \( C; Z& ~$ G& F& B" M        input [2:0] KeyIn;
' Z& d6 _" {7 ?, T        output [2:0] LedOut;  n% ~5 Q8 @; g' E& G% I
        2 Q) N& s, D4 F
        reg [2:0] LedOut;
( ^3 F* k7 L/ O% J        wire ClkLed;
. H2 L( h# \2 g5 |- e$ c% r' J        reg [2:0] Cnt;
; c; J2 D1 R0 d  S, N       
4 A! z5 E% P7 i" x        defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频% a7 E. ~; S, j" a0 ^
        gen_divd Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));       
//帮忙解释一下是什么意思啊。8 C, G' v, N' B- {% W; H( D
       
! _6 a9 {2 u+ S) D        always @ (posedge ClkLed or negedge Resetb)
  z  E8 o5 K1 r1 ~) A                if(Resetb==1'b0)6 n5 Z  P5 Q# {# a
                        begin8 o# I; B- ?6 W5 V
                        LedOut<=3'b111;% E. p' A; }5 H* Z
                        Cnt<=3'd0;
! L, b+ |2 Y7 s% p                        end
: ^1 A, q" I0 E! b                else
; b3 n9 G7 e2 d1 P6 M                        begin
& i% f  H4 o; {* a  Q2 |                        if(KeyIn==3'b000)
& y9 {' K7 {4 {; L2 q' x! j1 l                                begin
* a0 }# E' g: c/ D$ z+ I% ?                                if(Cnt<=3'd2)
- ~, u! N3 E2 W5 \                                        begin" S# i9 k' B5 R1 u' U7 g+ B
                                        Cnt<=Cnt+1'b1;" b5 f2 K$ t4 K
                                        LedOut<={LedOut[1:0],1'b0};//拼接, L5 p* D  A3 w" a) h
                                        end
& d+ n( M' ]1 m1 J& J. X* N                                else       
) L" f2 s2 |  z                                        begin
: ^7 |9 k1 R7 T- {: U! l. @                                        Cnt<=3'd0;8 a; c% O: {, `0 c% A
                                        LedOut<=3'b001;; K2 A% ?5 w  ]- P* B
                                        end4 M  d+ I& K) p
                                end
* W! Q9 r' H! g2 N: `- {                        else if(KeyIn==3'b111)
' Y* n" L' S( [+ t$ I. o) l  ~                                begin% `7 p' u0 j7 h6 t9 i7 K) a+ \: a
                                if(Cnt<=3'd2)
- v+ ^0 S/ N' `8 i- S! M" Y- ?                                        begin
) ^% j2 b5 j! [: K- }                                        Cnt<=Cnt+1'b1;
+ \+ a- G% |4 B. J& Q; ^8 U( M- W                                        LedOut<={1'b0,LedOut[2:1]};. G, V# `% F3 f" C& R- S
                                        end7 {8 D" H( Q9 p' G. M( r+ H$ }
                                else        , R) T+ N3 L7 }  \) q2 [2 f
                                        begin
% d4 M: Z: {; r) z: [( Z' k                                        Cnt<=3'd0;: I! u+ V4 O* v9 _3 p. G  i) W
                                        LedOut<=3'b100;
) U# L, D6 q0 e8 E% \/ K                                        end
/ Q- ]8 S- n% w" p6 Z                                end
8 m; O% r4 G% L  N6 a* i                        end- e& W: X" O8 ^
endmodule
作者: 1292569609    时间: 2014-6-30 11:54
求高手解释一下红色画线的语句什么意思 啊,我是一个初学者
作者: lvsy    时间: 2014-6-30 17:12
1292569609 发表于 2014-6-30 11:549 _' c8 T- Z0 d) g, V/ Y
求高手解释一下红色画线的语句什么意思 啊,我是一个初学者

. K$ n7 R) [' O5 e  }+ N% @+ J这是systemVerilog的语法:# ^3 X% g4 J' G7 \) p. H$ b: O
defparam  Gen_ClkLed.divdWIDTH=23, Gen_ClkLed.divdFACTOR=10000000;
7 s% X2 R3 O- X6 v0 g+ |
! M, v- U8 y2 U% b( A) f5 V& e# |重新定义了层次结构(Gen_ClkLed在下一句里定义)里的参数divdWIDTH,divdFACTOR;
- e$ @8 ?$ q5 g0 B% S; g
, Q% j4 w5 R" G4 n& ?gen_divd   Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));   
) B% o; A0 ~+ o* n
$ G) X2 S( K5 d& P例化了gen_divd模块,例化名是Gen_ClkLed。其中的参数divdWIDTH,divdFACTOR前一句defparam语句里已经定义过了。
作者: 1292569609    时间: 2014-7-1 10:00
好,谢谢啊
: F1 m3 c4 e$ T1 m. H" ]0 M1 q* O  R
作者: 1292569609    时间: 2014-7-1 10:04
再请教一下啊
1 h, T6 ~5 v* b
8 p- N' Q" @3 q* CError (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declared more than once1 a6 R1 e% J0 q3 N( C# {$ a
这个什么原因啊
作者: lvsy    时间: 2014-7-1 10:27
本帖最后由 lvsy 于 2014-7-1 10:40 编辑 ; R" e  K* T0 ?  }8 F$ O( y+ f
1292569609 发表于 2014-7-1 10:04' K- h7 [4 P: t
再请教一下啊: V' Z8 E8 q7 J! b0 S8 d

) x0 Q) J- ?0 ?) R' H, w2 I3 SError (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declare ...

8 \4 N5 P) r: I6 R0 ^6 d5 ]' l+ X- c- C7 N& ~- r
是不是指Gen_Clked?2 |  p, W$ a  v* C4 G$ ?1 X" r

- j% `) A! T! n8 \; V+ }7 W把defparam 这句移到gen_divd Gen_ClkLed(......); 模块例化的后面试试看!* R1 M* x9 @+ I& q# b

7 G7 l8 \( t2 [; l! l! B或者这样例化
0 m; \# X/ W) F$ l9 ]
& f; n. E/ a2 u/ p6 j4 cgen_divd  #(.divdWIDTH  (23),
* x% U& L7 e* j. ?4 M  t( b                 .divdFACTOR (10,000,000 ) )
" q- K. Q( m# U! d& \: J  \0 e0 B' g3 @; T) G+ e$ n0 E( r
               Gen_ClkLed (.reset(Resetb),8 h$ P% n! w! t  ~) m/ @
                                .clkin(ClkIn),. A& `7 d9 V& D! m8 Q1 O% f
                                .clkout(ClkLed));        
作者: 1292569609    时间: 2014-7-1 10:37
好的。谢谢啊
作者: 1292569609    时间: 2014-7-1 10:38
现在提示这个Error (10663): Verilog HDL Port Connection error at led.v(8): output or inout port "reclk" must be connected to a structural net expression1 C0 i1 I3 p0 c( X% h( w4 ]& T) ~
是什么意思啊6 Q* j4 m# s& E# c

作者: 1292569609    时间: 2014-7-1 10:39
`include "gen_clk.v"
- W* v/ N+ N2 j& T- A9 ~. C% F$ j" Q+ b9 R4 k( U
module led(clk1,reclk1,cout1,cout2);; _. V- P8 U/ N1 `
input clk1;
% m. c0 G1 x% A8 A5 I6 youtput reclk1,cout1,cout2;
* p  w! Y6 v/ qreg reclk1,cout1,cout2;, d( u! Z# L$ B

; c2 D- }0 S" Ngen_clk led(.clk(clk1),.reclk(reclk1));/ H. s' N# B1 Z* N
defparam led.width=2000000; //频率是0.08S;
8 a3 `( S" H+ x3 ^9 K6 L4 O6 p9 G( L" _( E% A1 a
always @(negedge clk1)) _3 S! q5 t+ d
    if (reclk1==1'b1)
/ n' [3 t) I5 G, A9 n+ ^         begin  z  k) W4 y3 o
         cout1=1'b0;0 _$ z$ F3 P- H  }! _
         cout2=1'b1;& @! N. G6 B4 P
         end
% p) l* |( \  W+ J) K         else6 L7 `% d! V3 W0 a# v: L
         begin
* A& a  S. F  d9 j6 A5 E         cout1=1'b1;
+ h/ P$ s& T# m" u! G5 m         cout2=1'b0;
8 Q! G8 |  a7 i5 o    end; M6 V+ O$ E2 C
endmodule
9 g) l- D8 h& \# ]8 e6 b' T8 V' H! b3 c% e/ X3 z) H) |, {2 b
module gen_clk(clk,reclk);/ @) |! p% p5 [4 y4 B
input clk;3 G8 B" M+ \( G" E: o8 B0 r
output reclk;
6 n3 c$ O$ p1 v: M) Breg reclk;
% r+ y3 N. U+ @parameter width=1000000;//分频数1000000/25M=0.04s
) K  V5 e& A( J; j4 [" u+ o+ M$ b$ @reg[11:0] count=12'd00;
; K) F, y2 K  m5 `* W2 kalways @(negedge clk)/ Q8 ~1 q8 W2 i
  if(count>=width)2 S% Q. _+ s; v; H7 \
  begin
8 O  _& q2 r" T& Y& j3 x6 S  count=0;7 n6 T* l; b$ _1 |  G
  reclk=~reclk;& v7 s7 I9 E! `9 ]  v3 r2 C' z2 }7 C
  end
+ q$ j0 u. R7 s7 h% ]9 [3 Q5 ~ else count=count+1; - j! ^0 z; ^+ O" u' e
endmodule 8 I6 S* b+ o% g8 b" U* Y' [
这是全部的程序了* K1 @) A6 \( M: S( U4 M: m# b5 }- v
麻烦指点一下啊
作者: lvsy    时间: 2014-7-1 10:50
1292569609 发表于 2014-7-1 10:39/ ]' d9 d- ]0 o; e- w3 q
`include "gen_clk.v"  Y$ [$ Z. x1 F& w/ Z
: ?0 i3 K2 ?8 @* V
module led(clk1,reclk1,cout1,cout2);
( V2 R6 A5 V8 H4 e. |
发现了两个问题:
2 L( L0 P8 Q3 J" T- {7 I1. gen_clk模块里reclk没有初始值,综合会发现latch。
, E$ Q; `' o" H2. led模块里reclk1不应该定义成reg型,应该是wire型。
作者: 1292569609    时间: 2014-7-1 11:37
为什么要定义为WIRE型了( \# O+ _6 M# `' S" q/ V9 P3 p

作者: lvsy    时间: 2014-7-1 13:11
1292569609 发表于 2014-7-1 11:37$ a- l5 `3 S8 x& D5 M
为什么要定义为WIRE型了
6 @3 S; w0 ~1 U1 ^! `
因为它是gen_clk模块输出的,led模块调用了gen_clk,在led模块里就不能再对它赋值了,否则就变成多重驱动了。
作者: 1292569609    时间: 2014-7-1 14:00
明白了,谢谢啊




欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2