Advertisement
Tavi33

Modified Booth + TB

Mar 29th, 2016
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.00 KB | None | 0 0
  1. module booth_modificat
  2. #( parameter OPERAND_BITS = 8,
  3. parameter RESULT_BITS = 16)
  4. (
  5.  
  6. input clk,
  7. input rst,
  8. input [OPERAND_BITS - 1 : 0] a,
  9. input [OPERAND_BITS - 1 : 0] b,
  10. input start,
  11. output[RESULT_BITS - 1 : 0] result,
  12. output reg ovr,
  13. output [3:0] st,
  14. output [3:0] st_nxt
  15. );
  16.  
  17. reg f;
  18. reg [OPERAND_BITS-1 : 0] A;
  19. reg [OPERAND_BITS : 0] Q;
  20. reg Q_1;
  21. reg [OPERAND_BITS-1 : 0] M;
  22. reg [2:0] count;
  23.  
  24. reg [3:0] state;
  25. reg [3:0] state_nxt;
  26.  
  27. localparam [3:0] s0=3'd0, s1=3'd1, s2=3'd2, s3=3'd3, s4=3'd4, s5=3'd5, s6=3'd6, s7=3'd7, s8=3'd8, s9=3'd9;
  28.  
  29. // sequential process
  30.  
  31. always @(posedge clk)
  32. state <= state_nxt;
  33.  
  34. always
  35. @(posedge clk, posedge rst)
  36.  
  37. begin
  38.  
  39. if (rst)
  40.  
  41. begin
  42.  
  43. // do something
  44.  
  45. end
  46.  
  47. else
  48.  
  49. begin
  50. case(state)
  51. s0: ;
  52. s1:
  53. begin
  54. A = 0;
  55. count = 0;
  56. f = 0;
  57. ovr = 0;
  58. M = a;
  59. end
  60. s2:
  61. begin
  62. Q = b[7:0];
  63. Q_1 = b[0];
  64. end
  65. s3:
  66. begin
  67. Q = 0;
  68. Q_1 = 0;
  69. end
  70. s4:
  71. begin
  72. if(f == 0)
  73. begin
  74. if(Q[7] == 1)
  75. if(Q[6] == 0)
  76. begin
  77. A = A + M;
  78. ovr = 1'b1;
  79. end
  80. else
  81. begin
  82. A = A - M;
  83. ovr = 1'b1;
  84. f = 1'b1;
  85. end
  86. end
  87. else
  88. begin
  89. if(Q[7] == 1)
  90. if(Q[6] == 0)
  91. begin
  92. A = A + M;
  93. ovr = 1'b1;
  94. f = 1'b0;
  95. end
  96. else
  97. begin
  98. A = A - M;
  99. ovr = 1'b1;
  100. end
  101. end
  102. end
  103. s8:
  104. begin
  105. A[7] = f ^ M[7];
  106. {A[7:1], Q} = {A, Q[6:0], Q_1};
  107. count = count + 1'b1;
  108. end
  109. s9:
  110. begin
  111. Q[6] = 0;
  112. end
  113. endcase
  114. // do something
  115.  
  116. end
  117. end
  118.  
  119.  
  120.  
  121. // combinational process
  122.  
  123. always
  124.  
  125. @(start, state, count)
  126.  
  127. begin
  128. state_nxt = 2'b0;
  129. // create state machine
  130. case(state)
  131. s0:
  132. if(start)
  133. state_nxt = s1;
  134. else
  135. state_nxt = s0;
  136. s1:
  137. state_nxt = s2;
  138. s2:
  139. //if(Q == 0)
  140. state_nxt = s9;
  141. //else
  142. // if(M == 0)
  143. // state_nxt = s3;
  144. // else
  145. // state_nxt = s4;
  146. s3:
  147. state_nxt = s9;
  148. s4:
  149. if(count == 2'd7)
  150. state_nxt = s9;
  151. else
  152. state_nxt = s8;
  153. s8:
  154. state_nxt = s4;
  155. s9:
  156. ;
  157.  
  158. endcase
  159. $display("DB: %b %b", A, Q, M, state, state_nxt) ;
  160. // determine values for all signals in each state
  161.  
  162. end
  163.  
  164. assign result = {A, Q[6:0], Q_1};
  165. assign st = state;
  166. assign st_nxt = state_nxt;
  167.  
  168. endmodule
  169.  
  170.  
  171. //TB
  172.  
  173. module booth_modificat_tb
  174.  
  175. #( parameter OPERAND_BITS = 8,
  176. parameter RESULT_BITS = 16)
  177.  
  178. (
  179. output reg clk,
  180. output reg rst,
  181. output reg start,
  182.  
  183. output reg [OPERAND_BITS - 1 : 0] a,
  184. output reg [OPERAND_BITS - 1 : 0] b,
  185.  
  186. output [RESULT_BITS - 1 : 0] result,
  187. output ovr,
  188. output [3:0] st,
  189. output [3:0] st_nxt
  190. );
  191.  
  192. booth_modificat b1(
  193. .clk(clk),
  194. .rst(rst),
  195. .start(start),
  196. .a(a),
  197. .b(b),
  198. .result(result),
  199. .ovr(ovr),
  200. .st(st),
  201. .st_nxt(st_nxt)
  202. );
  203.  
  204. initial begin
  205. clk = 0;
  206. repeat (30) #50 clk = ~clk;
  207. end
  208.  
  209. initial begin
  210. a = 8'd2;
  211. b = 8'd3;
  212. end
  213.  
  214. initial begin
  215. start = 1'b0;
  216. #50 start = 1'b1;
  217. end
  218.  
  219. initial begin
  220. rst = 1'b0;
  221. end
  222.  
  223. initial begin
  224. $monitor("@%1t: clk=%b, start=%b, result=%b, rst=%b a=%b, b=%b, st=%b, st_nxt=%b", $time, clk, start, result, rst, a, b, st, st_nxt);
  225. end
  226.  
  227. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement