EDA365电子工程师网

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

作者: 1292569609    时间: 2014-6-30 11:53
标题: FPGA问题
//偶数分频器,外部带入两个参数决定分频系数。默认是2分频+ _% u( C, o1 O
//divdFACTOR--分频系数,实际分频数为divdFACTOR*2, ?/ Q2 f6 l6 [& W, e) \$ Y
//divdWIDTH--分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR- X) \4 W$ a1 N8 F6 n
module gen_divd(reset,clkin,clkout);
2 k" ?6 r( q$ U2 a        input reset,clkin;! r. ?! J$ f, X
        output clkout;7 G7 j& e1 t% e% S/ b( q! o
        parameter divdWIDTH=1;//分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR+ C! A$ t6 Z7 W& {
        parameter divdFACTOR=1;//分频系数是divdFACTOR*2
; T/ U' V' \$ `6 N& }: ]) s+ C        reg clkout;
' Y/ n' I" f$ T2 I8 W- T8 T3 k        reg [divdWIDTH:0] cnt;
/ O8 b+ _* f  _5 v" X1 G3 L       
7 n6 Q7 B) c& R% R- _1 d* O! d  W. g       
3 S# V8 ?4 I# H) x        always @ (negedge reset or posedge clkin)
! E$ Q6 \; p0 [                if(reset==1'b0)
- M2 `, Z) l7 ]9 H6 ]                        begin" V8 f+ K5 x* q1 P( f  O+ o
                        cnt=0;
6 ~" _0 g% J6 j$ T                        clkout=0;
- {( g' D; C& `/ G5 ], E                        end1 ?4 D( U: t9 r9 l# g
                else; [$ b" a4 F3 Q9 O
                        begin
' S, {* X( X' n                        cnt=cnt+1'b1;//常数1要指定位数,否则默认是32位的
9 e; d$ U3 M: \9 w  x2 \# P9 p                        if(cnt>=divdFACTOR). ~& w" T& d0 a" N
                                begin' E" a" Y9 g4 W. l' d
                                cnt=0;
" q4 k& k* M% ?' M. D( Y                                clkout=~clkout;* U' N) [. m" u1 J) A: ]; h
                                end
% E7 P. Y0 r- {& r! m                        end3 i' N/ y6 r' S4 t" w% A

; v: ?2 q, H, q  R0 E: T/ aendmodule
* r: i# V' w$ ^! }9 v
. j" X) T6 f3 N0 M( _- [% W`include "gen_divd.v"; |4 P" O5 d# [) Y) U  v& L6 G3 Y

- h9 P  u% G) p( {6 s6 [) umodule led_w_dir) P$ W! t( p2 H- e! C* D
        (
1 p8 n( e0 Q6 ]: u3 `5 l" L, B                ClkIn,
# A0 A) `/ Y  E& r8 O1 u7 s! U                KeyIn,
# h" L( P1 A  l                Resetb,4 S+ Z4 _$ |" B5 \) c# }
                LedOut$ u8 Z) v7 y6 S: R: @
        );! b: H* ]$ H3 S
        input ClkIn,Resetb;
1 V3 W) r2 e2 x: u        input [2:0] KeyIn;
$ }/ v: B! I2 S  P% w1 o        output [2:0] LedOut;0 ^! @5 f" _# B
       
3 E/ g* ]. L* L4 R1 |: ]+ k        reg [2:0] LedOut; 5 C. z3 V5 W1 ]' {! l: x/ E7 P/ N! O
        wire ClkLed;! w6 b9 Y; s1 y/ B% Y5 N
        reg [2:0] Cnt;
  T: o+ P9 V8 F6 a9 _' Q       
7 }3 E) }/ S4 @3 N% P9 G        defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频4 F4 h  ^5 [, l
        gen_divd Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));       
//帮忙解释一下是什么意思啊。
# r/ @: }2 d+ z       
8 h4 L0 S& c" w        always @ (posedge ClkLed or negedge Resetb)
0 H% R5 p% T% L9 O                if(Resetb==1'b0)
0 N" z$ C- e& d) p  O6 d8 x                        begin
% X1 L# Z9 q5 y: X1 D. t                        LedOut<=3'b111;+ p5 n3 j4 h& Z- i
                        Cnt<=3'd0;' q7 ], l. |  X2 Z- @- K( ]
                        end
* b9 A: y7 |5 p2 |4 O                else; L% _9 ]% i7 ~9 f2 ]
                        begin+ \4 o; G' v9 p
                        if(KeyIn==3'b000)0 M  ^2 ?: g. b* [
                                begin. H6 Z' |$ t0 |7 U/ u) h" {
                                if(Cnt<=3'd2)
0 V3 |, F3 W4 r! q) t( B                                        begin
$ [3 |' h8 k$ z/ X* d                                        Cnt<=Cnt+1'b1;) i5 V: h. I% t, `
                                        LedOut<={LedOut[1:0],1'b0};//拼接8 a2 d- O4 T$ n% a
                                        end' e9 B, F6 z6 F) W, G
                                else       
$ B" d" m( O; G                                        begin
0 U0 o+ \% _" G6 p                                        Cnt<=3'd0;( z. C2 a( o4 V( C5 J
                                        LedOut<=3'b001;
: B/ J3 a6 k* o( J) x                                        end8 ~, S9 c; o% k% K* @. C" Q6 `! I: D
                                end+ X/ _' o, _' d3 z5 e
                        else if(KeyIn==3'b111)1 Y2 t: ?* @9 q, Q# G7 o
                                begin
! v" {7 x- r  r: w8 _; L                                if(Cnt<=3'd2)5 d9 _( ~( R: O  v. s
                                        begin
, Y0 o. k' s/ P  U5 Z4 L& |" w5 s  s                                        Cnt<=Cnt+1'b1;
+ Z" [  B9 v- s# e3 _& l                                        LedOut<={1'b0,LedOut[2:1]};
. B4 N4 Z$ v$ Q$ k; A                                        end
6 n# u; K3 Y! ?$ w                                else        1 ^3 G& T0 j# }$ A9 g1 ~
                                        begin6 _* |8 W! g5 Z) F" H3 Z2 [6 l  \
                                        Cnt<=3'd0;
/ n% h  m; e+ a1 o  f2 E                                        LedOut<=3'b100;- W  }( x4 T& I8 r/ F7 p/ N4 L
                                        end
6 v% t0 ?, M: D8 ?7 K9 {2 u                                end
# I4 W7 q5 D5 U: P8 I                        end
/ ~! X0 P( R, S7 k$ u; ~) g* K; aendmodule
作者: 1292569609    时间: 2014-6-30 11:54
求高手解释一下红色画线的语句什么意思 啊,我是一个初学者
作者: lvsy    时间: 2014-6-30 17:12
1292569609 发表于 2014-6-30 11:54
3 V# v4 N# m) ^; h. `" H  Z- C% s6 _. e求高手解释一下红色画线的语句什么意思 啊,我是一个初学者

, D. A# ]$ r) t0 C: m( d这是systemVerilog的语法:8 W; W( V1 g1 M; n, R2 I$ p  N9 I
defparam  Gen_ClkLed.divdWIDTH=23, Gen_ClkLed.divdFACTOR=10000000;1 Z- y7 @' J2 e3 m) c8 P2 H2 ^
% e& S. O6 p; p" @& [
重新定义了层次结构(Gen_ClkLed在下一句里定义)里的参数divdWIDTH,divdFACTOR;
/ ~, O  Q+ x1 q# `' i
: z/ Z1 R- q, c! D! r; J0 Ygen_divd   Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));   
- p3 l7 p! u! w
  h0 g! ~$ u3 B* |" F) b" a* `: p例化了gen_divd模块,例化名是Gen_ClkLed。其中的参数divdWIDTH,divdFACTOR前一句defparam语句里已经定义过了。
作者: 1292569609    时间: 2014-7-1 10:00
好,谢谢啊: z5 W* z. D, W- @. b$ w

作者: 1292569609    时间: 2014-7-1 10:04
再请教一下啊) C) |0 y' j7 `0 ~

/ y: ^* f/ B' `* x: jError (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declared more than once3 f0 ?! V- D! t/ {3 h% m
这个什么原因啊
作者: lvsy    时间: 2014-7-1 10:27
本帖最后由 lvsy 于 2014-7-1 10:40 编辑 9 V# X/ B) ^/ A% ^3 r
1292569609 发表于 2014-7-1 10:041 _/ j0 h3 i( Y  h9 G
再请教一下啊0 h+ ~  e8 f5 @! z
% ^1 I* R8 g( M4 E. O+ t
Error (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declare ...
# c7 O+ V2 h, n* n  o- ]
3 O+ x% b4 r/ w% H' r
是不是指Gen_Clked?
: o. C. x7 p6 [2 i, a  N% s8 B! |: Y! L
把defparam 这句移到gen_divd Gen_ClkLed(......); 模块例化的后面试试看!
0 j4 b8 }' U. }" W+ l0 E* U6 ?
) j; H; A4 B. D) S或者这样例化
3 |0 R0 R0 Z, G/ T6 K0 h9 |! d2 ]: f) U% h2 A
gen_divd  #(.divdWIDTH  (23),
9 U& @3 C4 M: @& H6 ~& }! E7 R                 .divdFACTOR (10,000,000 ) )$ n5 w" a1 U- s

2 D4 P) T2 W& H1 z% S               Gen_ClkLed (.reset(Resetb),  Q  ~. T  P3 R7 |
                                .clkin(ClkIn),. a$ a/ Z4 ~" ?& P% {% O' J1 M9 Q
                                .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 expression+ N0 ~* m/ K# @% s! [& j  Q) w
是什么意思啊8 Q. H% a! i- F

作者: 1292569609    时间: 2014-7-1 10:39
`include "gen_clk.v") Z2 s( ^) k6 y' {8 l
8 n& e( W* z! V# w% k
module led(clk1,reclk1,cout1,cout2);
& E) x" A, z2 ^4 s$ D8 xinput clk1;
) R/ L( m# @9 O6 C9 Moutput reclk1,cout1,cout2;
0 [6 T- Q# w1 p  @: e/ p# J- Q, Zreg reclk1,cout1,cout2;) K; s8 R9 A4 A! H) r: f" C: f' f
: n* F5 h( ~, n! h4 i4 r5 E7 B
gen_clk led(.clk(clk1),.reclk(reclk1));& m+ I/ K2 H$ V
defparam led.width=2000000; //频率是0.08S;
1 p+ y: F1 n1 f) [8 n" u# X+ |) |2 K# \- f
always @(negedge clk1)8 n2 k& \( Z7 a6 e" D- j& U, g
    if (reclk1==1'b1)  I% D+ R: ^' ]  e
         begin1 W3 j% `6 Z, @2 e! Z# H/ H  Y# A
         cout1=1'b0;( ~; v' ~1 R! a- K. b7 K
         cout2=1'b1;: T7 T6 B/ j6 I& C$ y& R& S- M. j* _
         end
) y7 ^3 i  }3 k& N9 [( m; X4 b# }         else; J' i- _# W. i0 L5 D4 J
         begin* C6 o4 x; M' E" D: m, F# ~
         cout1=1'b1;7 O$ n, r/ y! t+ B' t4 E
         cout2=1'b0;
, L' n% E8 Y9 w    end
- q2 P% E; g2 R9 h" [9 nendmodule& y9 c  C: i, h- W, V

) n2 E2 a2 o5 M( b4 Omodule gen_clk(clk,reclk);
* f# ^8 K/ O: ]1 b! H8 Rinput clk;
' n* ?2 Z8 p" f" A7 m: S" P; Routput reclk;; [: X$ t2 d& l  b# Y
reg reclk;9 a( ~5 x7 c2 H3 {* w
parameter width=1000000;//分频数1000000/25M=0.04s
/ Q& Z# o; Q2 l/ v6 x9 u5 N" C9 areg[11:0] count=12'd00;, L* {3 K  Y3 ~3 o2 z4 Y- l: t6 g
always @(negedge clk)6 B( M1 P" K  u0 B  v' R2 y
  if(count>=width)/ x( Z/ e, X6 e. {
  begin
( g+ @; Y( p0 _4 \  count=0;9 L+ d: \3 K: W$ S( v
  reclk=~reclk;
# w1 q2 a4 A, _2 C5 Y  a* G# D  end
4 L4 L$ k4 x9 ]2 b% L# s else count=count+1;
& i! h! b- I5 q3 d! Bendmodule
! g! l7 Y  g$ ^- t8 {0 [9 v这是全部的程序了
- P' p2 E9 b# m7 D- z8 N麻烦指点一下啊
作者: lvsy    时间: 2014-7-1 10:50
1292569609 发表于 2014-7-1 10:39
, Y) \: v  b$ o2 C% A`include "gen_clk.v"1 }2 s. r, C' P4 H- d2 M9 {0 }

- \! p% p- l! ~  xmodule led(clk1,reclk1,cout1,cout2);
! o& @# C+ o/ [4 l
发现了两个问题:' U" a# k$ }! F  i8 ?# n+ E* g
1. gen_clk模块里reclk没有初始值,综合会发现latch。- e' ^, ]; J0 u
2. led模块里reclk1不应该定义成reg型,应该是wire型。
作者: 1292569609    时间: 2014-7-1 11:37
为什么要定义为WIRE型了
8 |- O2 e* u! k  F9 w
作者: lvsy    时间: 2014-7-1 13:11
1292569609 发表于 2014-7-1 11:371 F, u' x: G" J, j& H
为什么要定义为WIRE型了
6 F& Z* Y1 K" i3 Y
因为它是gen_clk模块输出的,led模块调用了gen_clk,在led模块里就不能再对它赋值了,否则就变成多重驱动了。
作者: 1292569609    时间: 2014-7-1 14:00
明白了,谢谢啊




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