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

FPGA的语言和举例

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-3-30 09:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
, ], q8 [7 \8 z( x& d( _
talk is cheap,show you code!
0 c0 ?9 u/ l2 g, n- d4 o1 k( j! T/ ^' A0 O# e
下面我们举一个例子来讲解2 y" y0 {% M0 }! i' z
1 z( W+ U( E, ^7 x+ f
下面我们用verilog实现超前进位加法器:
, l6 L+ z, d, w% S; ]# q6 U7 U+ H, P/ |0 h, X
例1:超前进位信号的产生原理& j) j$ J% v5 H( q( x7 q
ab = 1 --> co = 1
* _9 i# n% c& P( e* s; f4 na + b = 1,且ci = 1 --> co =1: O3 Q, x2 v, _! w0 [
两位多位数中第i位相加产生的进位输出co(i)可以表示位) N3 F2 K) F; |: ]! n
  }3 ]* C+ P9 o) r# Z
coi=aibi+(ai+bi)(cii)5 ~: z! g/ C0 C4 d/ f* C
从全加器的真值表写出第i位和s(i)的逻辑式:
) m% h8 R6 q0 _) @. Vsi=aibi′cii′+ai′bicii′+ai′bi′cii+(ai+bi)cii
5 ^* A+ f& I! m6 I' Y上式变换位异或函数位:
. Z6 w. h  v! l+ t$ vsi=ai⊕bi⊕cii
7 _9 g. X0 u' |3 h8 D( U% _
- k% \& C" I! K9 S, Q: ?" O1 B/ @$ L( A$ u/ f
代码:
: P4 @  Q* I4 ]5 n% P4 U# X+ t
2 |& G9 k7 S9 H2 ?  `* p6 t7 wmodule carry_look_aheadadder(
* Q# g" H0 Q7 f1 p                             output     [3:0]   s,2 q9 G& D; Q( Q0 h1 r0 B5 R- W
                             output             co,8 k+ F0 v, y% U
                             input      [3:0]   a,
) x7 J) s& x* v1 r' y% r' H                             input      [3:0]   b,
' H9 {. V- A- u& K' z                             input              ci
6 ]" I  D4 `: q& V# Y" L+ O$ ^6 u                             );" y' u# X0 @; J* @! c+ m
wire  [3:0]    co_tmp;
  C* Z% q) E$ ?* Kwire  [3:0]    cin;& q# z& p+ I% f! ?7 M" t% n+ C

+ u  X" q7 }, ?8 Rassign  cin[3:0]  = {co_tmp[2:0],ci};) c3 U3 w4 R& R% g# v; P2 _4 O

7 {& e' h1 W/ @( Y/ t  w//计算中间进位! u/ ?% `0 [/ _
assign  co_tmp[0] = a[0]&b[0] || (a[0] || b[0])&(cin[0]);4 w% I- k/ A$ A: f' B" ^
assign  co_tmp[1] = a[1]&b[1] || (a[1] || b[1])&(cin[1]);
) T) H2 V$ |0 _! o4 e, w4 a1 d1 dassign  co_tmp[2] = a[2]&b[2] || (a[2] || b[2])&(cin[2]);' i0 n' ], p' @
assign  co_tmp[3] = a[3]&b[3] || (a[3] || b[3])&(cin[3]);
. \  i& Y4 |4 q9 A# p5 i; |# `0 }# f: |& l3 w
//计算和/ x$ R; d, k1 F# \1 R3 Y8 ^4 k. W
assign s[0] = a[0] ^ b[0] ^ cin[0];
1 g5 V6 U) v& X0 a# m4 cassign s[1] = a[1] ^ b[1] ^ cin[1];2 t% K; l' q% Y& j% P1 u
assign s[2] = a[2] ^ b[2] ^ cin[2];
& T" ~( `6 g2 o, Q) L( nassign s[3] = a[3] ^ b[3] ^ cin[3];/ q: r4 t/ C+ D9 K: S
) s& X5 H4 N7 J( C7 d+ u# b
assign co = co_tmp[3];
" f* n) f9 m& \- a6 U) S, L. kendmodule6 ~& R+ J1 m0 c6 J
module carry_look_aheadadder_tb;
" u/ J6 v- _; v; L: g# E- Rwire      [3:0]       s;0 j8 M* r3 I8 s& _1 E4 Q5 z
wire                  co;% b5 G  Q- ^, x1 R: J+ }: Y
reg       [3:0]       a;
2 F% y' M6 H; u, ]. lreg       [3:0]       b;
' @/ E3 C5 G8 M  d/ u8 |( Rreg                   ci;) s  I7 s4 M% n
5 M- K1 t0 Z3 F
initial) v5 O3 G3 }! `3 d( T# Q  W
begin
9 e* V4 D2 R5 J1 B2 L          a = 4'b0000; b = 4'b0000; ci = 0; 0 r0 B; C  Q* g
    #10   a = 4'b1111; b = 4'b1111; ci = 0; * i% E; B2 ^- M: r0 Y4 O
    #10   a = 4'b1100; b = 4'b1001; ci = 0;
! ~8 s) I- X( J. ]    #10   a = 4'b0111; b = 4'b0110; ci = 0;
3 g6 A" O3 n) u! U2 n    #10   a = 4'b0101; b = 4'b0101; ci = 1; % z" c4 z; \0 c* W; q+ c
    #10   a = 4'b1110; b = 4'b1001; ci = 1;
5 X& c7 w( s6 D    #10   a = 4'b0010; b = 4'b0110; ci = 1; ! J- O) i# I7 |3 f
    #10   a = 4'b0110; b = 4'b1100; ci = 1;
  Y. f8 ^& j- D    #10   $finish;
0 r+ `9 f) L/ |) e5 uend- |0 O$ c9 }. ]0 H6 Z* H0 c/ w
- d' r- }# R" q; E, T0 f
initial begin
  L# ]$ _: x! `' s" e$ @  $fsdbDumpfile("test.fsdb");
) @$ B' |1 r$ n  $fsdbDumpvars();- `9 W, W. V2 Y7 ?1 Q+ |7 a4 i( ~
end
, o3 K$ b4 k+ w! b6 P) n9 s* ~7 Y3 c8 Y; k  n! L+ N% b
carry_look_aheadadder u_carry_look_aheadadder(! z  h' G* q, x: W6 M
                                              .s(s),
, K2 w; X! J: l) I6 h, g8 s                                              .co(co),
+ s  i& V' R$ ?' ?0 Q0 r5 ]) U                                              .a(a),
4 L4 q* B4 @! N% K/ a9 v                                              .b(b),
- n# j3 l1 t1 }( o2 b8 j                                              .ci(ci)2 `$ Z6 |5 P0 x: ^2 Q! r
                                              );1 O6 T6 Y- G8 k
( F- P9 Z) J2 Y3 }( F# \
endmodule
+ U& {0 w1 e- A+ W
' d# }3 b9 _$ X$ s, J6 i
% c; N9 v% P  R" X( P结果:! R# D- w3 N& U' Z& J

! k0 `5 C2 t- y, O" i
* u' b  w) I5 y+ m4 K4 e1 O- m; w2 V3 A3 [" j+ b

- d4 a; ~" F% X* F7 C. p ( \/ R! z  ^4 ^. Z
9 \2 K1 b! Z1 u/ f- C% L
可以看到,这个和一般的高级语言差别比较大。
. P7 H8 u1 Y) n- T
, z( Q- M$ }2 X* w学习FPGA必须有过硬的硬件电路基础。) P  N) N0 x! J& L" }( h6 Z1 b/ O; z! [

8 b7 P6 ]# t3 @4 n! x7 p4 C例2:
0 N$ N: k$ ~! w2 W
' m; V' x0 I# o$ c' C
5 w" m( t7 |; C# P! X* o4 `7 E! ~: Q4 a# Y
上述为lattice的一款FPGA架构,你可以把它想象成一块放满电子元件的硬件电路板,图中“电路板”上的元件有IIC和SPI硬核接口“器件”,有NVCM程序存储“器件”,有RAM数据存储“器件”,还有最小单元的LUT(查找表)器件。/ v5 w5 M2 p( f4 Z) T
8 d. G' j% R2 f1 m
一般FPGA工程师会使用硬件描述语言Verilog或者VHDL对FPGA进行“编程”,之后,再经过厂家提供的FPGA开发工具(Diamond或Radiant、vivado)的综合、布局、布线,会产生bit文件或bin文件。
: p% t* |1 {& ~: j$ U. B7 n7 h0 M6 ~0 P5 b
如果工程师将最终产生的bit文件或bin文件下载到FPGA中,就相当于一位硬件工程师,在FPGA芯片这块已经放置了“元件”的“电路板”上,进行了布线操作。(也就是把毫无关联的与器件,用铜线连接起来)7 v$ m. U+ d. z! C" m

) E7 g2 e3 X1 |2 W" N下载程序后的FPGA,我们就不能简单称之为“电路板”了。
& D, E0 ]9 B3 m( k7 q9 ^! A+ U( x0 X! k7 x( H$ f
举个例子,FPGA实现的功能是SPI转并口,那么这块FPGA就可以称为“spi接口转换板”。
" |2 J2 Z: P2 _) h% a% {( u2 U* k$ k
当然,FPGA和“电路板”终究是不同的,FPGA可以进行重复编程,相当于一块可以反复布线的电路板。
9 B8 u- R; U. V

该用户从未签到

2#
发表于 2022-3-30 11:27 | 只看该作者
看到举例直接收藏

该用户从未签到

3#
发表于 2022-3-30 14:20 | 只看该作者
用verilog实现超前进位加法器
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-6 05:05 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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