当前位置:   article > 正文

二、verilog除法器_除法 verilog

除法 verilog

1.目标:使用verilog实现一个32位的除法器,实现27/5 = 5……2

2.方法:

首先将被除数前面补上16个0,在除数后面补上16个0

        A被除数27: 0000_0000_0000_0000  0000_0000_0001_1011

        B除数5:    0000_0000_0000_0101  0000_0000_0000_0000

循环用A减去B,如果前者小于后者,就将A向左移动一位,否则就是下面的情况:

        A被除数27: 0000_0000_0000_0110  1100_0000_0000_0000

        B除数5:    0000_0000_0000_0101  0000_0000_0000_0000

这个时候进行计算A = A-B+1(A>=B时候)

得到

       A:                0000_0000_0000_0001  1100_0000_0000_0001(最低位的1代表商的最高位为1)   

可见,只要循环16次,那么得到的A低十六位就是 商,高十六位就是 余数。

3. division.v

  1. `timescale 1ns / 1ps
  2. //
  3. // Company: Shanghaitech
  4. // Engineer: Junluoyu
  5. //
  6. // Create Date: 2021/11/02 23:47:38
  7. // Design Name:
  8. // Module Name: division
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module division(
  22. input [15:0] A,
  23. input [7:0] B,
  24. output [15:0] result,
  25. output [15:0] odd
  26. );
  27. /*---------------------------------------------------------------------------------------------*/
  28. reg [15:0] a_reg;
  29. reg [7:0] b_reg;
  30. reg [31:0] temp_a;
  31. reg [31:0] temp_b;
  32. integer i;
  33. /*---------------------------------------------------------------------------------------------*/
  34. always @(*) begin
  35. a_reg = A;
  36. b_reg = B;
  37. end
  38. always @(*) begin
  39. temp_a = {16'h0,a_reg};
  40. temp_b = {b_reg,16'h0};
  41. for(i=0;i<16;i=i+1)
  42. begin
  43. temp_a = temp_a <<1 ;
  44. if(temp_a >= temp_b)
  45. begin
  46. temp_a = temp_a - temp_b +1;
  47. end
  48. else
  49. begin
  50. temp_a = temp_a;
  51. end
  52. end
  53. end
  54. assign odd = temp_a[31:16];
  55. assign result = temp_a[15:0];
  56. endmodule

4.testbench

  1. `timescale 1ns / 1ps
  2. //
  3. // Company: Shanghaitech
  4. // Engineer: Junluoyu
  5. //
  6. // Create Date: 2021/11/03 00:06:34
  7. // Design Name:
  8. // Module Name: tb_2
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module tb_2();
  22. /*---------------------------------------------------------------------------------------------*/
  23. reg [15:0] A;
  24. reg [7:0] B;
  25. wire [15:0] result;
  26. wire [15:0] odd;
  27. /*---------------------------------------------------------------------------------------------*/
  28. division division_inst(
  29. .A (A ),
  30. .B (B ),
  31. .result (result),
  32. .odd (odd )
  33. );
  34. /*----------------------------------------------------------------------------------------------*/
  35. // initial clk_in = 1'b0;
  36. // always #5 clk_in = ~clk_in; // 10ns,50MHz
  37. /*----------------------------------------------------------------------------------------------*/
  38. initial begin
  39. #100;
  40. A = 16'd27;
  41. B = 8'd5;
  42. #1000;
  43. $stop;
  44. end
  45. endmodule

5.仿真波形

 可见计算正确

6.扩展:怎么计算乘法呢,是不是相同的过程呢?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/522326
推荐阅读
相关标签
  

闽ICP备14008679号