Advertisement
Guest User

Untitled

a guest
Apr 11th, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. // CountDown Timer
  3. //
  4.  
  5.  
  6. module testbench2();
  7.  
  8.     // Device under test I/O
  9.     logic clk, reset;
  10.     logic [4:0] therapyDuration;
  11.     logic [5:0] SEC;
  12.     logic [4:0] MIN;
  13.  
  14.     //device under test
  15.     countDownTimer countDownTimer(clk, reset, therapyDuration, SEC, MIN);
  16.  
  17.     initial
  18.         forever begin
  19.             clk=0; #2; clk=1; #2;
  20.         end
  21.  
  22.     initial begin
  23.         therapyDuration = 5'd30;
  24.         reset = 1;
  25.         #30;
  26.         reset = 0;
  27.         #35000;
  28.     end
  29.  
  30. endmodule
  31.  
  32.  
  33.  
  34. module countDownTimer(input logic clk, reset,
  35.                       input logic SWITCH,
  36.                       input logic PAUSE,
  37.                       input logic [4:0] therapyDuration,
  38.                       output logic [5:0] SEC,
  39.                       output logic [4:0] MIN);
  40.    
  41.     //CLK frequency 4Hz
  42.    
  43.     //MAIN CLK COUNTER //
  44.     logic rst_countMainClk;
  45.     logic [31:0] countClk;
  46.     counter32bit countMainClk(clk, rst_countMainClk, countClk);
  47.     assign rst_countMainClk = reset | (countClk == 32'd3); //clk_f - 1 = 4-1
  48.     //assign rst_countMainClk = reset | (countClk == 32'd49_999_999)
  49.  
  50.     //SECOND TIMER //
  51.     logic enSEC;
  52.     assign enSEC = (countClk== 32'd3);
  53.     //assign enSEC = (countClk== 32'd49_999_999);
  54.  
  55.     always_ff @(posedge clk)
  56.         if(reset) SEC <= 6'd0;
  57.         else if(enSEC)
  58.         begin
  59.             if( (SEC == 6'd0) ) SEC <= 6'd59;
  60.             else                      SEC <= SEC - 1'b1;           
  61.         end
  62.  
  63.     //MINUTE TIMER //
  64.     logic enMIN;
  65.     assign enMIN = (SEC == 6'd0) & enSEC;
  66.    
  67.     always_ff @(posedge clk)
  68.         if(reset)        MIN <= therapyDuration;
  69.         else if(enMIN)  MIN <= MIN - 1'b1;
  70.  
  71. endmodule
  72.  
  73.  
  74.  
  75. countDownTimer_FSM(input logic SWITCH, STOP, COUNT_END, PAUSE, PAUSE_END,
  76.                          output logic IDLE_state, COUNT_state, PAUSE_state, END_state);
  77.        
  78.     typedef enum logic [1:0] {S0,S1,S2,S3} statetype;
  79.     statetype state, nextstate;
  80.    
  81.     //state register
  82.     always_ff @(posedge clk, posedge reset)
  83.         if(reset) state <= S0;          //reset to IDLE state
  84.         else      state <= nextstate;
  85.    
  86.     //next state logic
  87.     always_comb
  88.         case(state)
  89.             //IDLE STATE
  90.             S0: if(SWITCH) nextstate = S1;
  91.                  else           nextstate = S0;
  92.             //COUNT STATE
  93.             S1: if(PAUSE)                   nextstate = S2;
  94.                  else if(STOP | COUNT_END) nextstate = S3;
  95.                  else                           neststate = S1;
  96.             //PAUSE STATE
  97.             S2: if(SWITCH)                  nextstate = S1;
  98.                  else if(STOP & PAUSE_END) nextstate = S3
  99.                  else                               nextstate = S2;
  100.             //END STATE
  101.             S3: nextstate = S0;
  102.            
  103.             default: nextstate = S0;
  104.         endcase
  105.    
  106.     //output logic
  107.     assign IDLE_state = (state == S0);
  108.     assign COUNT_state = (state == S1);
  109.     assign PAUSE_state = (state == S2);  
  110.     assign END_state = (state == S3);
  111.                          
  112. endmodule
  113.  
  114.  
  115.  
  116. module counter32bit(input logic clk, reset,
  117.                           output logic [31:0] q);
  118.    
  119.     always_ff @(posedge clk)
  120.         if(reset)   q <= 0;
  121.         else            q <= q + 1'b1;
  122.  
  123. endmodule
  124.  
  125.  
  126. /*
  127.         R                  
  128. clk     0   1   2   3   4   5   6   1   2   3   4   5   6   1  
  129. count   0   0   1   2   3   4   0   0   1   2   3   4   0   0
  130. EN                              EN                      EN     
  131. reset                           r                       r
  132. */
  133.  
  134. /*
  135.  
  136. 50MHz = 50,000,000 clk cycles
  137. en  = (count == 49,999,998)
  138. rst = (count == 49,999,999)
  139.  
  140.  
  141. 6Hz = 6 clk cycles
  142. en  = (count == 4) or (count == clkcyles-2)
  143. rst = (count == 5) or (count == clkcyles-1)
  144.  
  145. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement