首页 > 技术文章 > 1080P60视频源---verilog

chensimin1990 2019-03-19 15:33 原文

1080P60视频源---verilog

  1 `timescale 1ns / 1ps
  2 //////////////////////////////////////////////////////////////////////////////////
  3 // Company: 
  4 // Engineer: chensimin
  5 // 
  6 // Create Date: 2019/03/15 10:09:21
  7 // Design Name: 
  8 // Module Name: video_source
  9 // Project Name: 
 10 // Target Devices: 
 11 // Tool Versions: 
 12 // Description: 
 13 // 
 14 // Dependencies: 
 15 // 
 16 // Revision:
 17 // Revision 0.01 - File Created
 18 // Additional Comments:
 19 // 
 20 //////////////////////////////////////////////////////////////////////////////////
 21 
 22  module video_source (
 23 
 24     input  wire      clk,
 25     input  wire      rest,
 26     output reg [9:0] video_y = 10'h3FF,
 27     output reg [9:0] video_c = 10'h3FF,
 28     output wire      data_enable,
 29     output reg       sync_h = 0,
 30     output reg       sync_v = 0
 31 
 32     );
 33 
 34 //---------------------------------------------------------------------------------------------------------------
 35 
 36 reg [11:0] h_count = 2199;
 37 
 38 always @(posedge clk or posedge rest)
 39 begin
 40     if(rest)
 41         h_count <= 12'd2199;
 42     else if(h_count == 12'd2199)
 43         h_count <= 12'd0;
 44     else 
 45         h_count <= h_count + 1'd1;
 46 end
 47 
 48 //---------------------------------------------------------------------------------------------------------------
 49 
 50 reg  h_end   = 0;
 51 
 52 always @(posedge clk or posedge rest)
 53 begin
 54     if(rest)
 55         h_end <= 1'b0;
 56     else if(h_count == 12'd2198)
 57         h_end <= 1'b1;
 58     else 
 59         h_end <= 1'b0;
 60 end
 61 
 62 //---------------------------------------------------------------------------------------------------------------
 63 
 64 reg [11:0] v_count = 1;
 65 
 66 always @(posedge clk or posedge rest)
 67 begin
 68     if(rest)
 69         v_count <= 12'd1;
 70     else if(v_count == 12'd1125 & h_count == 12'd2199)
 71         v_count <= 12'd1;
 72     else if(h_end)
 73         v_count <= v_count + 1'd1;
 74 end
 75 
 76 //---------------------------------------------------------------------------------------------------------------
 77 
 78 wire b0, b1, b2, b3, b4, b5, b6, b7;
 79 wire [7:0] condition_b;
 80 
 81 assign b0 = v_count >= 12'd1     & v_count < 12'd41     ;
 82 assign b1 = v_count == 12'd41    & h_count <= 12'd2198  ;
 83 assign b2 = v_count >= 12'd42    & v_count < 12'd1121   ;
 84 assign b3 = v_count == 12'd1121  & h_count <= 12'd2198  ;
 85 assign b4 = v_count == 12'd1121  & h_count == 12'd2199  ;
 86 assign b5 = v_count >= 12'd1122  & v_count < 12'd1125   ;
 87 assign b6 = v_count == 12'd1125  & h_count <= 12'd2198  ;
 88 assign b7 = v_count == 12'd1125  & h_count == 12'd2199  ;
 89 
 90 assign condition_b = {b0, b1, b2, b3, b4, b5, b6, b7};
 91 
 92 //---------------------------------------------------------------------------------------------------------------
 93 
 94 reg v = 0;
 95 
 96 always @(posedge clk or posedge rest)
 97 begin
 98     if(rest)
 99         v <= 1'b0;
100     else 
101     begin
102         case(condition_b)
103             8'b1000_0000:    
104                 v <= 1'b1;
105             8'b0100_0000:
106                 v <= 1'b1;
107             8'b0010_0000:
108                 v <= 1'b0;
109             8'b0001_0000:
110                 v <= 1'b0;
111             8'b0000_1000:
112                 v <= 1'b1;
113             8'b0000_0100:
114                 v <= 1'b1;
115             8'b0000_0010:
116                 v <= 1'b1;
117             8'b0000_0001:
118                 v <= 1'b1;
119             default:
120                 v <= 1'b0; 
121         endcase
122     end
123 end
124 
125 //---------------------------------------------------------------------------------------------------------------
126 
127 wire  [9:0] condition_a ;
128 
129 assign a0  = h_count == 12'd2199                   ;  // 3FF
130 assign a1  = h_count == 12'd0                      ;  // 000
131 assign a2  = h_count == 12'd1                      ;  // 000
132 assign a3  = h_count == 12'd2                      ;  // EAV
133 assign a4  = h_count >= 12'd3 & h_count <= 274     ;  // Blank
134 assign a5  = h_count == 12'd275                    ;  // 3FF
135 assign a6  = h_count == 12'd276                    ;  // 000
136 assign a7  = h_count == 12'd277                    ;  // 000
137 assign a8  = h_count == 12'd278                    ;  // SAV
138 assign a9  = h_count >= 12'd279 & h_count <= 2198  ;  // Active
139 
140 
141 assign condition_a = {a0, a1, a2, a3, a4, a5, a6, a7, a8, a9};
142 
143 //---------------------------------------------------------------------------------------------------------------
144 
145 reg eav = 0;
146 reg sav = 0;
147 
148 always @(posedge clk or posedge rest)
149 begin
150     if(rest)
151     begin
152         video_y <= 10'h3FF;
153         eav <= 1'b0;
154         sav <= 1'b0;
155     end 
156     else 
157     begin
158 
159         eav <= 1'b0;
160         sav <= 1'b0;
161 
162         case(condition_a)
163             10'b100_0000_000: 
164                 video_y <= 10'h3FF;
165             10'b010_0000_000:
166                 video_y <= 10'h000;
167             10'b001_0000_000:
168                 video_y <= 10'h000;
169             10'b000_1000_000:
170             begin
171                 eav <= 1'b1;
172                 if( v_count >=42 & v_count <= 1121)
173                     video_y <= {1'b1, 1'b0, 1'b0, 1'b1, 1'b0^1'b1, 1'b0^1'b1, 1'b0^1'b0, 1'b0^1'b0^1'b1, 1'b0, 1'b0};
174                 else 
175                     video_y <= {1'b1, 1'b0, 1'b1, 1'b1, 1'b1^1'b1, 1'b0^1'b1, 1'b0^1'b1, 1'b0^1'b1^1'b1, 1'b0, 1'b0};
176             end 
177             10'b000_0100_000:
178                 video_y <= 10'h040;
179             10'b000_0010_000:
180                 video_y <= 10'h3FF;
181             10'b000_0001_000:
182                 video_y <= 10'h000;    
183             10'b000_0000_100:
184                 video_y <= 10'h000;
185             10'b000_0000_010:
186             begin
187                 sav <= 1'b1;
188                 if( v_count >= 42 & v_count <= 1121)
189                     video_y <= {1'b1, 1'b0, 1'b0, 1'b0, 1'b0^1'b0, 1'b0^1'b0, 1'b0^1'b0, 1'b0^1'b0^1'b0, 1'b0, 1'b0};
190                 else 
191                     video_y <= {1'b1, 1'b0, 1'b1, 1'b0, 1'b1^1'b0, 1'b0^1'b0, 1'b0^1'b1, 1'b0^1'b1^1'b0, 1'b0, 1'b0};
192             end 
193             10'b000_0000_001:
194                 video_y <= 10'h0CD;
195             default:
196                 video_y <= 10'h040;
197         endcase 
198     end
199 end
200 
201 //---------------------------------------------------------------------------------------------------------------
202 
203 always @(posedge clk or posedge rest)
204 begin
205     if(rest)
206         video_c <= 10'h3FF;
207     else 
208     begin
209 
210         case(condition_a)
211             10'b100_0000_000: 
212                 video_c <= 10'h3FF;
213             10'b010_0000_000:
214                 video_c <= 10'h000;
215             10'b001_0000_000:
216                 video_c <= 10'h000;
217             10'b000_1000_000:
218             begin
219                 if( v_count >=42 & v_count <= 1121)
220                     video_c <= {1'b1, 1'b0, 1'b0, 1'b1, 1'b0^1'b1, 1'b0^1'b1, 1'b0^1'b0, 1'b0^1'b0^1'b1, 1'b0, 1'b0};
221                 else 
222                     video_c <= {1'b1, 1'b0, 1'b1, 1'b1, 1'b1^1'b1, 1'b0^1'b1, 1'b0^1'b1, 1'b0^1'b1^1'b1, 1'b0, 1'b0};
223             end 
224             10'b000_0100_000:
225                 video_c <= 10'h040;
226             10'b000_0010_000:
227                 video_c <= 10'h3FF;
228             10'b000_0001_000:
229                 video_c <= 10'h000;    
230             10'b000_0000_100:
231                 video_c <= 10'h000;
232             10'b000_0000_010:
233             begin
234                 if( v_count >= 42 & v_count <= 1121)
235                     video_c <= {1'b1, 1'b0, 1'b0, 1'b0, 1'b0^1'b0, 1'b0^1'b0, 1'b0^1'b0, 1'b0^1'b0^1'b0, 1'b0, 1'b0};
236                 else 
237                     video_c <= {1'b1, 1'b0, 1'b1, 1'b0, 1'b1^1'b0, 1'b0^1'b0, 1'b0^1'b1, 1'b0^1'b1^1'b0, 1'b0, 1'b0};
238             end 
239             10'b000_0000_001:
240                 video_c <= 10'h0CD;
241             default:
242                 video_c <= 10'h040;
243         endcase 
244     end
245 end
246 
247 //---------------------------------------------------------------------------------------------------------------
248 
249 reg h = 0;
250 
251 always @(posedge clk or posedge rest)
252 begin
253     if(rest)
254         h <= 1'b0;
255     else if(h_count == 2199 | ( h_count >= 0 & h_count <= 278 ))
256         h <= 1'b0;
257     else 
258         h <= 1'b1;
259 end
260 
261 //---------------------------------------------------------------------------------------------------------------
262 
263 assign data_enable = h & ~v;
264 
265 //---------------------------------------------------------------------------------------------------------------
266 
267 always @(posedge clk or posedge rest)
268 begin
269     if(rest)
270         sync_h <= 1'b0;
271     else if(h_count >= 87 & h_count <= 130)
272         sync_h <= 1'b1;
273     else 
274         sync_h <= 1'b0;
275 end 
276 
277 //---------------------------------------------------------------------------------------------------------------
278 
279 always @(posedge clk or posedge rest)
280 begin
281     if(rest)
282         sync_v <= 1'b0;
283     else if(v_count >=1 & v_count < 5)
284         sync_v <= 1'b1;
285     else if(v_count == 5 & h_count <=2198)
286         sync_v <= 1'b1;
287     else 
288         sync_v <= 1'b0;
289 end
290 
291 //---------------------------------------------------------------------------------------------------------------
292 
293 endmodule
294 
295 
296 /*
297 
298 add_force {/video_source/clk} -radix hex {1 0ns} {0 50000ps} -repeat_every 100000ps
299 add_force {/video_source/rest} -radix hex {1 0ns} {0 200ns} 
300 
301 
302 
303 
304 */

仿真结果:

 

推荐阅读