首页 > 其他 > 详细

1080P60视频源---verilog

时间:2019-03-19 16:02:36      阅读:150      评论:0      收藏:0      [点我收藏+]

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 = 10h3FF,
 27     output reg [9:0] video_c = 10h3FF,
 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 <= 12d2199;
 42     else if(h_count == 12d2199)
 43         h_count <= 12d0;
 44     else 
 45         h_count <= h_count + 1d1;
 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 <= 1b0;
 56     else if(h_count == 12d2198)
 57         h_end <= 1b1;
 58     else 
 59         h_end <= 1b0;
 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 <= 12d1;
 70     else if(v_count == 12d1125 & h_count == 12d2199)
 71         v_count <= 12d1;
 72     else if(h_end)
 73         v_count <= v_count + 1d1;
 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 >= 12d1     & v_count < 12d41     ;
 82 assign b1 = v_count == 12d41    & h_count <= 12d2198  ;
 83 assign b2 = v_count >= 12d42    & v_count < 12d1121   ;
 84 assign b3 = v_count == 12d1121  & h_count <= 12d2198  ;
 85 assign b4 = v_count == 12d1121  & h_count == 12d2199  ;
 86 assign b5 = v_count >= 12d1122  & v_count < 12d1125   ;
 87 assign b6 = v_count == 12d1125  & h_count <= 12d2198  ;
 88 assign b7 = v_count == 12d1125  & h_count == 12d2199  ;
 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 <= 1b0;
100     else 
101     begin
102         case(condition_b)
103             8b1000_0000:    
104                 v <= 1b1;
105             8b0100_0000:
106                 v <= 1b1;
107             8b0010_0000:
108                 v <= 1b0;
109             8b0001_0000:
110                 v <= 1b0;
111             8b0000_1000:
112                 v <= 1b1;
113             8b0000_0100:
114                 v <= 1b1;
115             8b0000_0010:
116                 v <= 1b1;
117             8b0000_0001:
118                 v <= 1b1;
119             default:
120                 v <= 1b0; 
121         endcase
122     end
123 end
124 
125 //---------------------------------------------------------------------------------------------------------------
126 
127 wire  [9:0] condition_a ;
128 
129 assign a0  = h_count == 12d2199                   ;  // 3FF
130 assign a1  = h_count == 12d0                      ;  // 000
131 assign a2  = h_count == 12d1                      ;  // 000
132 assign a3  = h_count == 12d2                      ;  // EAV
133 assign a4  = h_count >= 12d3 & h_count <= 274     ;  // Blank
134 assign a5  = h_count == 12d275                    ;  // 3FF
135 assign a6  = h_count == 12d276                    ;  // 000
136 assign a7  = h_count == 12d277                    ;  // 000
137 assign a8  = h_count == 12d278                    ;  // SAV
138 assign a9  = h_count >= 12d279 & 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 <= 10h3FF;
153         eav <= 1b0;
154         sav <= 1b0;
155     end 
156     else 
157     begin
158 
159         eav <= 1b0;
160         sav <= 1b0;
161 
162         case(condition_a)
163             10b100_0000_000: 
164                 video_y <= 10h3FF;
165             10b010_0000_000:
166                 video_y <= 10h000;
167             10b001_0000_000:
168                 video_y <= 10h000;
169             10b000_1000_000:
170             begin
171                 eav <= 1b1;
172                 if( v_count >=42 & v_count <= 1121)
173                     video_y <= {1b1, 1b0, 1b0, 1b1, 1b0^1b1, 1b0^1b1, 1b0^1b0, 1b0^1b0^1b1, 1b0, 1b0};
174                 else 
175                     video_y <= {1b1, 1b0, 1b1, 1b1, 1b1^1b1, 1b0^1b1, 1b0^1b1, 1b0^1b1^1b1, 1b0, 1b0};
176             end 
177             10b000_0100_000:
178                 video_y <= 10h040;
179             10b000_0010_000:
180                 video_y <= 10h3FF;
181             10b000_0001_000:
182                 video_y <= 10h000;    
183             10b000_0000_100:
184                 video_y <= 10h000;
185             10b000_0000_010:
186             begin
187                 sav <= 1b1;
188                 if( v_count >= 42 & v_count <= 1121)
189                     video_y <= {1b1, 1b0, 1b0, 1b0, 1b0^1b0, 1b0^1b0, 1b0^1b0, 1b0^1b0^1b0, 1b0, 1b0};
190                 else 
191                     video_y <= {1b1, 1b0, 1b1, 1b0, 1b1^1b0, 1b0^1b0, 1b0^1b1, 1b0^1b1^1b0, 1b0, 1b0};
192             end 
193             10b000_0000_001:
194                 video_y <= 10h0CD;
195             default:
196                 video_y <= 10h040;
197         endcase 
198     end
199 end
200 
201 //---------------------------------------------------------------------------------------------------------------
202 
203 always @(posedge clk or posedge rest)
204 begin
205     if(rest)
206         video_c <= 10h3FF;
207     else 
208     begin
209 
210         case(condition_a)
211             10b100_0000_000: 
212                 video_c <= 10h3FF;
213             10b010_0000_000:
214                 video_c <= 10h000;
215             10b001_0000_000:
216                 video_c <= 10h000;
217             10b000_1000_000:
218             begin
219                 if( v_count >=42 & v_count <= 1121)
220                     video_c <= {1b1, 1b0, 1b0, 1b1, 1b0^1b1, 1b0^1b1, 1b0^1b0, 1b0^1b0^1b1, 1b0, 1b0};
221                 else 
222                     video_c <= {1b1, 1b0, 1b1, 1b1, 1b1^1b1, 1b0^1b1, 1b0^1b1, 1b0^1b1^1b1, 1b0, 1b0};
223             end 
224             10b000_0100_000:
225                 video_c <= 10h040;
226             10b000_0010_000:
227                 video_c <= 10h3FF;
228             10b000_0001_000:
229                 video_c <= 10h000;    
230             10b000_0000_100:
231                 video_c <= 10h000;
232             10b000_0000_010:
233             begin
234                 if( v_count >= 42 & v_count <= 1121)
235                     video_c <= {1b1, 1b0, 1b0, 1b0, 1b0^1b0, 1b0^1b0, 1b0^1b0, 1b0^1b0^1b0, 1b0, 1b0};
236                 else 
237                     video_c <= {1b1, 1b0, 1b1, 1b0, 1b1^1b0, 1b0^1b0, 1b0^1b1, 1b0^1b1^1b0, 1b0, 1b0};
238             end 
239             10b000_0000_001:
240                 video_c <= 10h0CD;
241             default:
242                 video_c <= 10h040;
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 <= 1b0;
255     else if(h_count == 2199 | ( h_count >= 0 & h_count <= 278 ))
256         h <= 1b0;
257     else 
258         h <= 1b1;
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 <= 1b0;
271     else if(h_count >= 87 & h_count <= 130)
272         sync_h <= 1b1;
273     else 
274         sync_h <= 1b0;
275 end 
276 
277 //---------------------------------------------------------------------------------------------------------------
278 
279 always @(posedge clk or posedge rest)
280 begin
281     if(rest)
282         sync_v <= 1b0;
283     else if(v_count >=1 & v_count < 5)
284         sync_v <= 1b1;
285     else if(v_count == 5 & h_count <=2198)
286         sync_v <= 1b1;
287     else 
288         sync_v <= 1b0;
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 */

仿真结果:

技术分享图片

 

1080P60视频源---verilog

原文:https://www.cnblogs.com/chensimin1990/p/10559021.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!