|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
FPGA不是单片机$ H( K8 ^5 b' E0 R
% @( f& k1 B! q, a- f7 ]# x
关于这点,很多人反复强调,但遗憾的是,把FPGA当单片机玩的人仍前赴后继。笔者琢磨着有可能是入门方法有误。" ?( W: w% `& N+ b* o
# m7 L5 u7 |- w! }0 R5 q7 B# M回想一下我们是咋学单片机的?买一本教材,了解一下IO口和控制字,然后开始画流程图,用C编程,做各种经典实验。
+ M; n4 {. J$ ~% C: r9 [: y' Q8 [' M; d6 m4 ?$ h
而当转到FPGA时,很自然的会借鉴“单片机模式”,买一本HDL的书,发现Verilog和C长还挺像,很轻松的啃完HDL,然后就开始“编程序”。待编完后,一点按钮,一口气从综合做到PAR(ISE和QuartusII都能一个按钮跑整个flow),然后仿真。仿真OK?皆大欢喜。不OK?改code。咋改?不清楚。
/ p/ b% ~% ?, d$ V; y% B; m% {1 ?, D* _$ K
这个过程中最大的问题在于把FPGA最大的硬件本色当成黑盒处理:黑盒的输入是code,输出是仿真。1 T! u5 Z/ u3 v0 h- o# A* B* L
( t, W4 `' o3 t* ^
当把黑盒漂白成白盒,大致知道这盒子里有些啥,干了些啥,那在笔者看来才算是入门了。漂白粉是啥同志们应该猜到了:FPGA的结构。, O9 [$ Y/ S( Q' @: v1 c
& q6 W: a* s$ g9 ~; d% j推荐阅读:) F' }! J- x; m, n
Z4 w7 k7 e6 r6 G( ~a) 采用Cyclone与Cyclone-II系列器件进行设计.pdf
" n& v/ ^5 P& _: P9 H* B! e- S) E6 _6 \2 K) D5 ?! b
b) altera: Cyclone II Device Handbook.volume14 ^( \/ V) v& E4 a; r! r2 y8 p
6 @- r4 Y% n0 G/ f: A1 G" k
c) xilinx: ug380~ug389(spartan6)
2 c! y; t& s7 [) x
$ }; l* B9 K+ A9 {6 w, Q5.HDL不是C,结构决定HDL; g, H4 f0 t% z1 M$ L
3 r( E# v8 B9 h6 {7 G2 W
上面说到FPGA的结构是漂白粉,这节承接上文继续:. H* x" S) @/ ^3 q6 I' d
) @0 V8 U- S% c- s* ?5 p# K2 [
时序逻辑的敏感列表为啥只能有时钟和复位?如下:
+ \ n- L7 n7 T, r9 m/ `& y& L/ D+ G; e7 p# E) Y+ f7 |3 C
always@(posedge clk or negedge rst_n)8 V4 \, b3 A2 y5 `6 t" R, t6 I/ d$ a
1 C G/ s* r9 _- A `而不能再加个使能:
9 o& {/ x) T( z* C- q, P4 v1 U7 L. X
always@(posedge clk or negedge rst_n or posedge CE)
# p" Q/ F% {( c! I/ k: E: \9 m7 T p
也不能双沿触发:
, k, v) w$ N0 [3 } u8 W
: U8 Q& R+ f$ Y" u& I/ b ]- ualways@(posedge clk or negedge clk)7 t4 Q/ }3 x9 K6 X
# d" @* a) \6 t
也不能沿触发 + 电平触发:
+ U/ y2 R/ V& k1 b* y. \+ Y' L/ f& ~7 H/ G g, f
always@(posedge clk or gated_logic)
8 B* A! ?6 \3 C# {
/ C* W% @0 {8 y! {这一切究竟是为啥呢。。
: t! x' l i! Z# P* r ~; p
( \& v* x/ u( t3 P" l7 P( E无他,结构如此。下图是cycloneII的一个基本单元LE(logic element): i }/ j( B6 a6 r/ B) f: k: b
* f& z v, Z2 `- o8 @( q
6 K( F! |8 P9 w& e/ M
" e3 y, Z) Z5 R5 M, i
右下角那个寄存器看到了吧,单沿触发,异步复位,同步使能。所谓结构决定HDL也。
5 x+ i8 ?9 P; J2 K$ F e) N' \' y3 _2 N$ n [& A3 q+ V0 U7 T3 I
顺便再看一下寄存器的复位端有个小圆圈,表示低电平复位,所以我们这样写:
- x5 ]& C {0 ~+ H- d' i S" G, `- H; u4 _( |8 B+ F% c' M7 M- P
always@(posedge clk or negedge rst_n)
) v- x. P& c/ T* l7 e9 s8 ]6 x% Z2 \ q1 M8 C& x/ c# L
再截个spartan3E的:$ H& k6 M+ f! V: S4 B
: r: J2 G/ E/ s: z9 z- }
% n8 {$ ]6 p8 M( w' R* U' u2 `7 w' a: A# {( h: `
看出点名堂了吧。xilinx的寄存器是高电平复位,所以如果你是xilinx用户,那就要这样写:
3 k' r0 c' F* r( U5 n- }
2 _2 a6 ?: r) w4 g [3 @7 {+ zalways@(posedge clk or posedge rst_n)
% k$ r1 ^& K: O5 [! M0 c/ E5 x3 |/ [4 V+ M
再来说一个经典的模型:FSM。为什么FSM推荐使用one-hot编码?如果读者有兴趣,可以做一个实验,会发现one-hot的解码电路一般都是小于4输入,也就是能用一个4输入LUT搞定。假设FPGA中的LUT是100输入,那即使解码电路再复杂点也能hold住了不是。) t9 u1 I3 w$ {. {- t1 }) y
+ W: X3 ?8 _2 j- S推荐阅读:
# s. b3 }7 B# O6 A+ z, ]
/ {0 E' P' I2 {0 Xa) 设计与验证:Verilog HDL。
- x+ P- E) g( Q/ h0 b4 d; q D# t! s' a0 Z# f6 l: n" X6 B2 T
b) Verilog HDL 程序设计与应用 王伟编
4 u. m; x5 e0 C" K- Y# k. Z: V8 _
c) Clifford E. Cummings的论文,http://www.sunburst-design.com/papers/; X/ R+ ^9 a0 O" x, L6 i, w
* N0 R; `) Q( I- ~) p3 Z$ z
d) 大唐电信FPGAcpld数字电路设计经验分享5 c" ^7 A9 s. {! J6 F% l8 f- t
: ^1 y9 ~0 F4 y7 y
6.掌握主动权
+ @! z0 p( A2 j1 @
0 s# W$ U3 `/ u由于综合器的算法限制,只有当我们的HDL满足一定的coding style,才能映射出我们想要的东西,比如前面说的对寄存器的建模对敏感列表的限制和要求。而有些复杂元件要求的coding style则更复杂,比如memory、乘法器。
# S0 k. h# j7 _$ P
4 N# Z5 D0 o7 M7 l2 i6 H6 `这时更好的选择是直接调用软件提供的各种module,altera使用megawizard,xilinx使用core generator。这样不但直接告诉综合器我想要的是什么,把解释权掌握在设计人员自己手里,而且由于这些module一般都是经过优化(基于器件)后的网表,性能上会比自己写的更好,更灵活。1 {4 q y" {" U P5 ~! Z# H9 Y
) C- g6 Y T5 T* V当然调用module也意味着在不同vendor之间转换将成为一个额外的问题。所以有些设计为了兼容各家的产品而故意不使用module。
! O# N4 o8 a; r5 K5 a3 A/ T
" q! Q8 n8 ^/ d# z% D; w到这里为止,经常是新人止步的地方,即所有的精力和视野都放在数字前端。要成为高手,后端的内容具有一票否决权。
8 s: _1 s" ~4 l; r |
|