Advertisement
Tavi33

Booth V2 + TB

Mar 15th, 2016
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. module booth
  2.  
  3. #( parameter OPERAND_BITS = 8,
  4. parameter RESULT_BITS = 16)
  5.  
  6. (
  7. input clk,
  8. input rst,
  9. input start,
  10.  
  11. input [OPERAND_BITS - 1 : 0] a,
  12. input [OPERAND_BITS - 1 : 0] b,
  13.  
  14. output[RESULT_BITS - 1 : 0] result,
  15. output [2:0] done,
  16. output [2:0] st_nxt
  17.  
  18. );
  19.  
  20. reg [OPERAND_BITS - 1 : 0] A;
  21. reg [OPERAND_BITS - 1 : 0] M;
  22. reg [OPERAND_BITS - 1 : 0] Q;
  23. reg Q_1;
  24. reg [2:0] count;
  25.  
  26. localparam [2:0] WAIT=3'd0, INIT=3'd1, ADD=3'd2, SUB=3'd3, SHIFT=3'd4, END=3'd5;
  27.  
  28. reg [2:0] state;
  29. reg [2:0] state_nxt;
  30.  
  31. wire [1:0] Q01= {Q[0],Q_1};
  32.  
  33.  
  34.  
  35.  
  36. // sequential process
  37.  
  38. always
  39.  
  40. @(posedge clk)
  41. begin
  42. case(state)
  43. WAIT: ;
  44. INIT:
  45. begin
  46. A <= 0;
  47. count <= 0;
  48. M <= a;
  49. Q <= b;
  50. Q_1<= 0;
  51. end
  52. ADD:
  53. begin
  54. A = A + M;
  55. end
  56. SUB:
  57. begin
  58. A = A - M;
  59. end
  60. SHIFT:
  61. begin
  62. A[7] = A[7];
  63. {A[6:0],Q,Q_1} = {A,Q[7:0],Q_1};
  64. count = count + 1;
  65. end
  66. END: ;
  67. endcase
  68.  
  69. // do something
  70.  
  71. end
  72.  
  73. always @(posedge clk or negedge rst)
  74. begin
  75. if(rst)
  76. state <= WAIT;
  77. else
  78. state <= state_nxt;
  79. end
  80.  
  81.  
  82.  
  83. // combinational process
  84.  
  85. always
  86.  
  87. @(start, Q01, state, count)
  88.  
  89. begin
  90.  
  91. // create state machine
  92. case(state)
  93. WAIT:
  94. if(start)
  95. state_nxt = INIT;
  96. else
  97. state_nxt = WAIT;
  98. INIT:
  99. if(Q01 == 2'b01)
  100. state_nxt = ADD;
  101. else
  102. state_nxt = SUB;
  103. ADD:
  104. if(count)
  105. state_nxt = END;
  106. else
  107. state_nxt = SHIFT;
  108. SUB:
  109. if(count)
  110. state_nxt = END;
  111. else
  112. state_nxt = SHIFT;
  113. SHIFT:
  114. if(Q01 == 2'b01)
  115. state_nxt = ADD;
  116. else
  117. state_nxt = SUB;
  118.  
  119. END: ;
  120. endcase
  121. // determine values for all signals in each state
  122.  
  123. end
  124.  
  125. assign result = {A, Q[7:0]};
  126. assign done = state;
  127. assign st_nxt = state_nxt;
  128.  
  129. endmodule
  130.  
  131. //TB
  132.  
  133. module booth_tb
  134.  
  135. #( parameter OPERAND_BITS = 8,
  136. parameter RESULT_BITS = 16)
  137.  
  138. (
  139. output reg clk,
  140. output reg rst,
  141. output reg start,
  142.  
  143. output reg [OPERAND_BITS - 1 : 0] a,
  144. output reg [OPERAND_BITS - 1 : 0] b,
  145.  
  146. output [RESULT_BITS - 1 : 0] result,
  147. output [2:0] done,
  148. output [2:0] st_nxt
  149. );
  150.  
  151. booth b1(
  152. .clk(clk),
  153. .rst(rst),
  154. .start(start),
  155. .a(a),
  156. .b(b),
  157. .result(result),
  158. .done(done),
  159. .st_nxt(st_nxt)
  160. );
  161.  
  162. initial begin
  163. clk = 0;
  164. repeat (30) #50 clk = ~clk;
  165. end
  166.  
  167. initial begin
  168. a = 8'd7;
  169. b = 8'd9;
  170. end
  171.  
  172. initial begin
  173. start = 1'b0;
  174. #50 start = 1'b1;
  175. end
  176.  
  177. initial begin
  178. rst = 1'b0;
  179. #50 rst = 1'b1;
  180. #50 rst = 1'b0;
  181. end
  182.  
  183. initial begin
  184. $monitor("@%1t: clk=%b, start=%b, result=%b, done =%b, rst=%b, next=%b, a=%b, b=%b", $time, clk, start, result, done, rst, st_nxt, a, b);
  185. end
  186.  
  187. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement