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

FPGA问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2014-6-30 11:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
//偶数分频器,外部带入两个参数决定分频系数。默认是2分频
8 J, y* ]7 J' {4 m3 Z; f, m2 l' G//divdFACTOR--分频系数,实际分频数为divdFACTOR*2* C4 `4 L) T; w) a1 R* E- j( E
//divdWIDTH--分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR* Q  j; J- d: V4 M  G* ?4 L
module gen_divd(reset,clkin,clkout);6 z; _* O3 y7 q% j& F' R& y% M
        input reset,clkin;
) Z( F& a: U; Y  C! F        output clkout;" G) m/ L7 n2 b- u: V
        parameter divdWIDTH=1;//分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR
& Z$ g, S4 w+ h6 l        parameter divdFACTOR=1;//分频系数是divdFACTOR*2
0 b. }8 m2 L, O/ a: @8 V- q& j# W        reg clkout;
! _4 p. a/ q4 J! `& {0 e        reg [divdWIDTH:0] cnt;# e. F0 ^0 n) {4 i1 |" G! K7 L: ]/ j
        7 Q. @3 v, S6 _- D
        * G7 E( w& N0 I2 O4 y% b
        always @ (negedge reset or posedge clkin)0 M/ c7 |- I7 B6 x, G+ i
                if(reset==1'b0)
- B1 ?; z& U" c9 g8 A, i6 a) j/ M                        begin
% ]6 v0 q( g& L* M: K                        cnt=0;
4 Q& a( F9 U9 E  v" x                        clkout=0;. q8 {6 H9 e  G7 R) e9 o
                        end# `' P1 U2 P  ]3 G+ n. W
                else, N6 Y1 A) @' A3 U, |: ]. L$ z! Q4 h
                        begin2 l+ l+ K  M' W1 d* u& H8 c+ G
                        cnt=cnt+1'b1;//常数1要指定位数,否则默认是32位的* w7 w2 o( z, O7 t
                        if(cnt>=divdFACTOR)) J. I7 J; p* i8 W3 W. {  `
                                begin
" z. k: S/ J% K, n4 }; ?                                cnt=0;
0 X8 b$ l* Y2 n9 E; ~$ q                                clkout=~clkout;
8 x# U" O' ~+ ]5 c                                end 0 ~$ ^6 e( F. C: B
                        end( R* M- i( j+ Z8 X" p1 W

! H0 u3 W( B( `. a' t4 _endmodule
* F. r4 b: {  A; J0 g- j' ^' q+ k! o- G6 N# h5 F2 b
`include "gen_divd.v"; |% I$ |0 r( Z8 d  m. z
  ^4 V% s# s+ l5 e- y
module led_w_dir5 P- O7 H! Y1 f
        ($ M' V6 z$ u: P
                ClkIn,
% Q2 [# a" Y- r% Z5 u- v+ O                KeyIn,7 E( _4 X, g5 E, ]9 Q/ D& B
                Resetb,, H. Y+ f! a$ O4 A" y/ I
                LedOut- J2 T9 w1 f* K& ?8 `' t
        );
9 E$ \7 E1 k' `# ^% n: s' C        input ClkIn,Resetb;2 R- f5 ]/ t: ?2 y& v8 N% Y( c
        input [2:0] KeyIn;0 |' |5 T3 y' S
        output [2:0] LedOut;9 s" p& m4 J$ I  R8 A
        1 p) U1 U9 p' G4 M* n
        reg [2:0] LedOut;
: h+ U4 y  I7 {        wire ClkLed;9 X1 O) r) N' t* L- Y2 {) a
        reg [2:0] Cnt;
# S; \* A* b6 w3 F( [' w4 U7 e( [        7 ^- c1 t$ _2 b' y7 l5 d: x& a9 H
        defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频0 o) m- y9 m/ N3 `' R! s3 E
        gen_divd Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));       
//帮忙解释一下是什么意思啊。3 M% d) {- s9 N1 V& ~
        0 R# i9 p$ t4 ?
        always @ (posedge ClkLed or negedge Resetb)# [/ ]' F0 o! p: M& B8 c
                if(Resetb==1'b0)2 L( C% [) R+ f* F; B4 ^* I
                        begin  D6 k  f3 Q: W9 R
                        LedOut<=3'b111;
* B5 `0 f/ `" z1 @) i                        Cnt<=3'd0;
4 J3 {, p3 ~$ N                        end( v' b5 K" \0 w9 m% ?1 U" P" p  s
                else$ L/ ^( c0 n" Y3 _& I; x- r
                        begin
2 U. P" i( k  k- Y                        if(KeyIn==3'b000)
; r8 u, f6 n; u3 i                                begin5 E& M5 b5 g2 M
                                if(Cnt<=3'd2)
$ P5 d5 Q9 @; \3 [4 J/ _                                        begin
, `$ ?) b2 X; a4 q                                        Cnt<=Cnt+1'b1;
% ^5 z& L. [$ ?$ j                                        LedOut<={LedOut[1:0],1'b0};//拼接* N6 u$ r) N& L% h; o
                                        end
* t% b: _& U) S                                else       
5 @5 K+ n4 n* o& C/ p% a) \# j8 c                                        begin, F, f6 y8 X* W. s4 z! H
                                        Cnt<=3'd0;
. x, g& _2 X1 x" _: K9 ]                                        LedOut<=3'b001;6 r& E+ R5 M* i& G! |- \* Q
                                        end' @) U- z% x' S1 w
                                end
1 _& C  u+ f) ^: N2 }' ?                        else if(KeyIn==3'b111)3 D1 f" L- I& f1 ~8 o
                                begin
# U+ A, G' v" H2 B' A( b( D                                if(Cnt<=3'd2)
7 r8 s4 n6 P( _# `' J7 t0 d                                        begin- Y' H8 w5 x' w9 V* v1 U
                                        Cnt<=Cnt+1'b1;  W8 E3 N8 Z  }) k; U: s
                                        LedOut<={1'b0,LedOut[2:1]};$ r  V% d' l; R+ o) Y
                                        end3 o) c/ g9 p, x# H# C" \4 ?
                                else       
' Q) q9 Y, X% @4 U                                        begin
" q5 U: g  t9 l& n" M5 i                                        Cnt<=3'd0;6 H) h9 A* M0 D, S0 [
                                        LedOut<=3'b100;1 i; K# W$ v1 R- V
                                        end. w, L3 D' m) @; ]) r
                                end" a, r% F, l% \  p: n
                        end
+ E5 G& j' y) g5 T8 Pendmodule

该用户从未签到

2#
 楼主| 发表于 2014-6-30 11:54 | 只看该作者
求高手解释一下红色画线的语句什么意思 啊,我是一个初学者

该用户从未签到

3#
发表于 2014-6-30 17:12 | 只看该作者
1292569609 发表于 2014-6-30 11:54
1 r8 V; U1 m- w5 V7 C1 }4 n2 _求高手解释一下红色画线的语句什么意思 啊,我是一个初学者
/ z% m/ R( V. _: s; M
这是systemVerilog的语法:. Z* @4 ^. `) R/ @1 K
defparam  Gen_ClkLed.divdWIDTH=23, Gen_ClkLed.divdFACTOR=10000000;
+ \( t8 ?7 t' u
; l, w1 ?; V* `) r0 V重新定义了层次结构(Gen_ClkLed在下一句里定义)里的参数divdWIDTH,divdFACTOR;
* v" h4 d3 m" V% z# g7 P, e, `( }) ]" w$ k5 T6 U
gen_divd   Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));   
) {5 W1 {! Q( H2 b! i( w* X9 w" B% Y
% |- Q. O" {- m( B例化了gen_divd模块,例化名是Gen_ClkLed。其中的参数divdWIDTH,divdFACTOR前一句defparam语句里已经定义过了。

该用户从未签到

5#
 楼主| 发表于 2014-7-1 10:04 | 只看该作者
再请教一下啊
+ f5 I, u4 W' X/ i: r. @% Y- Z$ a8 u, S- y
Error (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declared more than once/ N( [# R; J0 b! s; P2 ?# h  B4 d
这个什么原因啊

该用户从未签到

6#
发表于 2014-7-1 10:27 | 只看该作者
本帖最后由 lvsy 于 2014-7-1 10:40 编辑 . _7 r9 L0 O$ y3 x
1292569609 发表于 2014-7-1 10:04/ P* Z; ]: [; Y: X+ J
再请教一下啊. N4 A! `" B6 p
7 d3 G- D' o0 U: [' n
Error (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declare ...
" ?/ R$ P) i- H& \: U3 j

. @0 S' T5 \# s- x' F2 Z* y是不是指Gen_Clked?
8 a, N/ [. V. m# R+ q5 ^: `
7 S% R# p- E: A把defparam 这句移到gen_divd Gen_ClkLed(......); 模块例化的后面试试看!
; ^+ l' N& @3 M8 E- d  l6 |" Q0 s% P+ N4 ]. R7 [7 F6 n; B" O
或者这样例化
$ y+ A8 z' h. h% a" J+ W2 E0 B" Y* m! i: F8 u$ U; }- z
gen_divd  #(.divdWIDTH  (23),0 d; E6 A  L/ _. A. l
                 .divdFACTOR (10,000,000 ) )
* l% f8 M: V7 C3 U9 r( v2 I7 G# v9 [/ a  M0 h7 q
               Gen_ClkLed (.reset(Resetb),% n/ Q& \, [4 \& o' A
                                .clkin(ClkIn),0 M8 l- G0 K& ]9 z; {# q  j
                                .clkout(ClkLed));        

该用户从未签到

7#
 楼主| 发表于 2014-7-1 10:37 | 只看该作者
好的。谢谢啊

该用户从未签到

8#
 楼主| 发表于 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
( N- R; }' R, E8 ^. N9 i是什么意思啊" m* O  i: X- [# v0 Z

该用户从未签到

9#
 楼主| 发表于 2014-7-1 10:39 | 只看该作者
`include "gen_clk.v": x" J9 m( Z) d( {2 R  @

, _6 z: D$ r' G! t. P& pmodule led(clk1,reclk1,cout1,cout2);( O* N) q* i# [! ^9 D8 v/ m: {! R" E
input clk1;6 V9 u( s# ?, J* n8 l4 m
output reclk1,cout1,cout2;( F4 ~- t1 W$ i/ g4 V8 l' k, S
reg reclk1,cout1,cout2;
0 Y/ L$ g0 c) ]( m' m' H* I7 h$ a: v4 i- n
gen_clk led(.clk(clk1),.reclk(reclk1));# a0 l# a  L( A6 g) M& `* |" m
defparam led.width=2000000; //频率是0.08S;7 B) U) j% y: @; k9 H

5 _9 t. N2 m* ^( ?7 c! P" o: D  Valways @(negedge clk1)
& T/ K! T3 ?; m1 r& U    if (reclk1==1'b1)
& l; h. ?' E& C8 c- A; |         begin
+ ?9 X* e5 `  t% G! I         cout1=1'b0;
. V9 z( ^. p! \3 H! y+ {         cout2=1'b1;
9 q8 b5 @# v( f/ s& \* {8 Q; M         end . g  K% T$ M) m8 w" P1 f
         else7 M$ w+ K+ j3 x" r0 M: b
         begin
" A0 b: r1 L9 H) X$ l3 v" i         cout1=1'b1;- p# S9 `) X* O! J4 z6 _
         cout2=1'b0;, q( F: e% _# e! P- ]
    end
, L$ N  K. K$ c) C  H$ W. Lendmodule. W1 o& m- U4 h( o& q$ H, Q- n
  x. y1 z5 S! _, O) a3 C/ F
module gen_clk(clk,reclk);
- ]( T0 u3 O* }  Y% Zinput clk;0 R# r% K' ~' q$ m0 e1 w
output reclk;
; R! X4 o! \! f  U6 @& \! oreg reclk;
; r9 q; |3 a8 i! U% n# gparameter width=1000000;//分频数1000000/25M=0.04s. x, k# Y& s# j5 W8 {
reg[11:0] count=12'd00;1 L0 R2 g, s2 E
always @(negedge clk)
1 r" P: t5 d: X$ C2 J6 _: l, a3 V/ w  if(count>=width)
% p; d( c" \+ [8 d' l  begin2 ~9 t; V- h! W7 i( i
  count=0;! q, f; Z+ M) L
  reclk=~reclk;
3 l8 a4 s0 `6 [: n: q" i  end$ `/ P' R$ s1 A
else count=count+1;   M, \) h5 }: E. {
endmodule 7 k- @$ z2 P9 p8 }$ x# s. J) N' u- y* x
这是全部的程序了5 x4 i1 G; F- ~& i
麻烦指点一下啊

该用户从未签到

10#
发表于 2014-7-1 10:50 | 只看该作者
1292569609 发表于 2014-7-1 10:39: q$ K( |) [- j" i$ g
`include "gen_clk.v"$ H: ]0 V% ?/ ]& h9 ~

5 \+ h" }+ `, R$ \+ Dmodule led(clk1,reclk1,cout1,cout2);
8 U$ C9 U3 d5 ]+ O, [# m
发现了两个问题:% c6 g. ]4 p$ h, q* E
1. gen_clk模块里reclk没有初始值,综合会发现latch。
& l# r* T3 f% p2. led模块里reclk1不应该定义成reg型,应该是wire型。

该用户从未签到

11#
 楼主| 发表于 2014-7-1 11:37 | 只看该作者
为什么要定义为WIRE型了
9 k: T$ r8 {( s5 J0 R6 c

该用户从未签到

12#
发表于 2014-7-1 13:11 | 只看该作者
1292569609 发表于 2014-7-1 11:37& B" A/ w; T5 T
为什么要定义为WIRE型了
9 |: ~6 }) I' M. t
因为它是gen_clk模块输出的,led模块调用了gen_clk,在led模块里就不能再对它赋值了,否则就变成多重驱动了。

该用户从未签到

13#
 楼主| 发表于 2014-7-1 14:00 | 只看该作者
明白了,谢谢啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-21 05:48 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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