Advertisement
Tavi33

OC

May 24th, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 10.86 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. );
  14.  
  15. reg f;
  16. reg [OPERAND_BITS-1 : 0] A;
  17. reg [OPERAND_BITS : 0] Q;
  18. reg Q_1;
  19. reg [OPERAND_BITS-1 : 0] M;
  20. reg [2:0] count;
  21.  
  22. reg [3:0] state;
  23.  
  24. localparam [3:0] s0=4'd0, s1=4'd1, s2=4'd2, s3=4'd3, s4=4'd4, s5=4'd5, s6=4'd6, s7=4'd7, s8=4'd8, s9=4'd9;
  25.  
  26. // sequential process
  27.  
  28. always
  29. @(posedge clk, posedge rst)
  30.  
  31. begin
  32.  
  33. if (rst)
  34.  
  35. begin
  36.  
  37. state <= s0;
  38. A <= 0;
  39. Q <= 0;
  40. M <= 0;
  41. Q_1 <= 0;
  42. count <= 0;
  43.  
  44. end
  45.  
  46. else
  47.  
  48. begin
  49.    case(state)
  50.        s0: begin
  51.             if(start)
  52.               state <= s1;
  53.           end
  54.        s1:
  55.           begin
  56.               A <= 0;
  57.               count <= 0;
  58.               f <= 0;
  59.               ovr <= 0;
  60.               M <= a;
  61.               Q <= b[7:0];
  62.               Q_1 <= b[0];
  63.               state <= s2;
  64.           end
  65.        s2:
  66.           begin
  67.               if(Q == 9'd0)
  68.                 state <= s9;
  69.               else if(M == 8'd0)
  70.                 state <= s3;
  71.               else
  72.                 state <= s4;
  73.           end
  74.        s3:
  75.           begin
  76.               Q <= 0;
  77.               Q_1 <= 0;
  78.               state <= s9;
  79.           end
  80.        s4:
  81.           begin
  82.               if(f == 1'b0)
  83.                begin
  84.                  if(Q[7] == 1'b1)
  85.                     if(Q[6] == 1'b0)
  86.                     begin
  87.                         A <= A + M;
  88.                         ovr <= 1'b1;
  89.                     end
  90.                     else
  91.                     begin
  92.                         A <= A - M;
  93.                         ovr <= 1'b1;
  94.                         f <= 1'b1;
  95.                     end
  96.                end
  97.                else
  98.                begin
  99.                    if(Q[7] == 1'b1)
  100.                       if(Q[6] == 1'b0)
  101.                       begin
  102.                           A <= A + M;
  103.                           ovr <= 1'b1;
  104.                           f <= 1'b0;
  105.                       end
  106.                       else
  107.                       begin
  108.                           A <= A - M;
  109.                           ovr <= 1'b1;
  110.                       end
  111.                end
  112.                if(count == 2'd7)
  113.                   state <= s9;
  114.                else
  115.                   state <= s8;
  116.           end
  117.        s8:
  118.           begin
  119.               A[7] <= (A[0] && M[0] && ovr) || (f && M[0]) || (f && M[0] && ovr);
  120.               {A[7:1], Q} <= {A, Q[6:0], Q_1};
  121.               count <= count + 1'b1;
  122.               state <= s4;
  123.           end
  124.        s9:
  125.           begin
  126.              Q[6] <= 0;    
  127.           end
  128.    endcase
  129. // do something
  130.  
  131. end
  132. end
  133.  
  134. assign result = {A, Q[6:0], Q_1};
  135.  
  136. endmodule
  137.  
  138.  
  139.  
  140.  
  141. //TB
  142.  
  143. module booth_modificat_tb
  144.  
  145. #( parameter OPERAND_BITS = 8,
  146. parameter RESULT_BITS = 16)
  147.  
  148. (
  149. output reg clk,
  150. output reg rst,
  151. output reg start,
  152.  
  153. output reg [OPERAND_BITS - 1 : 0] a,
  154. output reg [OPERAND_BITS - 1 : 0] b,
  155.  
  156. output [RESULT_BITS - 1 : 0] result,
  157. output ovr
  158. );
  159.  
  160. booth_modificat b1(
  161.    .clk(clk),
  162.    .rst(rst),
  163.    .start(start),
  164.    .a(a),
  165.    .b(b),
  166.    .result(result),
  167.    .ovr(ovr)
  168. );
  169.  
  170. initial begin
  171.       clk = 0;
  172.       repeat (30) #50 clk = ~clk;
  173. end
  174.  
  175. initial begin
  176.    a = 8'd2;
  177.    b = 8'd3;
  178. end
  179.  
  180. initial begin
  181.    start = 1'b0;
  182.    #50 start = 1'b1;
  183. end
  184.  
  185. initial begin
  186.     rst = 1'b0;
  187.     #50 rst = 1'b1;
  188.     #100 rst = 1'b0;
  189. end
  190.  
  191. endmodule
  192.  
  193.  
  194.  
  195. module vga_intf
  196. #(
  197. parameter hRez = 640,
  198. parameter vRez = 480,
  199. parameter hFP = 16,
  200. parameter hSyP = 96,
  201. parameter hBP = 48,
  202. parameter vFP = 10,
  203. parameter vSyP = 2,
  204. parameter vBP = 33
  205. )
  206. (
  207.    input clk50M,
  208.    input rst,
  209.    //input[9:0] rIn, bIn, gIn,
  210.    output[9:0] vga_r, vga_b, vga_g, //xPos, yPos,
  211.    output reg hSync, vSync,
  212.    output blank, //might need to be inversed, to check
  213.    output clkO
  214. );
  215. reg valid;
  216. reg[9:0] hCnt, vCnt, hSyncCnt;
  217. reg[19:0] vSyncCnt;
  218. wire[9:0] red, green, blue;
  219. parameter vSyT = hRez + hFP + hSyP + hBP;
  220. reg clk25M;
  221. reg clkCnt;
  222.  
  223. `ifdef debug
  224. colour_select cs(
  225.    .clk(clk25M),
  226.    .valid(valid),
  227.    .vCnt(vCnt),
  228.    .hCnt(hCnt),
  229.    .red(red),
  230.    .green(green),
  231.    .blue(blue)
  232. );
  233. assign vga_r = red;
  234. assign vga_g = green;
  235. assign vga_b = blue;
  236. `else
  237. assign vga_r = rIn;
  238. assign vga_b = bIn;
  239. assign vga_g = gIn;
  240. `endif
  241. assign blank = valid;
  242. assign xPos = (hCnt < hRez) ? (hCnt) : (hRez - 1);
  243. assign yPos = (vCnt < vRez) ? (vCnt) : (vRez - 1);
  244. assign clkO = clk25M;
  245. always @ (posedge clk50M) begin
  246.     if(rst)
  247.         clkCnt <= 0;
  248.     else begin
  249.         clkCnt <= clkCnt + 1'd1;
  250.         if(clkCnt == 1'd1)
  251.             clk25M = clk25M + 1'd1;
  252.     end
  253. end
  254. always @ (posedge clk25M) begin
  255.     if(rst) begin
  256.         hCnt <= 0;
  257.         vCnt <= 0;
  258.         hSync <= 1'd1;
  259.         vSync <= 1'd1;
  260.         hSyncCnt <= 0;
  261.         vSyncCnt <= 0;
  262.         valid <= 0;
  263.     end
  264.     else begin
  265.         if(hCnt == 0 && vCnt != (vRez)) valid <= 1'd1;
  266.         if(hCnt < (hRez-1)) hCnt <= hCnt + 1'd1;
  267.         if(hCnt >= (hRez-1)) begin
  268.         if(hSyncCnt == 0) valid <= 0;
  269.             if(hSyncCnt < (hFP-1) && (hCnt >= (hRez-1))) hSyncCnt <= hSyncCnt + 1'd1;
  270.             else begin
  271.                 if(hSyncCnt == (hFP)) hSync <= 0;
  272.                 if(hSyncCnt < (hFP + hSyP)) hSyncCnt <= hSyncCnt +1'd1;
  273.                 else begin
  274.                     if(hSyncCnt == (hFP + hSyP)) hSync <= 1'd1;
  275.                     if(hSyncCnt < (hFP + hSyP + hBP)) hSyncCnt <= hSyncCnt + 1'd1;
  276.                     else begin
  277.                         if(hSyncCnt == (hFP + hSyP + hBP)) begin
  278.                             if(vCnt < (vRez)) begin
  279.                                 hCnt <= 0;
  280.                                 vCnt <= vCnt +1'd1;
  281.                                 hSyncCnt <= 0;
  282.                                 if(vCnt != (vRez-1)) valid <= 1'd1;
  283.                             end
  284.                             else begin
  285.                                 hSyncCnt <= 0;
  286.                                 hCnt <= 0;
  287.                             end
  288.                         end
  289.                    end
  290.                 end
  291.             end
  292.         end
  293.         if(vCnt == (vRez)) begin
  294.             valid <= 0;
  295.             if(vSyncCnt < (vFP*vSyT)-1)   vSyncCnt <= vSyncCnt + 1'd1;
  296.             else begin
  297.                 if(vSyncCnt == (vFP*vSyT)-1)   vSync <= 0;
  298.                 if(vSyncCnt < ((vFP + vSyP)*vSyT)-1) vSyncCnt <= vSyncCnt + 1'd1;
  299.                 else begin
  300.                     if(vSyncCnt == ((vFP + vSyP)*vSyT)-1) vSync <= 1'd1;
  301.                     if(vSyncCnt < ((vFP + vSyP + vBP)*vSyT)-1)   vSyncCnt <= vSyncCnt + 1'd1;
  302.                     else begin
  303.                         vSyncCnt <= 0;
  304.                         vCnt <= 0;
  305.                         valid <= 1'd1;
  306.                         hCnt <= 0;
  307.                         hSyncCnt <= 0;
  308.                     end
  309.                 end
  310.             end
  311.         end
  312.     end
  313. end
  314. endmodule
  315.  
  316.  
  317.  
  318. module vga_tb ();
  319.  
  320. reg clk50M, rst;
  321. wire[9:0] vga_g, vga_r, vga_b, xPos, yPos, rIn, bIn, gIn;
  322. wire hSync, vSync;
  323. wire blank;
  324.  
  325. integer i;
  326.  
  327. vga_intf
  328. /*#(
  329. .hRez(2),
  330. .vRez(3),
  331. .hFP(3),
  332. .hSyP(3),
  333. .hBP(5),
  334. .vFP(2),
  335. .vSyP(4),
  336. .vBP(6)
  337. )*/
  338. test(
  339.    .clk50M(clk50M),
  340.    .rst(rst),
  341.    .hSync(hSync),
  342.    .vSync(vSync),
  343.    .vga_r(vga_r),
  344.    .vga_b(vga_b),
  345.    .vga_g(vga_g),
  346.    .blank(blank),
  347.    .xPos(xPos),
  348.    .yPos(yPos),
  349.    .rIn(rIn),
  350.    .bIn(bIn),
  351.    .gIn(gIn)
  352.    );
  353.    
  354. initial begin
  355.     rst = 1'd1;
  356.     #100 rst = 1'd0;
  357. end
  358.  
  359. initial begin
  360.     clk50M = 1'd0;
  361.     for (i=0; i<800*600*10; i=i+1) begin
  362.        #10 clk50M = 1'd1;
  363.        #10 clk50M = 1'd0;
  364.     end
  365. end
  366.  
  367. endmodule
  368.  
  369.  
  370.  
  371. module colour_select(
  372.    input clk,
  373.    input valid,
  374.    input[9:0] vCnt, hCnt,
  375.    output reg[9:0] red, green, blue
  376. );
  377.  
  378. parameter hRez = 800;
  379. parameter vRez = 600;
  380. parameter cHalf = 700;
  381. parameter cSize = 1023;
  382.  
  383. always @ (negedge clk) begin
  384.     if(valid) begin
  385.         if((vCnt + hCnt) < cHalf) begin
  386.             red <= cSize - (vCnt + hCnt) * cSize / cHalf;
  387.             blue <= 0;
  388.             green <= (vCnt + hCnt) * cSize / cHalf;
  389.         end
  390.         else begin
  391.             red <= 0;
  392.             green <= cSize - (vCnt + hCnt - cHalf) * cSize / cHalf;
  393.             blue <= (vCnt + hCnt - cHalf) * cSize / cHalf;
  394.         end
  395.     end
  396. end
  397. endmodule
  398.  
  399.  
  400. module divider(
  401.  
  402.    input clk,
  403.    input rst,
  404.    input [7:0] inA,
  405.    input [7:0] inB,
  406.    output [7:0] rem,
  407.    output [7:0] quot
  408.  
  409. );
  410.  
  411. reg [1:0] q;
  412. reg [7:0] A;
  413. reg [7:0] B;
  414. reg [8:0] P;
  415. reg [2:0] k;
  416. reg [3:0] cnt;
  417.  
  418. reg[3:0] state,state_nxt;
  419. localparam s0=3'd0, s1=3'd1,s2=3'd2,s3=3'd3;
  420.  
  421. always @(posedge clk or posedge rst)
  422. begin
  423.     if (rst) begin
  424.       state <= s0;
  425.       A <= inA;
  426.       B <= inB;
  427.       q <= 1'b0;
  428.       k <= 3'b0;
  429.       P <= 5'b0;
  430.       cnt <= 4'd0;
  431.       q <= 2'd0;
  432.    end
  433.    else begin
  434.       case(state)
  435.         s0:
  436.            if(B[7] == 1'd0)
  437.               begin
  438.                   {B,P,A} <= {B[6:0], 1'b0, P[7:0], A[7], A[6:0], 1'b0};
  439.                   k <= k + 1'b1;
  440.                   state <= s0;
  441.               end
  442.            else
  443.               state <= s1;
  444.         s1:
  445.         if(cnt < 8 || q != 0)
  446.            begin
  447.              if(q == 0) begin
  448.                 if(P[8:6] == 0 || P[8:6] == 7) begin
  449.                    P[8:0] <= {P[7:0], A[7]};
  450.                    A <= {A[6:0], 1'b0};
  451.                 end
  452.                 else if(P[8] == 1) begin
  453.                    P[8:0] <= {P[7:0], A[7]};
  454.                    A <= {A[6:0], 1'b0};
  455.                    q <= 2'b01;
  456.                 end
  457.                 else begin
  458.                    P[8:0] <= {P[7:0], A[7]};
  459.                    A <= {A[6:0], 1'b0};
  460.                    q <= 2'b10;
  461.                 end
  462.                 cnt <= cnt + 1;
  463.              end
  464.              else begin
  465.                 if(q == 1) begin
  466.                    A <= A - 1'd1;
  467.                    P <= P + B;
  468.                    q <= 2'b00;
  469.                 end
  470.                 else begin
  471.                    A <= A + 1'd1;
  472.                    P <= P - B;
  473.                    q <= 2'b00;
  474.                 end
  475.              end
  476.            end
  477.        else state <= s2;
  478.        s2:
  479.           if(P[8] == 1'b1) begin
  480.              P <= P + B;
  481.              A <= A - 1'b1;
  482.           end
  483.           else begin
  484.              if(k > 0) begin
  485.                 P <= P >> k;
  486.              end
  487.              state <= s3;
  488.           end
  489.       endcase
  490.    end
  491. end
  492.  
  493. assign quot = A;
  494. assign rem = P[7:0];
  495.  
  496. endmodule
  497.  
  498.  
  499.  
  500.  
  501. module divider_tb(
  502.  
  503.    output reg clk,
  504.    output reg rst,
  505.    output reg [7:0] inA,
  506.    output reg [7:0] inB,
  507.    output [7:0] rem,
  508.    output [7:0] quot
  509.  
  510. );
  511.  
  512. divider d1(
  513.    .clk(clk),
  514.    .rst(rst),
  515.    .inA(inA),
  516.    .inB(inB),
  517.    .rem(rem),
  518.    .quot(quot)
  519.    
  520. );
  521.  
  522. initial begin
  523.       clk = 0;
  524.       repeat (100) #50 clk = ~clk;
  525. end
  526.  
  527. initial begin
  528.    inA = 15;
  529.    inB = 2;
  530. end
  531.  
  532. initial begin
  533.     rst = 1'b0;
  534.     #50 rst = 1'b1;
  535.     #100 rst = 1'b0;
  536. end
  537.  
  538. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement