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

FPGA问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
//偶数分频器,外部带入两个参数决定分频系数。默认是2分频
$ F/ d' j' A! e: o//divdFACTOR--分频系数,实际分频数为divdFACTOR*27 R0 w3 f$ J! b7 s' J2 @
//divdWIDTH--分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR
9 w- \' `% a% |2 n, ^# m! r3 Vmodule gen_divd(reset,clkin,clkout);) U4 I  r; ?8 N: M" C
        input reset,clkin;9 F) z' J8 ?: Z0 m; l! Y9 p1 {( i; t
        output clkout;
) }; `, j$ Z9 e8 U        parameter divdWIDTH=1;//分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR7 I  w3 N3 u' B0 B0 L  [+ X  m  }, K$ E
        parameter divdFACTOR=1;//分频系数是divdFACTOR*2
4 Q* ?* h+ M3 O. ?$ N/ P% e( {$ \        reg clkout;
8 V! o$ l2 L8 [  x' T6 `! E        reg [divdWIDTH:0] cnt;
9 \: V0 Q( H+ @: E3 j5 y3 ]3 ^       
3 Q( a0 c# b! K, f' I; Z; |5 s       
1 h7 t$ [- |0 K6 X/ X8 w        always @ (negedge reset or posedge clkin)
. o, @3 ~$ F. k3 ^                if(reset==1'b0)
3 Q; G4 G) H. A: E+ B0 k! D4 {                        begin/ a3 u+ v/ _" l3 ^% h1 y# Q1 Q
                        cnt=0;. c3 `- y% G; I7 O6 ^+ {% m
                        clkout=0;
. Q# S7 E. d0 n0 w  \* J6 t                        end9 q0 u7 `& k4 y: F" @
                else
, Y# |: R, E! a9 K! |                        begin6 g% g+ @' K& h% z, Y0 \; I
                        cnt=cnt+1'b1;//常数1要指定位数,否则默认是32位的( d* F6 u2 T* i/ K2 `
                        if(cnt>=divdFACTOR)
# V: t" w2 a$ q  D6 T. e; x" `                                begin2 n. S8 J* s2 U# b
                                cnt=0;$ f4 A# T7 M* z6 ^8 Q- A
                                clkout=~clkout;- O- s* I4 Y" Q; R* I
                                end & r  Q( j2 R! D& g. j" T3 H4 h
                        end$ x" [2 ?, _6 y: k9 c( h$ l5 o

/ u; m. o. [" @1 Kendmodule3 v% v; r1 s2 E% W

  i" R. t5 _$ q9 t0 s7 v- U`include "gen_divd.v"( c1 h; v' {- u! o& h6 ?$ R
, O. W! }* p/ Y' e9 o! }7 p% m
module led_w_dir# r0 L0 o9 r( d* j  A/ P, J
        (
) A8 H: u; G8 r( e1 Q                ClkIn,5 T  C$ k# q& `9 n3 t3 o5 Q
                KeyIn,+ P0 ?/ {. V; o5 k; k+ ^( T8 G
                Resetb,
4 O5 p' D+ B) C7 M4 l0 X                LedOut7 o4 S8 Q0 s; w
        );% l2 ^7 o4 y( z
        input ClkIn,Resetb;
6 q8 Q4 j, Q. l, q  t3 F        input [2:0] KeyIn;
* `5 F* Y8 H7 B5 k        output [2:0] LedOut;
$ I! z" R% \! h4 I3 Z' `) q; R        8 g' Z* y0 |+ u/ A
        reg [2:0] LedOut; 1 O  b  F" K# e# G: \8 @
        wire ClkLed;
0 |' r8 f0 N6 N3 B2 s/ X0 t        reg [2:0] Cnt;% k8 |6 n6 g' P  Z/ w  r
       
9 ^8 g2 L* G. f( a1 i% q& z        defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频
* L1 i& }; T6 m2 P6 e9 c4 p        gen_divd Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));       
//帮忙解释一下是什么意思啊。
5 n: x6 ^- a# X/ \) z        - ^+ v; G2 U9 q
        always @ (posedge ClkLed or negedge Resetb); O# W' f8 b* B4 S* F1 z
                if(Resetb==1'b0)7 W$ q) ~% A9 m. }7 U# x
                        begin4 U/ O9 D. ^( e" K
                        LedOut<=3'b111;
; r/ `3 m% q) r" b+ h0 j4 K6 S; d* u                        Cnt<=3'd0;
1 ^, a% v* O$ l2 E* Z                        end' Z0 E% v, W% t+ G/ B
                else$ L/ w) F6 E/ I
                        begin# o2 O1 K* i1 ?
                        if(KeyIn==3'b000)
5 X$ @! `2 ~2 b2 x2 V, `, ?6 @1 ?                                begin" ]" X0 a; k$ C  r0 S
                                if(Cnt<=3'd2). m$ R2 V' ?) H# _
                                        begin5 t: N2 C" e# U# H; r
                                        Cnt<=Cnt+1'b1;$ i+ x; V, J. O/ {% M) t
                                        LedOut<={LedOut[1:0],1'b0};//拼接
- X: E- s' J* M8 L2 t9 C6 @                                        end
+ w* X& e- `! o& b/ c2 R                                else          D! G: g8 j! }- F8 r( c5 O
                                        begin
0 G; }7 c8 i1 l- d7 D                                        Cnt<=3'd0;& U- a9 k% D1 z/ l( T: q6 V& a
                                        LedOut<=3'b001;1 d! w: ~  u8 G$ S9 s: d
                                        end
# Z! J3 n0 D8 f/ z                                end
. y, c9 E/ f4 E; ]0 g' D! i( b                        else if(KeyIn==3'b111)6 d9 Z+ |$ m) Y; |
                                begin
: c5 d! C+ M1 a9 K" e" x                                if(Cnt<=3'd2)7 |' P) _2 @3 f% M6 E
                                        begin& c" H; U% s' t9 c* R1 O* ?; d* i
                                        Cnt<=Cnt+1'b1;8 r& i5 u# v, C6 y
                                        LedOut<={1'b0,LedOut[2:1]};
& [# X0 r3 ?0 T" Z                                        end; M8 ]9 [$ C& Q4 b0 E  F' T
                                else       
7 t0 q  O! B4 _  T' C7 Q* y                                        begin
  @/ t1 _4 U$ g                                        Cnt<=3'd0;
& U  x" q8 g& K& P6 y                                        LedOut<=3'b100;9 H" F4 e9 q6 G5 J  O& |! l3 Q
                                        end/ s4 G) y" G6 I4 s* b
                                end8 V/ V- u/ j/ E; k- w6 f; i
                        end
- p5 B" `% g9 l! B2 N7 Gendmodule

该用户从未签到

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

该用户从未签到

3#
发表于 2014-6-30 17:12 | 只看该作者
1292569609 发表于 2014-6-30 11:54
1 e* f5 {4 s- A% I0 J% s$ N/ g求高手解释一下红色画线的语句什么意思 啊,我是一个初学者
# k7 f3 o+ W- m' O8 ?8 B$ v. l4 b
这是systemVerilog的语法:
" |) \% W( Y0 \7 I  tdefparam  Gen_ClkLed.divdWIDTH=23, Gen_ClkLed.divdFACTOR=10000000;
. Q  J8 d. ~" W% e( u4 u/ J2 _! e/ ~4 y3 |$ c
重新定义了层次结构(Gen_ClkLed在下一句里定义)里的参数divdWIDTH,divdFACTOR;
* I7 v- p( g- k3 d% z; z4 T$ P+ P
' |( K) }; v9 ]gen_divd   Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));    : Q8 u5 ~$ N* G; j$ H7 U. i

- Q  P: i. c, G  y例化了gen_divd模块,例化名是Gen_ClkLed。其中的参数divdWIDTH,divdFACTOR前一句defparam语句里已经定义过了。

该用户从未签到

5#
 楼主| 发表于 2014-7-1 10:04 | 只看该作者
再请教一下啊# [9 X: V9 n( q4 S. U; u, C: z

; T' n  |; G; W. oError (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declared more than once1 p' P: L) O: u
这个什么原因啊

该用户从未签到

6#
发表于 2014-7-1 10:27 | 只看该作者
本帖最后由 lvsy 于 2014-7-1 10:40 编辑
% d) X% f- @) ~6 B2 n7 ^8 G
1292569609 发表于 2014-7-1 10:04
) [! |3 k! `& H' g* p再请教一下啊
$ m$ u0 }4 m' N% Y( r* c' S, h+ O! Q3 r3 t; }
Error (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declare ...
% w* Q" Y+ @0 @- q2 U; y
% v1 {2 o# B! ^; |& l
是不是指Gen_Clked?
# g) P& T8 X8 q# }! T2 G
* Z' d0 u" Y# R/ _# s2 p7 y8 K把defparam 这句移到gen_divd Gen_ClkLed(......); 模块例化的后面试试看!
) }7 @( H; {. r! z7 Y  j6 d9 z; r7 u8 o5 o: h. V" y8 Y
或者这样例化
; ~2 M: I: z* g+ v  e/ l
) L7 l# F6 u7 P, W' f5 Jgen_divd  #(.divdWIDTH  (23),! D: ?& D& Y9 a
                 .divdFACTOR (10,000,000 ) ); V: v+ k$ X0 x

: b) P5 k8 x4 S+ U+ c# ?0 N               Gen_ClkLed (.reset(Resetb),
% S. q/ S* j1 X; u+ d                                .clkin(ClkIn),6 R% E; s- ]1 c5 V5 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
0 q- k7 y- f! l* t/ E  ]是什么意思啊4 g4 f$ R6 A8 I# |' |. z* q  {

该用户从未签到

9#
 楼主| 发表于 2014-7-1 10:39 | 只看该作者
`include "gen_clk.v"" x, n# X3 Q9 d( c$ u/ ]( A1 Z

' w! ^6 Y% `9 i' }/ b  m  S4 }; |module led(clk1,reclk1,cout1,cout2);
* A$ P5 v3 g, linput clk1;
* P, J1 a2 j% j/ f1 Boutput reclk1,cout1,cout2;! _7 G5 p7 {4 g' V7 C' ^) }
reg reclk1,cout1,cout2;
+ k9 o& q$ \% j! i; U
' E1 z* n$ W4 g/ _: ]* Kgen_clk led(.clk(clk1),.reclk(reclk1));; Z7 n3 S0 }7 n
defparam led.width=2000000; //频率是0.08S;
, ]' ~' Z# y, ?$ `# l, C: s1 c8 `4 z0 p7 k
always @(negedge clk1)+ u' {" y0 F" @
    if (reclk1==1'b1)
3 O5 w2 N. W/ P/ ^         begin
8 B) ^; e5 {; D9 ~9 K         cout1=1'b0;/ d, B+ @6 ?! ]3 m) d7 e( i
         cout2=1'b1;
* ~5 y! l- M& N         end : C6 ^5 n/ D0 x0 U; j$ o: C) U
         else
1 z- v) D2 V! {         begin& I7 s1 N- \: X& Q! \( G9 }
         cout1=1'b1;$ j3 @! S: N+ J) P7 r1 f$ ~
         cout2=1'b0;
) B# {8 j' G7 ], w    end
+ ~3 |( }- Z( |3 a1 E5 G: {4 a; pendmodule' E8 r, c" j" [' Q
! j" F) w* `7 n* e
module gen_clk(clk,reclk);
* A) c  r% C1 Zinput clk;! y, Z/ y- t6 O2 F
output reclk;
' o, R* R- a+ p/ i+ s8 G7 Ereg reclk;
+ z, l( @8 a+ @2 K0 M7 eparameter width=1000000;//分频数1000000/25M=0.04s
* o' G7 M4 \/ E& O6 F! Y4 h( Ureg[11:0] count=12'd00;
7 N) A4 |5 Y+ q! v) E$ ualways @(negedge clk)
6 u8 K9 C2 y5 |; A; m, |' ]/ H9 |7 M  if(count>=width)5 u  h% y8 U9 D& D% ]
  begin
. L- n3 X3 e0 q! |9 {) O' T) l  count=0;. s- P, K2 n, ]2 H# L  w
  reclk=~reclk;8 [: \2 b* e- x4 x
  end" e) l9 g% P$ s: L; @4 ~
else count=count+1; 8 K2 R# \) W$ h2 X
endmodule
. g: Z. Z3 Q2 b8 S: J3 L这是全部的程序了
2 a! F  d5 K7 }8 _" }. R麻烦指点一下啊

该用户从未签到

10#
发表于 2014-7-1 10:50 | 只看该作者
1292569609 发表于 2014-7-1 10:391 a9 o5 ~4 B5 t' p# \
`include "gen_clk.v"
) b& ]* s% U- _: E" K6 j# \* e6 b) d
module led(clk1,reclk1,cout1,cout2);

% k* U" s* D- Z2 `! q发现了两个问题:
& e: \5 Y( M  y- p' S  z1. gen_clk模块里reclk没有初始值,综合会发现latch。
! W; i6 ^; Q; n2. led模块里reclk1不应该定义成reg型,应该是wire型。

该用户从未签到

11#
 楼主| 发表于 2014-7-1 11:37 | 只看该作者
为什么要定义为WIRE型了% K" b8 p$ ^: u* M

该用户从未签到

12#
发表于 2014-7-1 13:11 | 只看该作者
1292569609 发表于 2014-7-1 11:37- t' w- A6 f! h" L3 h8 x% T2 r
为什么要定义为WIRE型了

" H# {2 @- ]- L( \因为它是gen_clk模块输出的,led模块调用了gen_clk,在led模块里就不能再对它赋值了,否则就变成多重驱动了。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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