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

Subversion Repositories wf3d

[/] [wf3d/] [trunk/] [implement/] [rtl/] [fm_hvc/] [fm_hvc_core.v] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 specular
//=======================================================================
2
// Project Monophony
3
//   Wire-Frame 3D Graphics Accelerator IP Core
4
//
5
// File:
6
//   fm_hvc_core.v
7
//
8
// Abstract:
9
//   HV counter core
10
//
11
// Author:
12 9 specular
//   Kenji Ishimaru (info.info.wf3d@gmail.com)
13 2 specular
//
14
//======================================================================
15
//
16
// Copyright (c) 2015, Kenji Ishimaru
17
// All rights reserved.
18
//
19
// Redistribution and use in source and binary forms, with or without
20
// modification, are permitted provided that the following conditions are met:
21
//
22
//  -Redistributions of source code must retain the above copyright notice,
23
//   this list of conditions and the following disclaimer.
24
//  -Redistributions in binary form must reproduce the above copyright notice,
25
//   this list of conditions and the following disclaimer in the documentation
26
//   and/or other materials provided with the distribution.
27
//
28
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
30
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
32
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
33
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
34
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
35
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
36
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
37
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
38
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39
//
40
// Revision History
41
 
42
module fm_hvc_core (
43
    clk_vi,
44
    rst_x,
45
    // configuration registers
46
    i_video_start,
47
    // control out (only for internal use)
48
    o_vsync_i,
49
    o_hsync_i,
50
    // video out timing
51
    o_active,
52
    o_first_line,
53
    // video out
54
    o_r,
55
    o_g,
56
    o_b,
57
    o_vsync_x,
58
    o_hsync_x,
59
    o_blank_x,
60
    o_de
61
);
62
 
63
//////////////////////////////////
64
// I/O port definition
65
//////////////////////////////////
66
    input          clk_vi;     // 25MHz
67
    input          rst_x;
68
    // configuration registers
69
    input          i_video_start;
70
    // control out (only for internal use)
71
    output         o_vsync_i;
72
    output         o_hsync_i;
73
    // video out timing
74
    output         o_active;
75
    output         o_first_line;
76
 
77
    output [7:0]   o_r;
78
    output [7:0]   o_g;
79
    output [7:0]   o_b;
80
    output         o_vsync_x;
81
    output         o_hsync_x;
82
    output         o_blank_x;
83
    output         o_de;
84
//////////////////////////////////
85
// reg
86
//////////////////////////////////
87
    reg    [9:0]   r_hcnt;
88
    reg    [9:0]   r_vcnt;
89
    reg            r_vsync_x;
90
    reg            r_hsync_x;
91
    reg            r_hsync_x_i; // internal use, vactive only
92
 
93
    reg            r_blank_x;
94
 
95
    reg            r_vsync_neg;
96
    reg            r_hsync_neg;
97
    reg            r_de;
98
 
99
 
100
//////////////////////////////////
101
// wire
102
//////////////////////////////////
103
    wire           w_h_end;
104
    wire           w_v_end;
105
 
106
    wire           w_vsync;
107
    wire           w_hsync;
108
    wire           w_hsync_dma;
109
    wire           w_hactive;
110
    wire           w_vactive_first;  // for aa
111
    wire           w_vactive;
112
    wire           w_active;
113
    wire           w_active_first;  // for aa
114
 
115
    // color bar
116
    wire       w_r_test_en = ((r_hcnt >= 160) & (r_hcnt <= 251)) |
117
                             ((r_hcnt >= 252) & (r_hcnt <= 343)) |
118
                             ((r_hcnt >= 527) & (r_hcnt <= 617)) |
119
                             ((r_hcnt >= 618) & (r_hcnt <= 708));
120
    wire       w_g_test_en = ((r_hcnt >= 160) & (r_hcnt <= 251)) |
121
                             ((r_hcnt >= 252) & (r_hcnt <= 343)) |
122
                             ((r_hcnt >= 344) & (r_hcnt <= 435)) |
123
                             ((r_hcnt >= 436) & (r_hcnt <= 526));
124
    wire       w_b_test_en = ((r_hcnt >= 160) & (r_hcnt <= 251)) |
125
                             ((r_hcnt >= 344) & (r_hcnt <= 435)) |
126
                             ((r_hcnt >= 527) & (r_hcnt <= 617)) |
127
                             ((r_hcnt >= 709) & (r_hcnt <= 799));
128
 
129
    wire [7:0] w_r_test = {8{w_r_test_en}};
130
    wire [7:0] w_g_test = {8{w_g_test_en}};
131
    wire [7:0] w_b_test = {8{w_b_test_en}};
132
 
133
    wire       w_hsync_x_i;
134
//////////////////////////////////
135
// assign
136
//////////////////////////////////
137
 
138
    // VGA : 60Hz
139
    assign w_h_end = (r_hcnt == 'd799);  // 800 clock
140
    assign w_v_end = w_h_end & (r_vcnt == 'd524);  // 525 line
141
 
142
    assign w_vsync = ((r_vcnt == 10'd10) | (r_vcnt == 10'd11)) ? 1'b0 : 1'b1;
143
    assign w_hsync = ((r_hcnt >= 10'd16)&(r_hcnt <= 10'd111)) ? 1'b0 : 1'b1;
144
    assign w_hsync_dma = ((r_hcnt >= 10'd16)&(r_hcnt <= 10'd39)) ? 1'b0 : 1'b1;
145
 
146
    assign w_hactive = ((r_hcnt >= 10'd160)&(r_hcnt <= 10'd799)) ? 1'b1 : 1'b0;
147
    assign w_vactive = ((r_vcnt >= 10'd45)&(r_vcnt <= 10'd524))  ? 1'b1 : 1'b0;
148
    assign w_vactive_first = (r_vcnt == 10'd45);
149
 
150
    assign w_active = w_hactive & w_vactive;
151
    assign w_active_first = w_vactive_first;
152
 
153
    assign w_hsync_x_i = w_vactive & w_hsync_dma;
154
    // color should be black in blanking
155
    //assign w_r = (w_active) ? w_rgb[7:0]   : 8'h00;
156
    //assign w_g = (w_active) ? w_rgb[15:8]  : 8'h00;
157
    //assign w_b = (w_active) ? w_rgb[23:16] : 8'h00;
158
 
159
    assign o_vsync_x = r_vsync_x;//r_vsync_neg;
160
    assign o_hsync_x = r_hsync_x;//r_hsync_neg;
161
    assign o_blank_x = r_blank_x;
162
    assign o_de = r_de;
163
 
164
    assign o_r = (w_active) ? w_r_test : 8'h00;
165
    assign o_g = (w_active) ? w_g_test : 8'h00;
166
    assign o_b = (w_active) ? w_b_test : 8'h00;
167
 
168
    assign o_vsync_i = r_vsync_x;
169
    assign o_hsync_i = r_hsync_x_i;
170
    assign o_active = w_active;
171
    assign o_first_line = w_active_first;
172
//////////////////////////////////
173
// always
174
//////////////////////////////////
175
    // H counter
176
    always @(posedge clk_vi or negedge rst_x) begin
177
        if (~rst_x) begin
178
            r_hcnt <= 11'b0;
179
        end else begin
180
            if (w_h_end) r_hcnt <= 11'b0;
181
            else r_hcnt <= r_hcnt + 1'b1;
182
        end
183
    end
184
 
185
    // V counter
186
    always @(posedge clk_vi or negedge rst_x) begin
187
        if (~rst_x) begin
188 4 specular
            r_vcnt <= 10'd9;   // this is for faster simulatin (v rise)
189 2 specular
        end else begin
190
            if (w_v_end) r_vcnt <= 10'd0;
191
            else if (w_h_end) r_vcnt <= r_vcnt + 1'b1;
192
        end
193
    end
194
 
195
   // sync
196
    always @(posedge clk_vi or negedge rst_x) begin
197
        if (~rst_x) begin
198
            r_vsync_x <= 1'b1;
199
            r_hsync_x <= 1'b1;
200
            r_blank_x <= 1'b1;
201
            r_de <= 1'b0;
202
        end else begin
203
            r_vsync_x <= w_vsync;
204
            r_hsync_x <= w_hsync;
205
            r_hsync_x_i <= w_hsync_x_i;
206
            r_blank_x <= w_active;
207
            r_de <= w_active;
208
        end
209
    end
210
 
211
 
212
 
213
    // neg-edge registers for output timing adjustment
214
    always @(negedge clk_vi or negedge rst_x) begin
215
        if (~rst_x) begin
216
            r_vsync_neg <= 1'b1;
217
            r_hsync_neg <= 1'b1;
218
        end else begin
219
            r_vsync_neg <= r_vsync_x;
220
            r_hsync_neg <= r_hsync_x;
221
        end
222
    end
223
 
224
 
225
endmodule

powered by: WebSVN 2.1.0

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