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

verilogHDL乘法器疑问

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-7-20 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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 `

该用户从未签到

2#
发表于 2020-7-20 10:31 | 只看该作者
这个问题差不多搞清楚了,你自己找两个四位的二进制数乘一下,咱们一般当前一位乘的结果都是向左移动一位,但是特权大哥的是把之前乘过的结果向右移动,整体相加,一步步的乘一下,理顺思路就好了

点评

看看  详情 回复 发表于 2020-7-20 10:32

该用户从未签到

3#
 楼主| 发表于 2020-7-20 10:32 | 只看该作者
outline9 发表于 2020-7-20 10:31
) _+ U# A; \2 r8 r这个问题差不多搞清楚了,你自己找两个四位的二进制数乘一下,咱们一般当前一位乘的结果都是向左移动一位, ...

" l; c2 N) y: g* U看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-13 02:37 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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