rmoronsv

Untitled

Dec 4th, 2019
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.31 KB | None | 0 0
  1. module BCD_Subtractor_2(input [3:0]X, input [3:0]Y, input SignofX, input SignofY, output reg [3:0]result_S0, output reg [3:0]result_S1, output reg Signbit, output reg overflow);
  2. reg [3:0]result_NmP_0;
  3. reg [3:0]result_NmP_1;
  4. reg [3:0]ResultPXPY;
  5. reg [3:0]ResultNXNY;
  6. reg [3:0]S0;
  7. reg [3:0]S1;
  8. reg [3:0]S0_plus1;
  9. reg [3:0]S0_plus_X;
  10. reg [3:0]carry_to_S1_from_S0_plus1_plusX;
  11. reg [3:0]S1_plus_carry;
  12. reg [3:0]useless;
  13. reg [3:0]NX;
  14. reg [3:0]NY;
  15. reg [3:0]NS0;
  16. reg [3:0]NS1;
  17. reg [3:0]NS0_plus1;
  18. reg [3:0]NS0_plus_X;
  19. reg [3:0]Ncarry_to_S1_from_S0_plus1_plusX;
  20. reg [3:0]NS1_plus_carry;
  21. reg [3:0]Nuseless;
  22. always@(*)
  23. begin
  24. overflow = (X > 9 | Y > 9) ? 1 : 0; //X > 9 or Y > 9 overflow
  25. S0 = 9 - Y; //9 - Y
  26. NX = Y;
  27. NY = X;
  28. NS0 = 9 - NY;
  29. end
  30.  
  31. generate
  32. begin
  33. BCD_Adder negminuspositive (X, Y, result_NmP_0, result_NmP_1);
  34.  
  35. Comparator comparePXandPY (X, Y, ResultPXPY);
  36. BCD_Adder PXPY1 (S0, 1'b1, S0_plus1, S1); //+1
  37. BCD_Adder PXPY2 (X, S0_plus1, S0_plus_X, carry_to_S1_from_S0_plus1_plusX); //+A ripple carry adder
  38. BCD_Adder PXPY2_2 (S1, carry_to_S1_from_S0_plus1_plusX, S1_plus_carry, useless); //+A ripple carry adder
  39.  
  40. Comparator compareNXandNY (NX, NY, ResultNXNY);
  41. BCD_Adder NXNY1 (NS0, 1'b1, NS0_plus1, NS1); //+1
  42. BCD_Adder NXNY2 (NX, NS0_plus1, NS0_plus_X, Ncarry_to_S1_from_S0_plus1_plusX); //+A ripple carry adder
  43. BCD_Adder NXNY2_2 (NS1, Ncarry_to_S1_from_S0_plus1_plusX, NS1_plus_carry, Nuseless); //+A ripple carry adder
  44. end
  45. endgenerate
  46.  
  47. always@(*)
  48. begin
  49. if (SignofX & ~SignofY) // - - +
  50. begin
  51. result_S0 = result_NmP_0;
  52. result_S1 = result_NmP_1;
  53. Signbit = 1'b1;
  54. end
  55. else if (~SignofX & SignofY)//+ - -
  56. begin
  57. result_S0 = result_NmP_0;
  58. result_S1 = result_NmP_1;
  59. Signbit = 1'b0;
  60. end
  61. else if (~SignofX & ~SignofY) //+ - +
  62. begin
  63. if (ResultPXPY)
  64. begin
  65. result_S0 = S0_plus_X;
  66. result_S1 = S1_plus_carry;
  67. Signbit = 1'b1;
  68. end
  69. else if (~ResultPXPY)
  70. begin
  71. result_S0 = S0_plus_X;
  72. result_S1 = S1_plus_carry + 4'b1111; //-10
  73. Signbit = 1'b0;
  74. end
  75. end
  76. else if (~SignofX & ~SignofY) // - - -
  77. begin
  78. if (ResultPXPY)
  79. begin
  80. result_S0 = NS0_plus_X;
  81. result_S1 = NS1_plus_carry;
  82. Signbit = 1'b1;
  83. end
  84. else if (~ResultPXPY)
  85. begin
  86. result_S0 = NS0_plus_X;
  87. result_S1 = NS1_plus_carry + 4'b1111; //-10
  88. Signbit = 1'b0;
  89. end
  90. end
  91. end
  92. endmodule
  93.  
  94. module BCD_Adder(input [3:0]X, input [3:0]Y, output reg [3:0]S, output reg carry);
  95. always@(*)
  96. begin
  97. assign S = X + Y;
  98. if (S >= 10) //>10
  99. begin
  100. {carry, S} = S + 6;
  101. end
  102. else if(S < 10)
  103. begin
  104. carry = 1'b0;
  105. end
  106. end
  107. endmodule
  108. module Comparator(input [3:0]X, input [3:0]Y, output Result); //X >= Y (0) or X < Y (1)
  109. reg [4:0]Yt;
  110. reg [4:0]cX;
  111. reg [4:0]cY;
  112. reg [4:0]S;
  113. reg [5:0]c;
  114. integer i;
  115. always@(*)
  116. begin
  117. cX = X;
  118. cY = Y;
  119. Yt = ~cY;
  120. c[0] = 1'b1;
  121. for (i = 0; i < 4; i = i + 1)
  122. begin
  123. S[i] = cX[i] + cY[i] + c[i];
  124. c[i+1] = ((cX[i] & cY[i]) | (cX[i] & c[i]) | (cY[i] & c[i]));
  125. end
  126. end
  127. assign O = c[5] ^ c[4];
  128. assign Z = !S;
  129. assign N = S[4];
  130. assign Result = O ^ N;
  131. endmodule
Advertisement
Add Comment
Please, Sign In to add comment