OpenCores
URL https://opencores.org/ocsvn/axi_vga_fb/axi_vga_fb/trunk

Subversion Repositories axi_vga_fb

[/] [axi_vga_fb/] [trunk/] [vga.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ultro
///////////////////////////////////
2
// AXI to VGA frame buffer
3
// fixed 640x200x8bpp truecolor , 128kByte internal vram ressource
4
// (c) Valptek 2017
5
///////////////////////////////////
6
 
7
 
8
module vga(
9
    input s00_AXI_RSTN,
10
    input s00_AXI_CLK,
11
    output [3:0] r4,g4,b4,
12
    output hz,vt,
13
    // axi bus
14
    input  [31:0] s00_AXI_AWADDR, s00_AXI_ARADDR,
15
    input         s00_AXI_AWVALID,s00_AXI_ARVALID,s00_AXI_WVALID,s00_AXI_RREADY,s00_AXI_WLAST,
16
    output reg    s00_AXI_AWREADY,s00_AXI_ARREADY,s00_AXI_WREADY,s00_AXI_RVALID,s00_AXI_RLAST,
17
    output reg [31:0] s00_AXI_RDATA,
18
    input  [31:0] s00_AXI_WDATA,
19
    input   [3:0] s00_AXI_WSTRB,
20
    input   [1:0] s00_AXI_ARBURST,
21
    input   [7:0] s00_AXI_ARLEN,
22
    input   [2:0] s00_AXI_ARSIZE,
23
    input   [1:0] s00_AXI_AWBURST,
24
    input   [7:0] s00_AXI_AWLEN,
25
    input   [2:0] s00_AXI_AWSIZE,
26
    input         s00_AXI_BREADY,
27
    output        s00_AXI_BVALID
28
    );
29
 
30
// video ram
31
reg  [7:0] vmem1 [0:(640*200/4)-1];
32
reg  [7:0] vmem2 [0:(640*200/4)-1];
33
reg  [7:0] vmem3 [0:(640*200/4)-1];
34
reg  [7:0] vmem4 [0:(640*200/4)-1];
35
 
36
reg  [7:0] Qreg1,Qreg2,Qreg3,Qreg4;
37
reg [14:0] wadd,radd,vadd,gadd;
38
reg  [1:0] vbits;
39
reg        wreq1,wreq2,wreq3,wreq4;
40
 
41
reg [31:0] fifo,wdat;
42
reg [1:0] gclk;
43
reg [9:0] counX, counY;
44
wire [9:0] nextcounX;
45
reg hSync, vSync;
46
reg rd_rq,wr_rq,wr_gnt,rd_gnt;
47
reg [3:0] wr_strb;
48
 
49
 
50
always @(posedge s00_AXI_CLK) Qreg1 <= vmem1[vadd];
51
always @(posedge s00_AXI_CLK) Qreg2 <= vmem2[vadd];
52
always @(posedge s00_AXI_CLK) Qreg3 <= vmem3[vadd];
53
always @(posedge s00_AXI_CLK) Qreg4 <= vmem4[vadd];
54
 
55
 
56
always @(posedge s00_AXI_CLK) if (wreq1) vmem1[vadd] <= wdat[31:24];
57
always @(posedge s00_AXI_CLK) if (wreq2) vmem2[vadd] <= wdat[23:16];
58
always @(posedge s00_AXI_CLK) if (wreq3) vmem3[vadd] <= wdat[15:8];
59
always @(posedge s00_AXI_CLK) if (wreq4) vmem4[vadd] <= wdat[7:0];
60
 
61
//
62
// Internal BUS :  write generate & decode + round robin for video display
63
//
64
always @(posedge s00_AXI_CLK or negedge s00_AXI_RSTN)
65
if (s00_AXI_RSTN == 0)
66
 begin
67
  s00_AXI_AWREADY <= 0;
68
  s00_AXI_ARREADY <= 0;
69
  s00_AXI_WREADY  <= 0;
70
  s00_AXI_RVALID  <= 0;
71
  s00_AXI_RLAST   <= 0;
72
  rd_rq           <= 0;
73
  wr_rq           <= 0;
74
 end
75
else
76
begin
77 3 ultro
   if ( ((s00_AXI_AWVALID == 1) && (s00_AXI_AWREADY ==0)) ) begin s00_AXI_AWREADY <=1; wadd <= s00_AXI_AWADDR[16:2]; end
78
 
79 2 ultro
   if ( ((s00_AXI_ARVALID == 1) && (s00_AXI_ARREADY ==0)) ) begin rd_rq <= 1; s00_AXI_ARREADY <=1; radd <= s00_AXI_ARADDR[16:2]; end else
80
                                                            begin
81
                                                             s00_AXI_ARREADY <=0;
82
                                                             s00_AXI_AWREADY <=0;
83 3 ultro
                                                             if (rd_gnt ==1)
84
                                                                 begin
85
                                                                   rd_rq <=0;
86
 
87
                                                                   s00_AXI_RVALID <= 1;
88
                                                                   s00_AXI_RLAST  <= 1;
89
                                                                 end
90
                                                                 else
91
                                                                  begin
92
                                                                   s00_AXI_RVALID <= 0;
93
                                                                   s00_AXI_RLAST  <= 1;
94
                                                                  end
95 2 ultro
                                                            end
96
 
97
   if  ( wr_gnt         == 1)                          begin s00_AXI_WREADY <=1; wr_rq <=0; wr_strb <= 0; end else
98
   if ((s00_AXI_WVALID  == 1) && (s00_AXI_WREADY ==0)) begin wr_rq <= 1; wr_strb <= s00_AXI_WSTRB; wdat <= s00_AXI_WDATA; end else
99
                                       s00_AXI_WREADY <=0;
100 3 ultro
 
101 2 ultro
 
102
end
103
 
104
 
105
// clock divider gap
106
always @(posedge s00_AXI_CLK) if (~s00_AXI_RSTN) gclk <=0; else gclk <= gclk + 1;
107
 
108
// vram read write control
109
always @(posedge s00_AXI_CLK)
110
 if (~s00_AXI_RSTN)
111
 begin
112 3 ultro
  gadd   <= 0;
113
  fifo   <= 0;
114 2 ultro
  rd_gnt <= 0;
115
  wr_gnt <= 0;
116 3 ultro
  vadd   <= 0;
117
  s00_AXI_RDATA <=0;
118 2 ultro
 end
119
 else
120
 begin
121
   if ((gclk == 0) && (wr_rq ==1)) begin wr_gnt <= 1; vadd <= wadd; {wreq1,wreq2,wreq3,wreq4} <= wr_strb; end else
122
   if ((gclk == 0) && (rd_rq ==1)) begin vadd <= radd; end else
123
   if ((gclk == 1) && (wr_rq ==1)) begin {wreq1,wreq2,wreq3,wreq4} <= 0; vadd <= gadd; end else
124 3 ultro
   if ((gclk == 1) && (rd_rq ==1)) begin rd_gnt <= 1; vadd <= gadd;  end else
125 2 ultro
   if  (gclk == 1)                 begin vadd <= gadd; end else
126 3 ultro
   if  (gclk == 2) begin wr_gnt <=0; rd_gnt <=0; s00_AXI_RDATA  <= {Qreg1,Qreg2,Qreg3,Qreg4}; end
127 2 ultro
 
128
  // update video address
129
   if  ((counY < 10'd400) && (nextcounX <10'd640)) gadd <=nextcounX[9:2]+{counY[9:1],7'b0}+{counY[9:1],5'b0};
130
   if  (gclk == 3) fifo <= {Qreg1,Qreg2,Qreg3,Qreg4};
131
 end
132
 
133
// raster  
134
always @(posedge s00_AXI_CLK) if (~s00_AXI_RSTN) counX <=0; else if (gclk ==3) begin if (counX==799) counX <=0; else counX <= nextcounX; end
135
always @(posedge s00_AXI_CLK) if (~s00_AXI_RSTN) counY <=0; else if((gclk ==3)&&(counX==799)) begin if (counY==524) counY <= 0; else counY <= counY + 1'b1; end
136
 
137
always @(posedge s00_AXI_CLK) if (~s00_AXI_RSTN) hSync <=0; else hSync <= (counX>=656) && (counX<752);
138
always @(posedge s00_AXI_CLK) if (~s00_AXI_RSTN) vSync <=0; else vSync <= (counY>=490) && (counY<492);
139
 
140
// dac
141
assign r4 = (counX>639) ? 0 : (counY>399) ? 0 :
142
            (counX[1:0] ==2'b00) ? {fifo[ 2: 0],1'b0}:
143
            (counX[1:0] ==2'b01) ? {fifo[10: 8],1'b0}:
144
            (counX[1:0] ==2'b10) ? {fifo[18:16],1'b0}:
145
                                   {fifo[26:24],1'b0};
146
 
147
assign g4 = (counX>639) ? 0 : (counY>399) ? 0 :
148
            (counX[1:0] ==2'b00) ? {fifo[ 5: 3],1'b0}:
149
            (counX[1:0] ==2'b01) ? {fifo[13:11],1'b0}:
150
            (counX[1:0] ==2'b10) ? {fifo[21:19],1'b0}:
151
                                   {fifo[29:27],1'b0};
152
 
153
assign b4 = (counX>639) ? 0 : (counY>399) ? 0 :
154
            (counX[1:0] ==2'b00) ? {fifo[ 7: 6],2'b0}:
155
            (counX[1:0] ==2'b01) ? {fifo[15:14],2'b0}:
156
            (counX[1:0] ==2'b10) ? {fifo[23:22],2'b0}:
157
                                   {fifo[31:30],2'b0};
158
 
159
assign hz = ~hSync;
160
assign vt = vSync;
161
assign nextcounX = counX +1;
162
 
163
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.