使用vivado实现一个8位串行乘法器


前言

对于串行乘法器的实现大多都是采用移位操作来实现的。用公式表示为P=xy=∑xk2ky。


一、verilog代码

1.仿真代码

代码如下(示例):

module multiplier(clk,x,y,p);
    input clk = 0;
    input [7:0]x;
    input [7:0]y;
    output reg[15:0]p;
  

parameter s0 =0,s1 =1,s2 =2;
    reg [2:0] count = 0;
    reg [1:0] state = 0;
    reg [15:0] p1,t;
   reg [7:0]y_reg;
  
    always @(posedge clk)begin
     case(state)
     s0:begin
      y_reg <= y;
      count <= 0;
      p1 <= 0;
      t<= {{8{x[7]}},x};
      state <= s1;
     end
     s1:begin
       if(count==7)
       state <= s2;
       else
           begin
           if(y_reg[0]==1)
               p1<= p1 + t;
           y_reg <= y_reg>>1;
           t= t<<1;
           count <= count +1;
           state <= s1;
          end
       end
       s2:begin
         p <= p1;
         state <= s0;
       end
       default: begin
       state <= s0;
       end
      endcase
     end 
         
endmodule

大多数教材中由于没有设置default,并且对于state没有设置初值,所以永远也无法进入s0,s1,s2这三个状态。

2.测试文件

代码如下(示例):

module tb_multiplier(

    );
    reg [7:0] x;
    reg [7:0] y;
    reg clk=0;
    
    wire [15:0] p;
    
    multiplier tb_multiplier(
        .clk(clk),
        .x(x),
        .y(y),
        .p(p)
        );

   
    always begin
        #1 clk = ~clk;
    end
    
    initial begin
       
        x = 8'b00000001;y = 8'b00000001;
        repeat(32)
        #20 x = x + 1;
        end
        
    initial begin
        x = 8'b00000001;y = 8'b00000001;
        repeat(32)
        #20 y = y + 2;
        end
       
    
endmodule

二仿真结果

总结

从仿真结果可以看出,上述串行乘法器数度比较慢,时延很大,但是这种乘法器的优点是所占用的资源是所有乘法器中最少的,其在低速的信号处理中有着广泛的应用。

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhyj_918

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值