VGA$B%b%8%e!<%k$N:n@.(B


KITE$B%W%m%;%C%5$N$K@\B3$9$k(BVGA$B%b%8%e!<%k$r:n@.$7$^$9!#(B

VGA$B%b%8%e!<%k$N;EMM(B

$B2hLL9=@.!"J8;z9=@.!"(BKITE$B$K$*$1$k%a%b%j%^%C%W$NBP1~$r0J2<$K<($9!#(B



VGA$B%b%8%e!<%k$N%V%m%C%/?^(B

VGA$B%b%8%e!<%k$O!"
  • Video RAM$B!'2hLL$KI=<($9$kJ8;z$N(BJIS8$B%S%C%H%3!<%I$rJ];}$7$F$*$/%a%b%j!#(B $BI=<(J8;z?t$O(B80x24$BJ8;z$G$"$k$N$G!"(B8$B%S%C%H$G(B1,920$B%o!<%I$r5-21$G$-$kI,(B $BMW$,$"$k!#(B
    $B:#2s$O(B8$B%S%C%H$N%-%c%i%/%?%3!<%I$rMQ$$$k$3$H$K$9$k$N$G!"(B8$B%S%C%H$G(B1,920$B%o!<%I$r5-21$G$-$l$P$h$$!#(B
  • Charactor ROM$B!'%-%c%i%/%?$NJ8;z>pJs$r5-21$7$F$*$/%a%b%j!#(BJIS8$B%S%C%H(B $B%3!<%I$N>l9g(B256$BJ8;z$G$"$k$N$G!"(B1$BJ8;z$N9=@.$,(B8x16line$B$N>l9g!"(B8$B%S%C(B $B%H(B4,096$B%o!<%II,MW$H$J$k!#(B
    $B;D$j$N(B4$B%i%$%s$N%V%i%s%/%i%$%s(B($BL5I=<((B)$B$O Shift Register$B!'(BChar.ROM $B$+$iFI$_=P$7$?J8;z$N%I%C%H%G!<%?$r%I%C%H(B $B%/%m%C%/$K1~$8$F%7%U%H$7!"%7%j%"%k$K=PNO$9$k!#(B
  • VGA Controller$B!'(BVideo Memory, Char. ROM, Shift Register $B$N@)8f$*$h$SF14|(B $B?.9f$N@8@.$r9T$&%b%8%e!<%k$G$"$k!#FbIt9=@.$H$7$F$O!"$[$H$s$I$,%?%$(B $B%_%s%0D4@0MQ$N%+%&%s%?$G$"$k!#(B

    VGA$B2hA|I=<($N9M$(J}(B

    VGA$B%b%K%?$X$N2hA|I=<($O!"DL>o$N%F%l%S$HF1MM$K%i%9%?%9%-%c%s$GI=<($r9T$C(B $B$F$$$k!#(B $B$3$N(B4$B8D$N%+%&%s%?$O0J2<$NMM$KF0:n$9$k!#(B $B$3$l$i$N%+%&%s%?Ey$r `define HMAX 100 // H total Char. `define HSIZ 80 // H Size `define HSP 84 // H Sync. Pos. `define HSL 12 // H Sync. Len. `define HCR 8 // H dots per Char. `define VMAX 26 // V total Char. `define VSIZ 24 // V Size `define VSP 25 // V Sync. Pos. `define VSL 1 // V Sync. Len. `define VCR 20 // V lines per Char. module vram ( CLK, DCLK, RST, ADDR, DATAI, DATAO, MREQ, RW, ACK, R, G, B, HS, VS, DE ); input ...; output ...; ... endmodule $B$^$?!"%+%&%s%?$N@k8@$O0J2<$N$H$*$j$H$J$k!#(B
    reg    [2:0] CNT;
    reg    [6:0] HCNT;  // H Counter 0-99
    reg    [4:0] VCNT;  // V Counter 0-27
    reg    [4:0] RCNT;  // R Counter 0-19
    


    VideoRAM$B$H(BChar.ROM$B$N%"%/%;%9J}K!(B

    VGA$B%b%K%?$X$N2hA|I=<($O!"DL>o$N%F%l%S$HF1MM$K%i%9%?%9%-%c%s$GI=<($r9T$C(B $B$F$$$k!#(B

    • $B%/%m%C%/$O(B75MHz$B$H(B25MHz$B$,6!5k$5$l$F$$$k!#(B
      KITE$B%W%m%;%C%5$+$i$N(BVRAM$B%"%/%;%9$O(B75MHz$B$KF14|$9$k!#(B
      VGA$B%3%s%H%m!<%kIt$O$9$Y$F(B1dot$B$N%/%m%C%/$G$"$k(B25MHz$B$r4pK\$H$7$FF0:n$7$F$$$k!#(B
    • $B?^$K<($9$h$&$K(B1$BJ8;z$N2#$O(B3.125MHz$B$H$J$k!#(B
      25MHz$B$r%7%U%H%/%m%C%/(B(1$B%I%C%HJ,$NI=<(%/%m%C%/(B)$B!"(B
      25MHz$B$r(B8$BJ,<~$7$?(B3.125MHz$B$G%G%e!<%F%#Hf(B1/8$B$N%/%m%C%/$r%Q%$%W%i%$%s%l%8%9%?MQ$N%?%$(B $B%_%s%0%/%m%C%/$H$9$k!#(B




    $B=PNO?.9f(B

    DVI$B%S%G%*$N(BR, G, B$B$N3F=PNO$O(B8$B%S%C%H$G(B256$B3,D4$G$"$k!#(B
    $B$7$+$7!":#2s$N@_7W$OC1?'$G$"$k$N$G!"8w$i$;$k>l9g$O(BR,G,B$B$H$b$K(B(FF)$B!"(B
    $B8w$i$;$J$$>l9g$O(B(00)$B$r=PNO$9$k!#(B

    HS, VS$B$NF14|?.9f$OIiO@M}$G$"$k$N$GCm0U$9$k!#(B

    DE$B$OJ8;z$rI=<($5$;$k4|4V$K#1$H$9$k!#(B
    $B$J$*!"%Q%$%W%i%$%sF0:n$7$F$$$k$?$a!"(B
    HCNT$B$NCM$,(B0$A!+(B79$B$N$H$-$K(BDE$B$r#1$K$9$k$N$G$O$J$$$3$H$KCm0U$9$k!#(B

    $B%5%s%W%k%=!<%9(B

    `define HMAX 100 // H total dots
    `define HSIZ  80 // H Size
    `define HSP   84 // H Sync. Pos.
    `define HSL   12 // H Sync. Len.
    `define HCR    8 // H dots per Char.
    `define VMAX  26 // V total Line
    `define VSIZ  24 // V Size
    `define VSP   25 // V Sync. Pos.
    `define VSL    1 // V Sync. Line
    `define VCR   20 // V lines per Char.
    
    module vram (CLK, DCLK, RST, ADDR, DATAI, DATAO, MREQ, RW, ACK, R, G, B, HS, VS, DE);
       input         CLK,	     // Processor Clock (75MHz)
                     DCLK,	     // Video Clock     (25MHz)
                     RST;	     // Reset
       input  [11:0] ADDR;	     // Video Memory Address
       input  [ 7:0] DATAI;	     // Data Input
       input         MREQ,	     // Memory Request
                     RW;	     // Read/Write
       output [ 7:0] DATAO;      // Data Output
       output        ACK;	     // Acknowledge
       output [ 7:0] R, G, B;    // RGB Data
       output        HS, VS, DE; // Sync. & Data Enable
    
       reg    [ 7:0] DATAO;
    
       // Memory
       reg    [ 7:0] VRAM [0:2047];
       reg    [ 7:0] CGROM[0:4095];
    
       // Counter
       reg    [..:0] CNT;	// Character Counter (8dots)
       reg    [..:0] HCNT;  // H Counter 0-99
       reg    [..:0] VCNT;  // V Counter 0-27
       reg    [..:0] RCNT;  // R Counter 0-18
    
       wire          CEP;	// Character End Pulse
    
       // Pipeline Register
       reg    [..:0] CADR;	// Character Code (8bits)
       reg    [..:0] SR;	// Shift Register (8bits)
    
       // Internal Signals
       wire   [..:0] VADR;  // VideoRAM Address (2048bytes)
       wire   [..:0] CGADR; // CG-ROM Address (4096bytes)
       wire   [..:0] CGDATA;// CG-ROM Data Size (8bits)
    
    
      // Memory Initialize
      initial
        begin
          $readmemh( "VRAM20.ram", VRAM );
          $readmemh( "font9x18_256.ram", CGROM );
        end
    
       // Video-RAM Write & Read
       always @( posedge CLK )
       begin
         if( ( ADDR[...] == 1'b1 ) && MREQ && ( RW == ...  ) )
             VRAM[ ...[...:...] ] <= ...;
             ... <= VRAM[ ...[...:...]];
       end
    
       // Video-RAM Acknowledge for Write & Read 
       assign ACK = ( ( ADDR[...] == 1'b1 ) && ... );
    
       // Counter for Character End Pulse
       always @( posedge DCLK )
         if( RST ) ... <= ...     else
                   ... <= .......;
    
       assign ...  = ...;  // Character End Pulse
    
    
       always @( posedge DCLK )
       begin
          if( ... ) begin ...<=...; ...<=...; ...<=...; end
          if( ... )
          begin
             if( ... == ... )
             begin
                ... <= ...;
                if( ... == ... )
                begin
                   ... <= ...;
                   if( ... == ... ) ... <= ...;
                   else             ... <= ...;
                end
                else
                   ... <= ......;
             end
             else
                   ... <= ......;
          end
       end
    
        // Read character data from VRAM
        always @( posedge DCLK )
        begin
          if( ... )
            begin
              ... <= ...;
            end
        end
    
       // Internal Memory Address
       assign VADR  = { ..., ... } * 12'd... + { ..., ... };
       assign CGADR = { ..., ...[...:...] };
       assign CGDATA= ...[ ... ];
    
       // Shift Register
       always @( posedge DCLK )
       begin
          if ( ... ) SR <= ...; else
          if ( ... ) SR <= ...; else
                     SR <= { ..., ... };
       end
    
       // RGB Data & Data Enable
       assign { R, G, B } = ( ...[...]  && ( RCNT < 16 ) ) ? 24'hffffff : 24'h000000;
       assign DE = ( ( 1 < ... && ... < ... + ... ) && ( ... < ... ) );
    
       //Sync
       assign HS = ~( HCNT >= ... && HCNT < (... + ...) );
       assign VS = ~( VCNT >= ... && VCNT < (... + ...) );
    
    endmodule
    



    $B:G8e$K!"(Bkite_top$B3,AX$+$i$O0J2<$NMM$K8F$S=P$9$3$H$K$J$k!#(B
    RST$B$H$7$F(BLOCKED$B?.9f$rMQ$$$F$$$k$N$O!"(BPLL$B$K$h$k%/%m%C%/$,0BDj$7$F$+$i(B
    $B%3%s%H%m!<%k2sO)$rF0:n$5$;$k$?$a$G$"$k!#(B
      //
      // Memory & Video RAM
      //
      vram   mem1 ( .CLK (CLK75),
                    .DCLK(CLK25),
                    .RST(!LOCKED),
                    .ADDR(ADR),
                    .DATAI(DATAO[7:0]),
                    .DATAO(VRAM_DATAO),
                    .MREQ(MREQ),
                    .RW(RW),
                    .ACK(VRAM_ACK),
                    .R(R),
                    .G(G),
                    .B(B),
                    .HS(HS),
                    .VS(VS),
                    .DE(DE)
                  );
    

    | Back |