TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
, l* F t" H: k) f ~. C) ]/ B/ y: j0 c V6 d
加减乘,在fpga设计中,使用verilog hdl语言来描述,简单的很,直接就是+、-、*,没有任何疑问,但是计算过程中的信号的位宽,却值得认真揣摩。; W7 S) s, A' Q, D" I
7 `9 n3 l2 K+ p. r( `2 t
数学运算,必然涉及到有符号数与无符号数的区别,因此在写hdl代码时,必须明确参与运算的信号是否是有符号数。建议:参与运算的符号要么都是有符号数,要么都是无符号数,不建议使用有符号数与无符号数进行数学运算,如果在参与运算的两个信号一个是有符号数,而另外一个是无符号数的话,建议把无符号数扩展一位,将其转换成有符号数来进行处理。& |% y3 R3 }- H
无符号数扩展成有符号数的方法(以verilog为例):' s' u, ]8 |2 v( h! H% c7 v
input [7:0] data;
. B% h& P$ N' b" Z+ }( r; M+ h9 k wire [8:0] data_r;
9 s: Z$ z8 c8 m* [6 ?2 ~* N! S Z assign data_r = {data[7],data};
* C2 G" Z D. z1 m0 S6 J* A: X' y0 W! H
加法运算中的位宽处理:$ a( k9 e# c1 u1 l
input [7:0] data_a;6 r" a: v( c9 {- p$ P
input [7:0] data_b;
4 s1 N8 d* M* A6 K& t" N- }! i output [8:0] data_x;
* w7 C% [+ \' ~! j+ O9 F h wire [8:0] data_x;( W% [0 s( S0 c8 L% {
assign data_x = data_a + data_b;# [1 d% f# K- i2 x% c" B( Y
如上面的代码,在做加法运算的时候,建议:
3 ?# ^0 Q# T# ^; A 1、加法运算符两边的信号,位宽一致;6 V9 H& N" @) h5 V/ L. w. F
2、加法运算符两边的信号,要么都是有符号数,要么都是无符号数;! ]; u+ V+ p+ l; v1 Q1 T
2、考虑到加法可能产生进位,输出信号比输入信号多1bit即可。
5 p* a! n) E- X- Z6 g
- v K% Y( X; Z! _- ?( S7 }* ] 乘法运算中的位宽处理:- a) X) U' i: m; c; @5 B( H
1. 两个无符号数相乘: t8 X, q3 |3 h3 Z1 ?8 V
input [7:0] data_a;
0 w7 o. W- ^- X input [4:0] data_b;7 K @4 f& E6 e6 Q! R' k
output [12:0] data_x;$ G" R9 a+ N5 [' ^2 { f9 U* K
wire [12:0] data_x;4 _( P6 M- z. I @( `* J" O; N
assign data_x = data_a * data_b;
2 y3 U0 H" h- v. o 两个无符号数相乘,输出信号位宽直接定义成两个输入信号位宽之和即可。) m+ r+ e; E! k! \3 \
7 f. J! a4 s% ]- y, k 2. 两个有符号数相乘. \+ U2 e& x4 ^# u8 B
reg signed [7:0] data_a;
7 ^$ V$ m( V7 R" X2 l$ C9 \ reg signed [4:0] data_b;
! B# D) R+ K* a, }( M0 ~. h output [12:0] data_x;9 L( W) ]" G# A! e) ?3 [: G
wire signed [11:0] data_x;7 x+ ^. ^ L# Z! S
assign data_x = data_a * data_b;$ g# [, w3 e4 D
两个有符号数相乘,考虑到符号位可以合并成一位,输出信号位宽定义成两个输入信号位宽之和-1即可。
/ [. K6 F; f# p: ~, c3 t, |2 G t# D' y* U! w- Y* |
3. 平方运算
8 y; J m6 w7 R# B9 T 如果输入信号是无符号数,则输出信号位宽等于输入信号位宽2倍;
2 d; L* B3 R5 v! {+ Z: v U 如果输入信号是有符号数,则输出信号位宽等于输入信号位宽2倍-2
# F! P: i2 k) f" v# i% k/ L& B! [; L2 r* z3 f1 y+ r
9 `, H/ X2 I$ i0 f( L3 O" J" |2 G- V/ D% j0 V, K D6 a- u* h( }
|
|