|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
module mux(2 A, y0 D9 H5 t8 M: c% D# B2 x
clk,rst_n,
@+ W* W. ^+ r3 g2 z start,ain,bin,yout,done4 Q% r9 A3 ^. {0 f+ I6 I1 b! H* b, X
);
5 C! @( ~! O: |+ f & e9 J' v1 Q" W+ j8 O. c
input clk; //芯片的时钟信号。
" }; |1 ^% o( v! [ E! ? input rst_n; //低电平复位、清零信号。定义为0表示芯片复位;定义为1表示复位信号无效。9 I) b/ k7 r( |+ K; | F
input start; //芯片使能信号。定义为0表示信号无效;定义为1表示芯片读入输入管脚得乘数和被乘数,并将乘积复位清零。! ^+ e/ \/ v3 c; v8 D
input[15:0] ain; //输入a(被乘数),其数据位宽为16bit.
* J9 r8 H5 b1 j! x, i" L input[15:0] bin; //输入b(乘数),其数据位宽为16bit., F/ | r+ a! F, |' r
output[31:0] yout; //乘积输出,其数据位宽为32bit.* Z, o+ R" S+ u* t
output done; //芯片输出标志信号。定义为1表示乘法运算完成.
2 p# D" }( o, O1 N2 m, ]
( z% f0 V$ o% b6 W2 g reg[15:0] areg; //乘数a寄存器
/ C& ^) }1 c& F$ v- U& O7 `% D1 n reg[15:0] breg; //乘数b寄存器
( V! @! L( C) q5 ?+ w reg[31:0] yout_r; //乘积寄存器
. ], r2 m' m" B m8 E! h( F$ Q, U/ x reg done_r;0 }4 O- B8 b' } ^4 ~
reg[4:0] i; //移位次数寄存器* T b8 z0 f* ], N" s" r9 f% Y
, I8 }- d( }' V4 V) F- H //-----------------------------------------------------------
( R+ f: L- ?8 z2 \! {+ Q* _( ^ //数据位控制) a. \; W+ s j& t5 Q
always @(posedge clk or negedge rst_n)
1 m! [' y& e% O. b2 I/ ^: l& J IF(!rst_n) i <= 5'd0;& X0 {7 \* m1 o/ t) D( r" P
else if(start && i < 5'd17) i <= i+1'b1;
& b7 V! V/ p* {2 {/ X else if(!start) i <= 5'd0;! [" H7 c1 V M) I& ]3 N
5 c0 ]! F p- G3 _ //------------------------------------------------------------- - s* Z+ x- r' B; W
//乘法运算完成标志信号产生8 P) U z% g4 S6 h4 z
always @(posedge clk or negedge rst_n)% o9 C' l4 W2 _' G' ], X6 o# C& i# }- g' H
if(!rst_n) done_r <= 1'b0;, I' W1 z' y% { _) h4 S/ w: i2 r
else if(i == 5'd16) done_r <= 1'b1; //乘法运算完成标志
) g1 G8 v, C+ A+ c3 C; d k0 W else if(i == 5'd17) done_r <= 1'b0; //标志位撤销0 S+ c8 L, T$ H$ Y+ O
( d! h! N/ E. k
assign done = done_r;
1 I& q# O( s% X% g% a; ]. O8 J 0 K3 J: I2 L8 [+ h0 G5 H- b
//-------------------------------------------------------------$ _$ S6 q9 r/ L' F9 Z1 Z* K
//专用寄存器进行移位累加运算
' S) G! H+ X- F2 E/ r0 H: f always @(posedge clk or negedge rst_n) begin- D, G( F5 ]8 V9 t! U
if(!rst_n) begin. w% Q& ]5 u, ?
areg <= 16'h0000;
" i' R8 _- U: \% y. v breg <= 16'h0000;5 \' J3 J; T$ j$ q- q
yout_r <= 32'h00000000;) E( C: e/ a5 K' e- s
end
# S$ t* l* a$ B9 D& I9 Z% B else if(start) begin //启动运算
5 J$ u/ [& c; n; k [; Y if(i == 5'd0) begin
i6 \2 _3 } p areg <= ain;% A+ Y; B' `+ g! J2 z6 ^' M
breg <= bin;2 x2 s6 R; O. Y2 K; V4 }* @/ v4 }
end3 l: ^5 l7 w) K) r
else if(i > 5'd0 && i < 5'd16) begin3 R$ u6 W/ F5 T. W" g/ T4 ]6 Q
if(areg[i-1]) yout_r = {1'b0,yout[30:15]+breg,yout_r[14:1]};
+ ^" ~5 A1 Q" f3 A6 A else yout_r <= yout_r>>1; //移位不累加
5 C- \8 T _+ w" H end" B. F4 k2 l8 G7 I6 Z+ { t( V
else if(i == 5'd16 && areg[15]) yout_r[31:16] <=yout_r[31:16]+breg;
* W- B% V3 E$ a' B, ^" F end
! H! m0 Q9 z9 h0 d9 N/ }" B end1 P) M# [& [9 M# ^6 a; E) X' m
assign yout = yout_r;
( _+ s f( F5 d; e& e( e" T' g3 J
. K7 J, \$ I; `" F4 sendmodule
! ^% f; y8 `4 i0 q2 b! S% k! X9 e% V; y% \7 i$ s
( q K" q6 Y) @5 o$ `
+ c F+ ?8 o& f: x5 h4 z9 I& i
verilogHDL乘法器疑问?关于if(areg[i-1]) yout_r = {1'b0,yout[30:15]+breg,yout_r[14:1]};这句语句的理解,大神求教!
, q4 O* N$ \9 ` |
|