Advertisement
AnatolySharapov

vga.sv

Oct 3rd, 2021
542
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // File name     : vga.sv
  2. // Description   : vga monitor's generator
  3. // URL           : http://www.pyroelectro.com
  4. // Author        : Chris@PyroElectro.com
  5. // Version       : 1.0
  6. // Last revision : 04.10.2021
  7.  
  8. // Made by       : Anatoly Sharapov as stepfather
  9. // Aged          : 47
  10. // Email         : a.a.sharapov@gmail.com
  11. // Phone         : +7 903 231-11-26
  12.  
  13. // Made for      : Anja Solodjanikova as stepdaughter
  14. // Aged          : 6
  15.  
  16. `include "../Headers/vga.svh"
  17. `include "../Headers/RZ-EazyFPGA_A2.2.svh"
  18.  
  19. module vga (  
  20.    
  21.     input logic clk50MHz,   // Input clock
  22.     input logic resetn,     // Global reset - active negative
  23.    
  24.     // VGA Signals/Pins (Outputs)
  25.    
  26.     output logic hsync,
  27.     output logic vsync,
  28.    
  29.     output logic red,
  30.     output logic green,
  31.     output logic blue,
  32.    
  33.     output logic `LEDS_UNPACKED_ARRAY_PINS_RNG led
  34.    
  35. );
  36.  
  37.     logic `LEDS_PACKED_ARRAY_CNT_RNG led_cnt;
  38.     always_ff @(posedge clk25_175MHz)
  39.         led_cnt <= !resetn ? '0 : led_cnt + 1'b1;
  40.        
  41.     assign led = led_cnt[`LEDS_PACKED_ARRAY_CNT_WDT-1:
  42.                            `LEDS_PACKED_ARRAY_CNT_WDT-`LEDS_UNPACKED_ARRAY_PINS_WDT];  
  43.  
  44.     logic clk25_175MHz;
  45.  
  46.     vga_pll vga_pll_inst (
  47.    
  48.         .inclk0 ( clk50MHz      ),    // 50 MHz
  49.         .c0     ( clk25_175MHz  )     // 25,175 MHz
  50.        
  51.     );
  52.    
  53.     // Video Enables
  54.     logic video_en,
  55.           horizontal_en,
  56.           vertical_en;
  57.          
  58.     // Color Signals
  59.     logic red_signal,
  60.           green_signal,
  61.           blue_signal;
  62.          
  63.     // Sync Signals      
  64.     logic hsync_signal,
  65.           vsync_signal;
  66.          
  67.     //Sync Counters
  68.     logic `CNT_RNG h_cnt,
  69.                    v_cnt;
  70.    
  71.     assign video_en = horizontal_en & vertical_en;
  72.    
  73.     always_ff @(posedge clk25_175MHz) begin
  74.    
  75.         // -----------------  Horizontal Sync ---------------
  76.        
  77.         // Horizontal Counter
  78.         h_cnt <= !resetn || h_cnt == `WHOLE_LINE_PXLS - 1 ? '0 : h_cnt + 1'b1;
  79.  
  80.         // Generate Horizontal Data
  81.         // Rows Of Red
  82.         if (v_cnt >= 0 && v_cnt < `FIRST_HORIZ_BORDER_PXLS) begin
  83.             red_signal   <= 1'b1;
  84.             green_signal <= 1'b0;
  85.             blue_signal  <= 1'b0;
  86.         end;   
  87.        
  88.         // Rows Of Green
  89.         if (v_cnt >= `FIRST_HORIZ_BORDER_PXLS && v_cnt < `SECOND_HORIZ_BORDER_PXLS) begin
  90.             red_signal   <= 1'b0;
  91.             green_signal <= 1'b1;
  92.             blue_signal  <= 1'b0;  
  93.         end;
  94.        
  95.         // Rows Of Blue
  96.         if (v_cnt >= `SECOND_HORIZ_BORDER_PXLS && v_cnt <= `VISIBLE_FRAME_PXLS) begin
  97.             red_signal   <= 1'b0;
  98.             green_signal <= 1'b0;
  99.             blue_signal  <= 1'b1;          
  100.         end;
  101.  
  102.         // Generate Horizontal Sync
  103.         hsync_signal <= h_cnt >= `HORIZ_SYNC_PRE_PXLS && h_cnt <= `HORIZ_SYNC_POST_PXLS;
  104.    
  105.         // -----------------  Vertical Sync ---------------
  106.  
  107.         // Reset Vertical Counter
  108.        
  109.         v_cnt <= !resetn ||
  110.                  v_cnt > `VERT_FRAME_PXLS - 2 &&
  111.                  h_cnt > `WHOLE_LINE_PXLS - 2 ? '0 :
  112.                  h_cnt == `WHOLE_LINE_PXLS ?
  113.                  v_cnt + 1'b1 :
  114.                  v_cnt;
  115.    
  116.         // Generate Vertical Sync
  117.         vsync_signal <= v_cnt > `VERT_SYNC_PRE_PXLS && v_cnt < `VERT_SYNC_POST_PXLS;    
  118.    
  119.         // Generate Horizontal Enable
  120.         horizontal_en <= h_cnt < `VISIBLE_LINE_PXLS;
  121.        
  122.         // Generate Vertical Enable
  123.         vertical_en <= v_cnt < `VISIBLE_FRAME_PXLS;
  124.    
  125.         // Assign Physical Signals To VGA
  126.         red   <= red_signal   & video_en;
  127.         green <= green_signal & video_en;
  128.         blue  <= blue_signal  & video_en;
  129.    
  130.     end // always_ff @(posedge clk25_175MHz) begin
  131.    
  132.     `ifdef VGA640X480
  133.  
  134.         assign hsync = ~hsync_signal;
  135.         assign vsync = ~vsync_signal;
  136.        
  137.     `elsif VGA1280X1024
  138.    
  139.         assign hsync = hsync_signal;
  140.         assign vsync = vsync_signal;
  141.  
  142.     `else // defaulf - for test purposes
  143.    
  144.         assign hsync = 1'b1;
  145.         assign vsync = 1'b0;
  146.        
  147.     `endif    
  148.    
  149. endmodule : vga      
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement