Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 4.20 KB | None | 0 0
  1. INCLUDE "lpm_counter.inc";
  2.  
  3. SUBDESIGN lcd_controller
  4. (
  5.     clk             : INPUT;
  6.     reset_n         : INPUT;
  7.     lcd_enable      : INPUT;
  8.     lcd_bus[9..0]   : INPUT;
  9.     busy            : OUTPUT;
  10.     rs, rw, e       : OUTPUT;
  11.     lcd_data[7..0]  : OUTPUT;
  12. )
  13.  
  14. VARIABLE
  15.    
  16.     control: MACHINE WITH STATES (power_up, initialize, ready, send);
  17.     init: MACHINE WITH STATES (function_set, sleep1, dpy_control, sleep2, dpy_clear, sleep3, entry_mode, end_init);
  18.     ena: MACHINE WITH STATES (ena0, ena1, ena2);
  19.    
  20.     counter: lpm_counter WITH (LPM_WIDTH=22, LPM_MODULUS=2500000); %50ms%
  21.    
  22. BEGIN  
  23.  
  24.     %CLOCK%
  25.     control.(clk, reset) = (clk, !reset_n);
  26.     init.(clk, reset) = (clk, !reset_n);
  27.     ena.(clk, reset) = (clk, !reset_n);
  28.    
  29.     counter.clock = clk;
  30.     counter.aclr = !reset_n;
  31.    
  32.     CASE control IS
  33.        
  34.         WHEN power_up => %50ms%
  35.             busy = VCC;
  36.             IF !counter.cout THEN
  37.                 control = power_up;
  38.             ELSE
  39.                 rs = GND;
  40.                 rw = GND;
  41.                 lcd_data[] = B"00110000";
  42.                 counter.data[] = (2500000-500);
  43.                 counter.sload = VCC;
  44.                 control = initialize;
  45.             END IF;
  46.        
  47.         WHEN initialize =>
  48.             busy = VCC;
  49.             CASE init IS
  50.                 WHEN function_set => %10us%
  51.                     IF !counter.cout THEN
  52.                         lcd_data[] = B"00111100";
  53.                         e = VCC;
  54.                         init = function_set;
  55.                     ELSE
  56.                         counter.data[] = (2500000-2500);
  57.                         counter.sload = VCC;
  58.                         init = sleep1;
  59.                     END IF;
  60.                     control = initialize;
  61.                 WHEN sleep1 => %50us%
  62.                     IF !counter.cout THEN
  63.                         lcd_data[] = B"00000000";
  64.                         e = GND;
  65.                         init = sleep1;
  66.                     ELSE
  67.                         counter.data[] = (2500000-500);
  68.                         counter.sload = VCC;
  69.                         init = dpy_control;
  70.                     END IF;
  71.                     control = initialize;
  72.                 WHEN dpy_control => %10us%
  73.                     IF !counter.cout THEN
  74.                         lcd_data[] = B"00001100";
  75.                         e = VCC;
  76.                         init = dpy_control;
  77.                     ELSE
  78.                         counter.data[] = (2500000-2500);
  79.                         counter.sload = VCC;
  80.                         init = sleep2;
  81.                     END IF;
  82.                     control = initialize;
  83.                 WHEN sleep2 => %50us%
  84.                     IF !counter.cout THEN
  85.                         lcd_data[] = B"00000000";
  86.                         e = GND;
  87.                         init = sleep2;
  88.                     ELSE
  89.                         counter.data[] = (2500000-500);
  90.                         counter.sload = VCC;
  91.                         init = dpy_clear;
  92.                     END IF;
  93.                     control = initialize;
  94.                 WHEN dpy_clear => %10us%
  95.                     IF !counter.cout THEN
  96.                         lcd_data[] = B"00000001";
  97.                         e = VCC;
  98.                         init = dpy_clear;
  99.                     ELSE
  100.                         counter.data[] = (2500000-100000);
  101.                         counter.sload = VCC;
  102.                         init = sleep3;
  103.                     END IF;
  104.                     control = initialize;
  105.                 WHEN sleep3 => %2ms%
  106.                     IF !counter.cout THEN
  107.                         lcd_data[] = B"00000000";
  108.                         e = GND;
  109.                         init = sleep3;
  110.                     ELSE
  111.                         counter.data[] = (2500000-500);
  112.                         counter.sload = VCC;
  113.                         init = entry_mode;
  114.                     END IF;
  115.                     control = initialize;
  116.                 WHEN entry_mode => %10us%
  117.                     IF !counter.cout THEN
  118.                         lcd_data[] = B"00000110";
  119.                         e = VCC;
  120.                         init = entry_mode;
  121.                     ELSE
  122.                         counter.data[] = (2500000-3000);
  123.                         counter.sload = VCC;
  124.                         init = end_init;
  125.                     END IF;
  126.                     control = initialize;
  127.                 WHEN end_init => %60us%
  128.                     IF !counter.cout THEN
  129.                         lcd_data[] = B"00000000";
  130.                         e = GND;
  131.                         init = end_init;
  132.                         control = initialize;
  133.                     ELSE
  134.                         control = ready;
  135.                     END IF;
  136.             END CASE;
  137.    
  138.        
  139.         WHEN ready =>
  140.             IF (lcd_enable == VCC) THEN
  141.                 busy = VCC;
  142.                 counter.data[] = (2500000-50);
  143.                 counter.sload = VCC;          
  144.                 control = send;
  145.             ELSE
  146.                 busy = GND;
  147.                 rs = GND;
  148.                 rw = GND;
  149.                 lcd_data[] = B"00000000";
  150.                 control = ready;
  151.             END IF;
  152.            
  153.         WHEN send =>
  154.             busy = VCC;
  155.             rs = lcd_bus[9];
  156.             rw = lcd_bus[8];
  157.             lcd_data[] = lcd_bus[7..0];
  158.             CASE ena IS
  159.                 WHEN ena0 =>
  160.                     IF !counter.cout THEN
  161.                         e = GND;
  162.                         ena = ena0;
  163.                     ELSE
  164.                         counter.data[] = (2500000-650);
  165.                         counter.sload = VCC;
  166.                         ena = ena1;
  167.                     END IF;
  168.                     control = send;
  169.                 WHEN ena1 =>
  170.                     IF !counter.cout THEN
  171.                         e = VCC;
  172.                         ena = ena1;
  173.                     ELSE
  174.                         counter.data[] = (2500000-1800);
  175.                         counter.sload = VCC;
  176.                         ena = ena2;
  177.                     END IF;
  178.                     control = send;
  179.                 WHEN ena2 =>
  180.                     IF !counter.cout THEN
  181.                         e = GND;
  182.                         ena = ena2;
  183.                         control = send;
  184.                     ELSE
  185.                         ena = ena0;
  186.                         control = ready;
  187.                     END IF;
  188.            
  189.             END CASE;
  190.            
  191.     END CASE;
  192.    
  193. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement