当前位置:   article > 正文

流水线除法器verilog实现_除法 verilog

除法 verilog

除法器思路都是一样的,都是根据下述这个图实现

如果全用组合逻辑实现,那么时序肯定很差,另外一方面如果用时序逻辑实现就要考虑到实际使用时候出发的除数和被除数是流水进来的,所以结果上肯定是要一个周期输出一个数据。

所以我的思路就很简单,就是加寄存器,一拍走一个,如果是N位的我这里用到了N+1个寄存器,当然还可缩减一个。

我分别对除数被除数还有有效信号做了寄存器,然后一拍一拍往下传,用时序逻辑实现除法器移位后的判断,用组合逻辑实现移位操作。

代码如下

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2022/05/12 20:07:37
  7. // Design Name:
  8. // Module Name: divider_code
  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. //除法器以8bit为例 流水线实现,防止新数据来之后改变之前的结果
  22. module divider_code(
  23. input clk ,
  24. input rstn,
  25. input [7:0] divisor ,
  26. input [7:0] dividend,
  27. input div_valid ,
  28. output [7:0] div_dout ,
  29. output [7:0] remainder
  30. );
  31. reg [15:0] divisor_r [8:0];
  32. reg [15:0] dividend_r [8:0];
  33. reg valid [8:0];
  34. wire [15:0] divisor_shift[8:0];
  35. integer i;
  36. genvar n;
  37. for(n=0;n<9;n=n+1)
  38. begin:shift_assign
  39. assign divisor_shift[n] = valid[n]? divisor_r[n] << 1 : 8'b0;
  40. end
  41. always@(posedge clk or negedge rstn) begin
  42. if(~rstn)begin
  43. for(i=0;i<9;i=i+1)begin
  44. divisor_r[i] <= 8'b0;
  45. dividend_r[i] <= 8'b0;
  46. valid[i] <= 1'b0;
  47. end
  48. end
  49. else if(div_valid)begin
  50. divisor_r[0] <= {8'b0,divisor};
  51. dividend_r[0]<= {dividend,8'b0};
  52. valid[0] <= div_valid;
  53. end
  54. else
  55. valid[0] <= 1'b0;
  56. end
  57. genvar j;
  58. generate
  59. for(j=1;j<9;j=j+1)
  60. begin:generate_divde
  61. always@(posedge clk)
  62. if(valid[j-1])begin
  63. if(divisor_shift[j-1] >= dividend_r[j-1])begin
  64. divisor_r[j] <= divisor_shift[j-1] - dividend_r[j-1] +1'b1;
  65. valid[j] <= valid[j-1];
  66. dividend_r[j] <= dividend_r[j-1];
  67. end
  68. else begin
  69. divisor_r[j] <= divisor_shift[j-1] ;
  70. valid[j] <= valid[j-1];
  71. dividend_r[j] <= dividend_r[j-1];
  72. end
  73. end
  74. else
  75. valid[j] <= valid[j-1];
  76. end
  77. endgenerate
  78. assign div_dout = divisor_r[8][7:0];
  79. assign remainder = divisor_r[8][15:8];
  80. endmodule

 

可以看到连续发送的除法数据在8个cycle后连续输出

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

闽ICP备14008679号