欢迎光临散文网 会员登陆 & 注册

Verilog实现加法器树乘法器以及三目运算符“?”的使用(通俗易懂,一目了然)

2020-08-05 19:15 作者:小土豆逗土豆  | 我要投稿

这篇文章主要介绍了一种典型电路设计——加法器树乘法器,以及三目运算符“?”的用法

一、加法器树乘法器

  加法器树乘法器设计思想是“先移位,后相加”, 并且加法运算采用加法器树的形式。

  以4位加法器树乘法器为例,下图为运算过程:

运算过程

下面是用Verilog语言实现一个4位加法器树乘法器:

/=======4位加法器树乘法器================

module mul_addtree (mul_a, mul_b, mul_out);

  input [3:0] mul_a, mul_b;  //被乘数mul_a,乘数mul_b;

  output [3:0] mul_out;

  

  wire [7:0] mul_out;

  wire [7:0] stored0, stored1, stored2, stored3;

  wire [7:0] add01, add23;

  

  assign stored3 = mul_b[3]?{1'b0,mul_a,3'b0}:8'b0; //乘数的第四位与被乘数相乘,结果左移三位;

  assign stored2 = mul_b[2]?{2'b0,mul_a,2'b0}:8'b0; //乘数的第三位与被乘数相乘,左移两位;

  assign stored1 = mul_b[1]?{3'b0,mul_a,1'b0}:8'b0; //乘数的第二位与被乘数相乘,左移以为;

  assign stored0 = mul_b[0]?{4'b0,mul_a,}:8'b0;     //乘数的最低位与被乘数相乘,不移位;

  assign add01 = stored1 + stored0;

  assign add23 = stored3 + stored2;

  assign mul_out = add01 + add23;

endmodule

///////////////////////////////////////////////////

测试代码如下:

module mult_addtree_tb;

  reg [3:0] mult_a;

  reg [3:0] mult_b;

  wire [7:0] mult_out;

  

  mul_addtree U1(.mul_a(mult_a), .mul_b(mult_b), .mul_out(mult_out));

  initial begin

  mult_a = 0;

  mult_b = 0;

  repeat(9) 

     begin

  #20 mult_a = mult_a + 1;

  mult_b = mult_b + 1;

     end

  end 

endmodule

///////////////////////////////////////

仿真结果:

仿真时序图

在上面程序中有一个语句 assign stored3 = mul_b[3]?{1'b0,mul_a,3'b0}:8'b0 ,下面就介绍一下这个语句中出现的三目运算符

二、三目运算符(ternary operator)

  1. 语法格式:

    <condition> ? <if true> : <if falase>

  2. ton[23] ? clkdivider-1 :clkdivider/2-1

    转化为 if state (不正确的语法,但是能很好的解释意思)

    if ton[23] is 1, counter = clkdivider-1;

    else counter = clkdivider/2-1

    (很好理解吧!)

    那么程序中 assign stored3 = mul_b[3]?{1'b0,mul_a,3'b0}:8'b0 描述的是:如果乘数的第三位mul_b[3]为“1”,stored ={1'b0,mul_a,3'b0};如果mul_b[3]=0,那么stored= 8'b0

另外,当?表示状态时,等效于高阻态:Z

////////////////////////////////////////////////喜欢请三连///////////////////////////////////


Verilog实现加法器树乘法器以及三目运算符“?”的使用(通俗易懂,一目了然)的评论 (共 条)

分享到微博请遵守国家法律