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

FPGA问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
//偶数分频器,外部带入两个参数决定分频系数。默认是2分频
2 S+ |: }: o: J$ y//divdFACTOR--分频系数,实际分频数为divdFACTOR*2
8 i5 B8 [, H7 z6 p" N5 C  ~* F//divdWIDTH--分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR
$ B" D; f8 |$ Imodule gen_divd(reset,clkin,clkout);+ J3 l; |4 @. m, R! V8 }
        input reset,clkin;6 x8 W8 ~4 z3 \9 I6 m
        output clkout;
$ e, y7 k- v7 W5 L) s& @% \        parameter divdWIDTH=1;//分频计数器的位宽,实际位宽为divdWIDTH+1,该位宽所能表达的最大值>divdFACTOR4 d( `. ^; c- q; @& d
        parameter divdFACTOR=1;//分频系数是divdFACTOR*2) b3 }. p2 V( i
        reg clkout;( V2 H' {) Q; o' S5 {; B3 g' _
        reg [divdWIDTH:0] cnt;4 I1 u2 K" O) g' e2 f; Q% l" _+ t
        : M  l6 R, ~+ d' W5 t
        2 V9 {& C  f' F, |
        always @ (negedge reset or posedge clkin)
/ o% o: j; Y' G, D$ T  S                if(reset==1'b0)1 k7 d# T' Z9 E; B
                        begin
+ x; h$ W: B  J( D                        cnt=0;6 F, k; i1 G3 v+ j: W
                        clkout=0;5 [& D6 N% c: h. B( {0 r, M7 G4 u0 f
                        end1 d) M  X' t0 V. {
                else
& _( G! F8 B3 `$ A. E; u                        begin. ~8 ?9 I& [( G1 [9 S, Z& T0 x
                        cnt=cnt+1'b1;//常数1要指定位数,否则默认是32位的
& ?# v3 R  P: C                        if(cnt>=divdFACTOR)
* Y* v9 A3 w; ~: U/ t/ N8 C% v' S7 G                                begin1 F- B6 ^. W( N3 b3 D
                                cnt=0;( H  d- Q- T. W2 ?# G) H! Z6 ?& W
                                clkout=~clkout;
' |& i$ `# _- c- l, b3 {5 n                                end . a! e' u0 p, X2 H' n  q5 C6 V
                        end/ x' v5 m% ~' N/ x7 R) u- `
! L  r5 j9 C7 d7 q5 c# C
endmodule
$ @/ U& l0 z& U
' x0 y! [. `  @% Q+ z`include "gen_divd.v"' h+ @9 }% f- V! V# h
5 _4 t8 y8 G  B0 Q
module led_w_dir
+ l/ j" g& b# A9 I# E        (
1 W0 i8 @7 c5 ]! Q0 e                ClkIn,
8 p) E0 Z, m3 K4 m                KeyIn,
: Z& ~1 ~% [) B5 d4 p% I/ C                Resetb,7 O/ L" f3 a. v  P
                LedOut
; N) _! o& A% ]3 G! x! H; q        );3 Q" A7 w4 P, R9 |7 O3 ^
        input ClkIn,Resetb;
+ t3 o4 z, k; y$ @        input [2:0] KeyIn;# p3 A3 W7 C0 |
        output [2:0] LedOut;
% z  u" i# Y3 Q6 ]6 a       
$ R5 H! l7 r8 g, D% p4 s        reg [2:0] LedOut;   R- S9 f; e, P- O4 o& |6 o
        wire ClkLed;
+ l% b# T6 H; Y4 Z2 w" h        reg [2:0] Cnt;
: o, S$ T4 k# B* o% @4 ?       
2 l/ r& J+ Z+ B" B/ r        defparam Gen_ClkLed.divdWIDTH=23,Gen_ClkLed.divdFACTOR=10000000;//10_000_000分频% i- k- X% L; x' U- Q
        gen_divd Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));       
//帮忙解释一下是什么意思啊。
: O- c/ l& y# D/ i. ]6 N       
4 S& m% y7 b* Q) m9 p! d        always @ (posedge ClkLed or negedge Resetb)
7 L" x$ `" b/ }                if(Resetb==1'b0)/ c$ z' o3 K* p5 d  p1 A* U1 r# H' y. F
                        begin& u! J: C) D  K5 o6 {+ G
                        LedOut<=3'b111;
% _4 d6 l$ d- V# L! {+ U$ v                        Cnt<=3'd0;
; k; m8 l# F6 S2 ~; M5 i                        end8 ~: J) w+ R& m1 l: ~
                else
" ~: `' k$ \1 h, o+ h3 k                        begin
, _8 c" r' q& r6 f7 F; A                        if(KeyIn==3'b000)
$ ^$ C( N1 g3 }; @. P) E& G  Y9 @                                begin
; ~& p4 @# z; [( N) c; z4 c                                if(Cnt<=3'd2)+ H0 q% S+ D9 e: p
                                        begin
- Y% ?8 l; H9 B; ~* i4 n' q' b                                        Cnt<=Cnt+1'b1;4 L+ B9 r: u8 u3 C' h! ]
                                        LedOut<={LedOut[1:0],1'b0};//拼接
/ r/ d- A6 ?0 g2 X                                        end
! V, X; Q2 v2 @; Q                                else       
1 k1 ]' c, M+ P) y4 |2 t9 ^0 q                                        begin5 b! V0 a$ ~$ `' c
                                        Cnt<=3'd0;& A( f, \: P2 Y, {, I/ `
                                        LedOut<=3'b001;5 q) x- z% T9 m. J6 {: M: J+ s6 q
                                        end
  w! F7 s% o( E4 Q, ?! B                                end+ O' W" q! E% {9 I( o3 g+ D
                        else if(KeyIn==3'b111)+ s, [  a5 D3 Z! I( V  k2 J8 {
                                begin; l- x' m) j& q3 S
                                if(Cnt<=3'd2)
( r( u9 y# i8 n0 j: [2 D                                        begin7 e8 r8 Z, S( L/ w( ^# \
                                        Cnt<=Cnt+1'b1;
& Y$ y. [9 s/ x5 }# A                                        LedOut<={1'b0,LedOut[2:1]};! H* H- r8 X9 _6 o0 \0 _& V
                                        end5 k7 Q- {3 {# a/ c9 `
                                else       
1 _9 M4 y+ Q! _: `( W! T                                        begin
1 ]6 Y% ^) R! g! Q( l                                        Cnt<=3'd0;
' \5 w0 k: b( }7 T                                        LedOut<=3'b100;
/ p* x3 j8 J* Q0 @& E" l3 s9 n8 ]% |                                        end% m- F8 @0 ~% k0 e6 E
                                end
0 l/ Q- g# \/ w: @+ K( S                        end) N/ _3 ?; ~9 g
endmodule

该用户从未签到

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

该用户从未签到

3#
发表于 2014-6-30 17:12 | 只看该作者
1292569609 发表于 2014-6-30 11:54+ O. f( B& R, }* c7 `* ]
求高手解释一下红色画线的语句什么意思 啊,我是一个初学者
5 u( [2 I3 G/ _0 p& [
这是systemVerilog的语法:& M0 m: p$ q/ x& W; D
defparam  Gen_ClkLed.divdWIDTH=23, Gen_ClkLed.divdFACTOR=10000000;
4 }" Z1 D1 x: ^  H5 }  z
1 v7 Y7 D* q( @) X重新定义了层次结构(Gen_ClkLed在下一句里定义)里的参数divdWIDTH,divdFACTOR;
/ ~! ]; d. r( v, J" J4 ]6 ?# f9 C* ~! k  T* O$ G
gen_divd   Gen_ClkLed(.reset(Resetb),.clkin(ClkIn),.clkout(ClkLed));   
" R3 P+ F3 T7 e9 _/ i- t* j& g3 K3 |9 c
例化了gen_divd模块,例化名是Gen_ClkLed。其中的参数divdWIDTH,divdFACTOR前一句defparam语句里已经定义过了。

该用户从未签到

5#
 楼主| 发表于 2014-7-1 10:04 | 只看该作者
再请教一下啊0 ?: g; b; A' T' f

/ |4 b& e. N0 A/ d. I% i$ t9 X6 nError (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declared more than once+ e' B9 M0 L5 s  u: Q. d+ F8 j3 B- ]
这个什么原因啊

该用户从未签到

6#
发表于 2014-7-1 10:27 | 只看该作者
本帖最后由 lvsy 于 2014-7-1 10:40 编辑
$ G7 E" M% H( T3 O! S
1292569609 发表于 2014-7-1 10:04! F6 q& Q( d( J" g5 X# D* i+ G
再请教一下啊  R' V* f( G+ G9 |
) _( g( j, z, x/ b4 Z1 E
Error (10228): Verilog HDL error at gen_clk.v(1): module "gen_clk" cannot be declare ...

- M* b. k* ]+ v8 ~- ~, t# @5 M" K* H$ L8 ]* s0 }5 i
是不是指Gen_Clked?
: w3 o- Z: E9 I  E0 a7 s+ d+ Y$ p* a% J& `: z  w* g
把defparam 这句移到gen_divd Gen_ClkLed(......); 模块例化的后面试试看!% x1 p! y. w/ ^' _
+ y. m% s2 I% A4 }6 v' S
或者这样例化
6 P5 }  j& n/ N# a& p. m6 m# q/ P- }& M/ x1 }6 c. _  M- y# `9 m# d
gen_divd  #(.divdWIDTH  (23),
1 A; @. d2 l" g1 t                 .divdFACTOR (10,000,000 ) )( x& V. O% H; R% N7 z
4 E; K4 L2 j# {8 c, U
               Gen_ClkLed (.reset(Resetb),% R8 I' c9 c$ q1 j9 }& O+ |2 K
                                .clkin(ClkIn),4 J( ]5 Y# g8 |$ C% I* p, ?
                                .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: l- t( z0 ]- J是什么意思啊
9 E% o* U; _/ p1 E7 g: X* f0 M

该用户从未签到

9#
 楼主| 发表于 2014-7-1 10:39 | 只看该作者
`include "gen_clk.v"+ s4 `1 U% t( }4 O& _+ T0 B& D6 b

( Q- S  Q+ b% c% f! _/ a  Omodule led(clk1,reclk1,cout1,cout2);* J, `: T. N$ E5 V  }& _
input clk1;! W( R9 y* {" J. q; z* N
output reclk1,cout1,cout2;
+ Z7 X1 L" @9 U6 |; p3 u9 A. areg reclk1,cout1,cout2;
0 h1 z: _  S( ], e! ]* P/ J1 k- M6 }" ?; }2 I
gen_clk led(.clk(clk1),.reclk(reclk1));
5 l4 l( o1 X+ u( ^( A; hdefparam led.width=2000000; //频率是0.08S;) A! }' \" i' Y7 F; I

, u" }3 M; f+ _0 ialways @(negedge clk1)7 T6 a1 d5 P" N" u* H0 O  P
    if (reclk1==1'b1)
% m& y* K" G( o0 G& G- x- g         begin
1 `( c) ~% ^2 n. X) |         cout1=1'b0;
- D0 F2 A/ U! m& f: Y) f# j1 G% L         cout2=1'b1;5 `! W- A: N' t7 J
         end
* J1 t0 R# \# f. Q  A+ u         else" d4 l/ Y! H2 y5 ?+ z
         begin) n1 E' ^7 A* A1 U1 g
         cout1=1'b1;+ J" P' w. ^; e7 I5 \
         cout2=1'b0;
+ U* y6 i7 u& w2 J1 Z6 U& Z    end
$ |3 r+ t+ j( Y- x$ n5 f) i( Sendmodule& }9 g1 C$ E- H% k, U2 @$ k* G
% G, r4 j( f) T: z) `6 H
module gen_clk(clk,reclk);
0 t; s- h% `) a. G7 M' N- P( Ginput clk;) s% L9 ]; R4 H# I4 @
output reclk;9 m6 h) r1 X/ Y" |- u
reg reclk;
$ {5 a: k# ~, Y0 y* ^parameter width=1000000;//分频数1000000/25M=0.04s3 A% ?3 }" L: {4 N
reg[11:0] count=12'd00;9 U/ c9 n, S3 \$ A! ]3 d
always @(negedge clk)
8 x+ H- g+ h7 p# @/ ?' p; h- l  if(count>=width)
$ ~1 C! Y1 d6 `) Z9 {% A7 h& \  begin
& p8 Z9 H! J2 X% O  count=0;
( o* {9 T! Z4 R6 E$ ^$ A  reclk=~reclk;
- d0 H% ~, R! y  [/ J  end( ~, I# K5 m! z" k4 c; G1 q0 J7 L
else count=count+1; 9 h, j3 [6 s) q0 f
endmodule
1 S' A/ A, ^* i& E, ~9 l& G5 V这是全部的程序了
' o! E) s; p2 k) j9 V: S7 L麻烦指点一下啊

该用户从未签到

10#
发表于 2014-7-1 10:50 | 只看该作者
1292569609 发表于 2014-7-1 10:39, N+ D% B4 ?% ^; o
`include "gen_clk.v"9 N: e& {9 k7 D7 \
$ u. K. e" ]. @
module led(clk1,reclk1,cout1,cout2);

4 o, F( H, ]2 p1 c3 O7 z2 a# c发现了两个问题:
+ {9 k% I' Q# }8 I- T8 e% ?. n1. gen_clk模块里reclk没有初始值,综合会发现latch。+ o- C1 V+ ~# b' ~4 j' u
2. led模块里reclk1不应该定义成reg型,应该是wire型。

该用户从未签到

11#
 楼主| 发表于 2014-7-1 11:37 | 只看该作者
为什么要定义为WIRE型了. ?; ^( S& D6 C$ O" Y2 R

该用户从未签到

12#
发表于 2014-7-1 13:11 | 只看该作者
1292569609 发表于 2014-7-1 11:37, I2 N, z* }; Q0 R5 G6 x$ @
为什么要定义为WIRE型了

( U/ J* O# U% e9 K# J+ O因为它是gen_clk模块输出的,led模块调用了gen_clk,在led模块里就不能再对它赋值了,否则就变成多重驱动了。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-31 09:01 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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