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

FPGA的语言和举例

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

6 P7 N/ f9 O% T, p% T7 etalk is cheap,show you code!
8 Q& H. S7 V- _6 U+ b% @3 e8 Z2 Z/ W6 I
下面我们举一个例子来讲解
2 A6 p7 h8 y' A+ M6 @- p
! n6 ~6 k: W! p下面我们用verilog实现超前进位加法器:; b9 m5 e, [' q2 P( W

0 w4 g6 W( G8 u* X例1:超前进位信号的产生原理
5 K- u5 Q$ C0 A7 k1 K2 }ab = 1 --> co = 1
& b7 B# r* @" x0 Pa + b = 1,且ci = 1 --> co =1
8 z4 I9 O9 y9 n' p) E" T4 m两位多位数中第i位相加产生的进位输出co(i)可以表示位
6 }) p( O6 E0 v# S  G2 q: ]( Z4 Y! ^! Q2 o6 V1 ?
coi=aibi+(ai+bi)(cii). g$ f. N/ L8 g: b3 u
从全加器的真值表写出第i位和s(i)的逻辑式:8 \  a5 N* ~9 e
si=aibi′cii′+ai′bicii′+ai′bi′cii+(ai+bi)cii) G7 y" |  q% s
上式变换位异或函数位:- E; A' m* o: a+ s: \# z# [
si=ai⊕bi⊕cii
9 E: a# s+ a4 b0 x- Y2 w% M' w
! x8 G3 g5 w9 ~& S& b
代码:
) \8 B. Y, _9 B; A; J* X4 ]8 I1 t6 N' T6 M, m( u
module carry_look_aheadadder(
+ s& I% k+ r! x& ^1 m' a                             output     [3:0]   s,
9 x& W7 M* j8 P8 a9 J2 ^                             output             co,
- D# L: n/ Z4 C                             input      [3:0]   a,
1 T! z! B: p8 y/ w% _" ]3 I                             input      [3:0]   b,/ z) u+ {/ e3 A! w5 s+ Z" \( @
                             input              ci! _/ y9 i$ x* D9 |
                             );9 I5 u( b9 e* w! s
wire  [3:0]    co_tmp;
  N+ J% s) `$ awire  [3:0]    cin;* s/ W0 d7 e/ l' i' m2 C7 h$ g

* ]( l6 r3 V* }% k7 Q/ vassign  cin[3:0]  = {co_tmp[2:0],ci};5 ~9 X4 ~, N% X( b/ q1 J- `
" T0 y- U3 q) L& A% R& P: N5 o
//计算中间进位
; P. U3 m% }8 W. i9 i) i# \assign  co_tmp[0] = a[0]&b[0] || (a[0] || b[0])&(cin[0]);1 ^6 s# W. @! J8 h2 i
assign  co_tmp[1] = a[1]&b[1] || (a[1] || b[1])&(cin[1]);1 p. J% I) p% w. Z; d; x/ u
assign  co_tmp[2] = a[2]&b[2] || (a[2] || b[2])&(cin[2]);
( A; l: y) q7 ~+ Aassign  co_tmp[3] = a[3]&b[3] || (a[3] || b[3])&(cin[3]);+ g# T: ~! A" \
4 a: z) I) g% r/ L! @. c
//计算和; I9 M* [* c$ H5 W
assign s[0] = a[0] ^ b[0] ^ cin[0];! ^6 D/ j$ s) I
assign s[1] = a[1] ^ b[1] ^ cin[1];9 _7 C1 u) E* `9 P" [
assign s[2] = a[2] ^ b[2] ^ cin[2];
8 @: P6 w, B* W1 E7 a! Qassign s[3] = a[3] ^ b[3] ^ cin[3];0 H( w2 x. A+ K3 a
. G9 V$ ]5 H  a! G9 C, I+ Z' S
assign co = co_tmp[3];
7 F( O: O- G! E: T: a% A- tendmodule% L/ `* @% h) a( @' R2 ~
module carry_look_aheadadder_tb;4 I' }  H  P' {9 L
wire      [3:0]       s;8 B6 U. M! K/ D' T5 M$ N# h
wire                  co;" r7 M7 g% B4 s9 `- r
reg       [3:0]       a;+ ^' J5 B6 G1 ]
reg       [3:0]       b;
5 N/ p0 C- a2 W' }( Q) R5 ireg                   ci;
+ l. N  v# M8 F5 y+ y( u5 y) ?1 A' K, [5 J5 Q1 M6 y
initial
& D* H5 [: F" e1 hbegin
4 z' t) }: ^1 [0 j! c! x. S. Q          a = 4'b0000; b = 4'b0000; ci = 0;
& K5 N9 @! P& V6 d. r0 W* @    #10   a = 4'b1111; b = 4'b1111; ci = 0; 3 i- w4 t" B- q, E' I9 c% R* d1 n
    #10   a = 4'b1100; b = 4'b1001; ci = 0;
5 t2 U3 T1 n6 F# `    #10   a = 4'b0111; b = 4'b0110; ci = 0;
* U% R6 G; t$ j, P# @' v    #10   a = 4'b0101; b = 4'b0101; ci = 1; ( H% ^/ N' `4 g; p9 M, d6 g7 s
    #10   a = 4'b1110; b = 4'b1001; ci = 1;
& K8 l4 ]2 W; k3 W9 {7 @" v/ ^, c    #10   a = 4'b0010; b = 4'b0110; ci = 1; % u( K. A; d! J, j% M) L6 |
    #10   a = 4'b0110; b = 4'b1100; ci = 1; % F, c3 K2 Q8 w( |  P, D
    #10   $finish;
! |; I6 S& G' _5 ?end
2 s2 ]' q% a$ B, J' J
+ w* r: a) ~% w/ u$ o" c5 @initial begin
% u" b' g, F* H8 u  $fsdbDumpfile("test.fsdb");9 L* t1 ^1 w+ u8 c" o/ b% u, z5 b
  $fsdbDumpvars();  ~$ |& Q" b  }. v4 C0 H- K+ E
end) ]' |* [. O' |$ d# o- o; [# U: z
- {5 J4 l1 m; _/ ?# M. A9 G. E6 w- N
carry_look_aheadadder u_carry_look_aheadadder(9 L& p+ C! n! H
                                              .s(s),
9 A+ a) m$ P% ^5 R1 I2 f- y$ P                                              .co(co),, I% X. _" X5 Q0 `
                                              .a(a),
/ R: W# ]+ ], [1 l% Y                                              .b(b),& k$ r! P+ u8 @3 g. R
                                              .ci(ci)+ r8 [* i+ E1 d- f- e9 [
                                              );) X  H' O/ _1 @; ~5 _
  v, G* [; S7 c3 V7 N" _
endmodule
4 _' k4 o+ v  e* v5 |) ?; ?7 M$ j1 m; t1 g* |
+ ^5 W1 s/ b! H. j" M: S
结果:  a* J4 B' }% |$ q: m

& g. P, u( H- X; N' ]8 ?
6 |$ T" x! L/ @
$ [5 O3 |/ p4 }! q
7 f) j2 n  t, a
# s* D- ?+ i2 T+ e& y% c3 o# a. K6 Z! ?. V) w
可以看到,这个和一般的高级语言差别比较大。/ f5 q6 r/ G2 N7 X8 ~
7 G1 }3 F% D- v7 M: J
学习FPGA必须有过硬的硬件电路基础。
) h' T' m/ e9 K0 Q& q2 J1 O/ p! D$ y6 P$ q+ \; f7 m$ Z
例2:) T& c- s+ v. G6 {
7 J3 Q3 Z  k% D! @! |* I
8 O3 k6 ~( }4 E& T- s3 @$ L9 \

/ d2 ?" @' U+ h4 }上述为lattice的一款FPGA架构,你可以把它想象成一块放满电子元件的硬件电路板,图中“电路板”上的元件有IIC和SPI硬核接口“器件”,有NVCM程序存储“器件”,有RAM数据存储“器件”,还有最小单元的LUT(查找表)器件。5 C! `( I3 d& ~/ [0 B3 d; J( E
, K9 P3 E3 }* f, ^( S
一般FPGA工程师会使用硬件描述语言Verilog或者VHDL对FPGA进行“编程”,之后,再经过厂家提供的FPGA开发工具(Diamond或Radiant、vivado)的综合、布局、布线,会产生bit文件或bin文件。
4 x' V, v6 U( ], e
3 p! S3 \8 ^: I9 Y  j* F如果工程师将最终产生的bit文件或bin文件下载到FPGA中,就相当于一位硬件工程师,在FPGA芯片这块已经放置了“元件”的“电路板”上,进行了布线操作。(也就是把毫无关联的与器件,用铜线连接起来)4 {  s9 Y# H) n5 u! }# C

# x1 ?/ m# v# N下载程序后的FPGA,我们就不能简单称之为“电路板”了。
3 `; y4 u2 b6 ^! T! V& p, T& M1 l! ^; q' X* i8 M- f. G3 ^
举个例子,FPGA实现的功能是SPI转并口,那么这块FPGA就可以称为“spi接口转换板”。
! Q) S# k6 O9 W2 \
" L& @2 i$ z2 _% _当然,FPGA和“电路板”终究是不同的,FPGA可以进行重复编程,相当于一块可以反复布线的电路板。2 f9 E$ p5 G6 {# Y

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-29 05:39 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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