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

FPGA问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
//偶数分频器,外部带入两个参数决定分频系数。默认是2分频3 y1 ^% b, l7 k. j8 F
//divdFACTOR--分频系数,实际分频数为divdFACTOR*2
/ Z! M+ ~* p& Q8 m% c% H2 V//divdWIDTH--分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR7 D8 B% T. V% E& X, D2 M: F5 v
module gen_divd(reset,clkin,clkout);; N8 `: |4 S4 H6 C, i/ W
        input reset,clkin;6 a7 X+ C- q& ?0 y  N
        output clkout;+ H! \! D) p% \. _8 [
        parameter divdWIDTH=1;//分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR4 U* N# }* P+ n' O( y
        parameter divdFACTOR=1;//分频系数是divdFACTOR*2( X2 A7 a8 ~6 c0 q' f
        reg clkout;
+ A3 c) H, s" |9 H2 U        reg [divdWIDTH:0] cnt;
' x5 L6 b& Q# ~5 a; Y: R       
) ?; n2 q( m' R2 z. g       
3 ?& Q" ?+ {. m7 r: M! [! V        always @ (negedge reset or posedge clkin)' `1 n  E7 y6 w7 J
                if(reset==1'b0)- W! e; l8 W- H4 q
                        begin
: _9 f4 |7 H; l2 s: Z  Z                        cnt=0;
+ o$ i7 E+ Q  t$ U2 I                        clkout=0;6 X" ~7 K* V+ X) |
                        end' H; e4 h; b/ ~5 B" H3 Q2 S# W
                else
0 W" l& C5 \$ y0 l                        begin0 K  y8 V7 q# y+ a: M2 ?
                        cnt=cnt+1'b1;//常数1要指定位数,否则默认是32位的
/ ~9 s5 g) r' w: P                        if(cnt>=divdFACTOR)" r) Z6 |/ J5 F: C8 k
                                begin
, E' b; k: w/ |' @9 z' Y( u! j                                cnt=0;& H. n7 c3 {. }) l/ i2 A( z( W
                                clkout=~clkout;
" }0 D" h) @* H& M" B                                end
+ D, \' t' {* f                        end
$ P0 ?+ _8 \) t& j( O
. u8 [' k  L; k/ }4 pendmodule
; E2 y. f% `# {$ A8 f* f4 g6 b7 j/ E. c' d1 ?
`include "gen_divd.v"% T( K3 O5 k6 ?8 k8 S
" [5 U1 R' o! G  K6 s' {
module led_w_dir+ \3 i2 f  t  [! h
        (
/ P& W4 ]' Z$ _( d, C! D                ClkIn," `5 [3 ]/ ?6 m9 r* |: a- g
                KeyIn,
9 r- N* d2 p$ |                Resetb,
! R% h, _" K! j% n# \                LedOut9 t( u0 v6 ]# S- e0 u
        );
& ]. |, d7 j: d        input ClkIn,Resetb;: n( H6 X, h) m/ z
        input [2:0] KeyIn;
2 M' M9 B8 j3 X( t/ j        output [2:0] LedOut;% W- p/ g( }# D8 M9 W
        7 ~% t. b/ o/ @2 C0 p
        reg [2:0] LedOut;
8 ?; L, j$ h' Q& `8 s        wire ClkLed;1 u+ p! V. v: y" c8 N. x
        reg [2:0] Cnt;  b* e: F; B4 `7 n
        ; g2 I) W4 A. T, _5 }& s
        defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频% E3 R3 w3 ^9 j( }
        gen_divd Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));       
//帮忙解释一下是什么意思啊。$ G4 h3 F' z$ V# j
        4 y* v! {# l) G1 I% Z9 d! G0 P
        always @ (posedge ClkLed or negedge Resetb)
# h/ F2 y, R7 b                if(Resetb==1'b0)0 |9 X; |9 v: n) i5 o
                        begin1 B+ q8 I3 x) @2 x+ d7 t& v
                        LedOut<=3'b111;
; p& ?2 B/ W" `$ |& a) r4 u                        Cnt<=3'd0;
/ c  q% u- d" V/ t5 s0 B2 l                        end. J. ^, X& P1 W9 s; D  R
                else/ U5 @8 E/ ^  x: I# g$ G6 z
                        begin
& A0 m2 A& \1 a" E! M7 `  m+ R3 b                        if(KeyIn==3'b000)
8 N" G; |, \: |                                begin
& u2 q4 D; B! F* s$ X                                if(Cnt<=3'd2)
4 r5 G' {$ F6 X! e, Y" h                                        begin+ b5 p9 q2 X! K
                                        Cnt<=Cnt+1'b1;
% D$ `" K2 x3 f3 H5 Z% k0 S                                        LedOut<={LedOut[1:0],1'b0};//拼接
7 r4 }, S4 t: P' u- {                                        end0 t) ^# d7 H3 Z/ l
                                else       
* ~# I" X" J% W% [% F* w                                        begin
9 T1 D$ J* y5 g# e                                        Cnt<=3'd0;
8 c% U% I$ s# O                                        LedOut<=3'b001;
$ X& x" M9 k: Y7 ~                                        end
+ `* p1 A: O8 d3 L4 {                                end
, S$ X; _3 K( ~5 f0 j7 v# Q                        else if(KeyIn==3'b111)* d# [7 i* g3 Q! [8 }
                                begin* m: ~) ~  z- s1 D$ G" u3 K
                                if(Cnt<=3'd2)
  B, a1 g. \! T8 ?0 m                                        begin. ]! O' w+ [0 v) @" d* o, f8 Y
                                        Cnt<=Cnt+1'b1;/ w5 o0 r& T( J$ K% D: k8 S
                                        LedOut<={1'b0,LedOut[2:1]};
& R2 r3 h" h* _$ d; E2 d5 q                                        end+ X1 \& m+ @4 a+ }/ O
                                else        $ J$ N* u3 w8 k6 X& g
                                        begin: N' j0 u5 c! f' _: N
                                        Cnt<=3'd0;& l/ Q; @9 g- \
                                        LedOut<=3'b100;
2 m1 R$ J3 E; ^% n                                        end
/ u" v. M1 Z9 ], M9 x; b                                end
  I' |6 B, a' h                        end  }- i/ ^2 B. C6 X
endmodule

该用户从未签到

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

该用户从未签到

3#
发表于 2014-6-30 17:12 | 只看该作者
1292569609 发表于 2014-6-30 11:54' w- F4 A% h. [6 {# R+ L
求高手解释一下红色画线的语句什么意思 啊,我是一个初学者
. u' V; ~% z( G, ^, F
这是systemVerilog的语法:" _: }" D/ ^3 ~7 X- R0 G
defparam  Gen_ClkLed.divdWIDTH=23, Gen_ClkLed.divdFACTOR=10000000;
5 ^( T! |3 ^( e2 @; [8 X7 O4 [/ S1 s+ K: S& g  k- L
重新定义了层次结构(Gen_ClkLed在下一句里定义)里的参数divdWIDTH,divdFACTOR;8 j% c1 G5 G' M7 u
+ j: k/ z! T6 Y( L- K: C5 }
gen_divd   Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));   
2 T0 |! W  f, ~
6 P' F/ e/ C& y$ R! h0 K1 m例化了gen_divd模块,例化名是Gen_ClkLed。其中的参数divdWIDTH,divdFACTOR前一句defparam语句里已经定义过了。

该用户从未签到

5#
 楼主| 发表于 2014-7-1 10:04 | 只看该作者
再请教一下啊
: k9 T6 D$ A% U" I6 H- P, g2 Z
+ b) T  `0 D1 n0 \  E  I1 M& zError (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declared more than once' V" N8 e* j% {% ?
这个什么原因啊

该用户从未签到

6#
发表于 2014-7-1 10:27 | 只看该作者
本帖最后由 lvsy 于 2014-7-1 10:40 编辑
6 F( G  \& d8 d8 W) E
1292569609 发表于 2014-7-1 10:04
. @9 ~' {: D7 I$ ]9 E5 w再请教一下啊+ ]* E2 V5 }; o/ N5 `3 ~
" Q% g! c/ c* Q! {3 d  D
Error (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declare ...

4 C: P9 M) s) n6 Y" u& F
; I: [5 I* k/ J) ^/ f7 K, a9 q是不是指Gen_Clked?
9 I: m3 {0 Q8 [& r0 \5 ~4 k# B2 b; U
5 f0 d) i' I4 D( N( r把defparam 这句移到gen_divd Gen_ClkLed(......); 模块例化的后面试试看!
9 {/ }* w1 L5 Q7 D# v3 M, v* K# N
. H& M; A4 M3 @; \或者这样例化
0 P+ z3 H) O0 F
$ ?5 C4 d( p' I! \; J* `% Mgen_divd  #(.divdWIDTH  (23),
8 _: u4 h, ?) U, e3 d5 W                 .divdFACTOR (10,000,000 ) )1 G" f2 v* F# X: ^) \& g( L
( ]& @+ P4 K! z% T
               Gen_ClkLed (.reset(Resetb),4 O9 O5 F( _0 q$ v
                                .clkin(ClkIn),
4 \, X# T0 J0 s. X' n/ E                                .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  U: ?: {: ~( a' g/ \! l4 J. v
是什么意思啊
9 Z! }" q# S6 _0 I7 A

该用户从未签到

9#
 楼主| 发表于 2014-7-1 10:39 | 只看该作者
`include "gen_clk.v"
5 N& W- s2 i+ d' Q$ a( m
- h) A" z. Y3 _& A' j9 q: N+ x2 n2 u2 @module led(clk1,reclk1,cout1,cout2);, S; b4 N/ w- G) Q; r( O2 k6 ~( e
input clk1;: H) Q) o: B; C3 X! }6 `
output reclk1,cout1,cout2;
4 K! g6 e/ c5 Z7 ~* Freg reclk1,cout1,cout2;
/ N- t7 Y9 u7 i: F5 f1 a! Y9 ^; D. D# \
gen_clk led(.clk(clk1),.reclk(reclk1));
( v- }4 A! P2 @0 Udefparam led.width=2000000; //频率是0.08S;0 t' f/ |6 T, h5 C# p  N! E
- R' M3 ^3 O9 P/ P2 i, D
always @(negedge clk1)- @+ _2 Q) K: F# N# \$ A3 t2 s
    if (reclk1==1'b1)
4 X2 m! \3 H' S9 O9 P9 N1 ]2 g; d         begin
6 p* T% o. i& V' v  k4 X+ I1 R         cout1=1'b0;
1 _$ }# {& e1 n; {% ?  n/ q         cout2=1'b1;' U7 B  ?5 N! A% V( n3 u5 K
         end ; s: C% T1 Q" r' `3 A
         else
. n. S' y5 T2 q) r2 g% G         begin
( V. R/ e1 j$ a$ g, q9 h1 l         cout1=1'b1;
# g: I& }4 p+ Q: U         cout2=1'b0;7 U6 G8 ~. W- d, k- k  u$ e
    end* i9 b3 y* r4 \/ `2 |# N4 C. X
endmodule
# ?* L* b4 P% `) B5 y; z. o( n9 F- {6 h/ }% z: W2 I
module gen_clk(clk,reclk);& W; f. m( a2 L3 ^5 A! b
input clk;
) y; W5 P6 I7 g- n; Moutput reclk;
  t/ c% q0 _6 B; b2 ]% t3 mreg reclk;8 \# Z9 |0 Z$ o
parameter width=1000000;//分频数1000000/25M=0.04s
2 z. ]+ P! i! ^" A+ ^reg[11:0] count=12'd00;
" r( n" I3 i4 v0 j9 q* ^always @(negedge clk)3 S* s3 X8 I8 k9 g
  if(count>=width)
7 t7 V! Y7 X8 {# t0 v/ Q  begin
4 o0 E. J/ H; o6 |( \" l5 r9 [  count=0;6 E9 C* A9 v; y" p/ e2 Z
  reclk=~reclk;3 Q# r8 j) p# `: h
  end5 e0 i; }" _4 t3 }% \" V5 s
else count=count+1; ! X7 f( N1 C. [- V
endmodule
3 j" n: m4 Q. V# }6 L这是全部的程序了$ O6 _% j8 L: f1 E  K
麻烦指点一下啊

该用户从未签到

10#
发表于 2014-7-1 10:50 | 只看该作者
1292569609 发表于 2014-7-1 10:391 v$ e- G, G, f( `8 E, }& F
`include "gen_clk.v"/ p7 Q/ B5 H! n8 N3 @/ Q+ G* \

7 b/ p9 o9 A" |. d- Z7 fmodule led(clk1,reclk1,cout1,cout2);
" }3 I3 t4 z! U* Y+ Y# o  M
发现了两个问题:
. K9 r. f* t# N7 ~7 Y1. gen_clk模块里reclk没有初始值,综合会发现latch。  m& f* X- g; E3 l' |; H& v" s
2. led模块里reclk1不应该定义成reg型,应该是wire型。

该用户从未签到

11#
 楼主| 发表于 2014-7-1 11:37 | 只看该作者
为什么要定义为WIRE型了
/ k3 |* t. a; I' }6 Q5 x

该用户从未签到

12#
发表于 2014-7-1 13:11 | 只看该作者
1292569609 发表于 2014-7-1 11:37& e4 d( [0 k& t& h/ i# O
为什么要定义为WIRE型了

) K$ i& d  W  R4 J6 z% u因为它是gen_clk模块输出的,led模块调用了gen_clk,在led模块里就不能再对它赋值了,否则就变成多重驱动了。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-5 17:54 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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