Advertisement
grzemot

Untitled

Jun 18th, 2019
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module traffic_light(light_highway, light_farm, C, clk, rst_n);
  2. parameter   HGRE_FRED=2'b00, // Highway green and farm red
  3.             HYEL_FRED = 2'b01,// Highway yellow and farm red
  4.             HRED_FGRE=2'b10,// Highway red and farm green
  5.             HRED_FYEL=2'b11;// Highway red and farm yellow
  6. input C, // sensor
  7.    clk, // clock = 50 MHz
  8.    rst_n; // reset active low
  9. output reg[2:0] light_highway, light_farm; // output of lights
  10.  
  11. reg[27:0] count=0,count_delay=0;
  12. reg delay10s=0, delay3s1=0,delay3s2=0,RED_count_en=0,YELLOW_count_en1=0,YELLOW_count_en2=0;
  13. wire clk_enable; // clock enable signal for 1s
  14. reg[1:0] state, next_state;
  15. // next state
  16. always @(posedge clk or negedge rst_n) // obs?uga rst
  17. begin
  18. if(~rst_n)
  19.  state <= 2'b00;
  20. else
  21.  state <= next_state;
  22. end
  23.  
  24. always @(*) // case dla swiatel
  25. begin
  26. case(state)
  27. HGRE_FRED: begin // Green on highway and red on farm way
  28.  RED_count_en=0;
  29.  YELLOW_count_en1=0;
  30.  YELLOW_count_en2=0;
  31.  light_highway = 3'b001; // highway zielony
  32.  light_farm = 3'b100;    // farm czerw
  33.  if(C) next_state = HYEL_FRED;
  34.  // if sensor detects vehicles on farm road,
  35.  // turn highway to yellow -> green
  36.  else next_state =HGRE_FRED;
  37. end
  38. HYEL_FRED: begin// yellow on highway and red on farm way
  39.   light_highway = 3'b010;
  40.   light_farm = 3'b100;
  41.   RED_count_en=0;
  42.  YELLOW_count_en1=1;
  43.  YELLOW_count_en2=0;
  44.   if(delay3s1) next_state = HRED_FGRE;
  45.   // yellow for 3s, then red
  46.   else next_state = HYEL_FRED;
  47. end
  48. HRED_FGRE: begin// red on highway and green on farm way
  49.  light_highway = 3'b100;
  50.  light_farm = 3'b001;
  51.  RED_count_en=1;
  52.  YELLOW_count_en1=0;
  53.  YELLOW_count_en2=0;
  54.  if(delay10s) next_state = HRED_FYEL;
  55.  // red in 10s then turn to yello -> green again for high way
  56.  else next_state =HRED_FGRE;
  57. end
  58. HRED_FYEL:begin// red on highway and yellow on farm way
  59.  light_highway = 3'b100;
  60.  light_farm = 3'b010;
  61.  RED_count_en=0;
  62.  YELLOW_count_en1=0;
  63.  YELLOW_count_en2=1;
  64.  if(delay3s2) next_state = HGRE_FRED;
  65.  // turn green for highway, red for farm road
  66.  else next_state =HRED_FYEL;
  67. end
  68. default: next_state = HGRE_FRED;
  69. endcase
  70. end
  71.  
  72.  
  73. always @(posedge clk)
  74. begin
  75. if(clk_enable==1) begin
  76.  if(RED_count_en||YELLOW_count_en1||YELLOW_count_en2)
  77.   count_delay <=count_delay + 1;
  78.   if((count_delay == 9)&&RED_count_en)
  79.   begin
  80.    delay10s=1;
  81.    delay3s1=0;
  82.    delay3s2=0;
  83.    count_delay<=0;
  84.   end
  85.   else if((count_delay == 2)&&YELLOW_count_en1)
  86.   begin
  87.    delay10s=0;
  88.    delay3s1=1;
  89.    delay3s2=0;
  90.    count_delay<=0;
  91.   end
  92.   else if((count_delay == 2)&&YELLOW_count_en2)
  93.   begin
  94.    delay10s=0;
  95.    delay3s1=0;
  96.    delay3s2=1;
  97.    count_delay<=0;
  98.   end
  99.   else
  100.   begin
  101.    delay10s=0;
  102.    delay3s1=0;
  103.    delay3s2=0;
  104.   end
  105.  end
  106. end
  107. // create 1s clock enable
  108. always @(posedge clk)
  109. begin
  110.  count <=count + 1;
  111.  //if(count == 50000000) // 50,000,000 for 50 MHz clock running on real FPGA
  112.  if(count == 3) // for testbench
  113.   count <= 0;
  114. end
  115.  assign clk_enable = count == 3 ? 1: 0; // 50,000,000 for 50MHz running on FPGA
  116. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement