找回密码
 注册
关于网站域名变更的通知
查看: 327|回复: 1
打印 上一主题 下一主题

关于VGA的问题请教大神,非常感谢! 

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-29 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
请教大神,
% T* c9 C3 ~6 ~- Z: ^) t% w: h1 _$ T% N6 b+ Q! }: J4 z
我根据特权同学的FPGA教程,写了一个VGA的程序。程序下进去后,提示
* y9 N9 ~0 ~6 S5 M输入信号超出范围。我的电脑最低分辨率800*600,程序里是640*480.
+ G4 j7 C% `# |" E! Y然后我改了一下,不超出范围了,却提示节点模式。$ K, s3 }  _- p- r
程序如下:
- d6 r4 e0 |$ o0 h+ _' B- j5 Lmodule VGA(
: t. e$ W" \/ W3 P   clk,rst_n,   //系统控制
3 ]2 n! U8 D9 x. r. V, d, V   hsync,vsync,
7 c, D7 S4 {. }4 v! a4 m" H   vga_r,vga_g,vga_b  //VGA控制 9 W0 I1 y0 R2 i7 o% V: S
   );0 Y. G( n8 \9 T; V8 {
   
) b. X% \" |7 Z* W- Uinput clk;  //50M1 G( o2 M! j4 [( |3 b6 f1 N0 |  H
input rst_n; //低电平复位) d7 G( H- O# g$ i9 y- A
//FPGA与VGA接口信号
; V$ g+ B, m, Joutput hsync;   //行同步信号
* x- F6 {$ o  C" J* a  d/ X! goutput vsync;   //场同步信号
4 F1 b6 l( S6 s: h1 zoutput[2:0] vga_r;
) f3 m, N" w2 Goutput[2:0] vga_g;6 c6 o2 `/ Z: }( ^2 \; M
output[1:0] vga_b;
& \- q' H# _. [; [2 V  K# [6 H, s4 p/ {" H9 z( u: a' t
//坐标计数
; _( H! V. O- I  m0 Lreg[10:0] x_cnt;  //行坐标$ n! i8 Q# _, w0 Q
reg[9:0] y_cnt;  //列坐标
. _' x! o+ W! P+ \  L. a9 j1 r8 p
7 [- A  @, R+ xalways @(posedge clk or negedge rst_n)/ P6 ?9 A1 u; C; r- X
if(!rst_n) x_cnt <= 10'd0;2 o: r; R9 F9 M% ~8 b; u( m) G
else if(x_cnt == 10'd1039) x_cnt <= 10'd0;
- @2 p/ F, w: s  n& Lelse x_cnt <= x_cnt+1'b1;: B  W# @0 ?" a5 c+ e. Q( ~
always @(posedge clk or negedge rst_n)
, L/ |; R; S" qif(!rst_n) y_cnt <= 10'd0;
5 V$ @# r8 n! q& j) n( qelse if(y_cnt == 10'd665) y_cnt <= 10'd0;8 s2 P, j8 D& \
else if(x_cnt == 10'd1039) y_cnt <= y_cnt+1'b1;
2 n7 ^" X- Y) [7 L9 e$ X//VGA场同步,行同步信号
9 H: z$ d% V! ^7 D& {' D) T1 Zreg hsync_r,vsync_r;   //同步信号
  n4 V  h. E4 _/ falways @(posedge clk or negedge rst_n)6 m% n6 v: Q) Y2 w
if(!rst_n) hsync_r <= 1'b1;
) U! q1 o1 C# h4 U( ^: G+ S4 }/ `# lelse if(x_cnt == 10'd0) hsync_r <= 1'b0; //产生hsync信号
2 N/ U. u0 o3 J6 L, z8 ~else if(x_cnt == 10'd120) hsync_r <= 1'b1;: x6 T7 j  C& U
$ f) Q+ I; S* Q4 m
always @(posedge clk or negedge rst_n)2 k! D( d3 m, @$ s. C, D3 z$ T
if(!rst_n) vsync_r <= 1'b1;
- f* p- x8 T( d7 L- Velse if(y_cnt == 10'd0) vsync_r <= 1'b0; //产生vsync信号
$ N3 d, U9 |* D. V( F# Kelse if(y_cnt == 10'd6) vsync_r <= 1'b1;& b2 j. I0 c1 ]* \

' r3 X- k5 Y2 w& F& w9 t0 N; V- }assign hsync =hsync_r;
0 D6 ~; R# }+ c% w$ K* [, S# nassign vsync = vsync_r;. C! p3 }7 B+ y/ t8 l+ e8 R
  //有效显示标志位产生' U# r8 u4 a8 t, @% e3 R
reg valid_yr;  //行显示有效信号( D: _  ^) x3 k
always @(posedge clk or negedge rst_n)
4 b; g5 [+ Q1 d/ Hif(!rst_n) valid_yr <= 1'b0;
1 V$ p2 x/ }7 `2 M! O2 Oelse if(y_cnt == 10'd32) valid_yr <= 1'b1;- q6 y# ~( |. M+ J* _+ E; l2 S0 n
else if(y_cnt == 10'd632) valid_yr <= 1'b0;
3 y' m1 t0 J( y& u% k& Z: ewire valid_y=valid_yr;
$ I! T, y1 M- A8 I( E1 creg valid_r;% O7 N2 [; Y6 C1 v% D+ T
always @(posedge clk or negedge rst_n)
) g+ A! Q' Z! j' l8 Iif(!rst_n) valid_r <= 1'b0;
0 ], p) |8 V" R+ y2 t  y; yelse if((x_cnt == 10'd187) && valid_y) valid_r <= 1'b1;- Y& O* t4 F, d- O
else if((x_cnt == 10'd987) && valid_y) valid_r <= 1'b0;* M7 L; p. g! B

( v" \/ ?) S+ rwire valid=valid_r;; E8 {5 Y# D) _, l
wire[9:0] x_dis;  //横坐标显示有效区域0-6392 D" s' |1 r) U& @2 V; L  L. k
wire[9:0] y_dis;  //纵坐标显示有效区域0-479- }% Z5 c' K2 w" M- d" `; N
assign x_dis = x_cnt - 10'd187;
+ S/ ?% \; m/ v3 z# Iassign y_dis = y_cnt - 10'd33;
6 }( D7 V& Y4 J. F& n//VGA色彩信号产生
3 `1 ]- o  P7 Y/*
8 m# B, L1 C! }. FRGB = 000 黑色     RGB = 100  红色( P; J- w9 N: E' x
  = 001 蓝色         = 101  紫色; M$ o4 U& U5 b
  = 010 绿色         = 110  黄色7 P8 [% ?0 G3 p" z, E
  = 011 青色         = 111  白色
4 W8 c: m; d; R: L, w+ Q  */& S0 f& @, Z. {. n: Y/ F  g3 r9 B
/*! S! O- x' T; m7 U+ c
一共640*480个像素点,需要显示256种颜色;
% Z6 r; u6 M( B/ e- @0 y: p那么每个颜色显示区域为40*30,就正好。
! k1 P; n5 p9 D, c*/8 ^; D, a, s& M( K$ P/ F& t
reg[7:0] vga_rgb;   //VGA色彩显示寄存器9 k1 j% x# r+ J. S" m
always @(posedge clk)
* R/ r3 X6 o, u5 U2 Z4 q7 W$ v0 c2 fif(!valid) vga_rgb <= 8'd0;: |" |. A4 }# c5 T3 j
else begin
. q, S, C, m0 W& g7 t3 m4 z2 b  case(x_dis)2 I7 d8 H, Q2 \2 f- _$ Y1 u
   10'd0: begin  //当x坐标画到0时,让显示色彩数据根据当前的y坐标值重新& Q# m) G; v5 G2 [: [
    if(y_dis >= 10'd0 && y_dis < 10'd30) vga_rgb <= 8'd0;
% [" j3 {( v" M1 \8 r" O& h    else if(y_dis >= 10'd30 && y_dis < 10'd60) vga_rgb <= 8'd16;* u) \7 f5 ~( _9 R+ O# X
    else if(y_dis >= 10'd60 && y_dis < 10'd90) vga_rgb <= 8'd32;$ x' q' G# ^, e# U1 K4 @
    else if(y_dis >= 10'd90 && y_dis < 10'd120) vga_rgb <= 8'd48;) O0 s" o! _' v* c0 C4 D
    else if(y_dis >= 10'd120 && y_dis < 10'd150) vga_rgb <= 8'd64;
: ]" ]2 ?1 Z  k! C    else if(y_dis >= 10'd150 && y_dis < 10'd180) vga_rgb <= 8'd80;
! C$ O  g5 b- \5 K    else if(y_dis >= 10'd180 && y_dis < 10'd210) vga_rgb <= 8'd96;8 b/ B: J3 y! P* l1 g! p
    else if(y_dis >= 10'd210 && y_dis < 10'd240) vga_rgb <= 8'd112;# u# p. Z+ q$ d9 f$ G/ j4 h8 k* s2 [
    else if(y_dis >= 10'd240 && y_dis < 10'd270) vga_rgb <= 8'd128;
: s  I0 S; X7 k8 S" o- M    else if(y_dis >= 10'd270 && y_dis < 10'd300) vga_rgb <= 8'd144;
2 G  F( l9 e8 U" C/ x    else if(y_dis >= 10'd300 && y_dis < 10'd330) vga_rgb <= 8'd160;; F& t4 S6 L2 Z6 Z" G
    else if(y_dis >= 10'd330 && y_dis < 10'd360) vga_rgb <= 8'd176;0 F% `& ~3 l  F3 a
    else if(y_dis >= 10'd360 && y_dis < 10'd390) vga_rgb <= 8'd192;
9 ]6 t( d  D9 h, H: r& ^    else if(y_dis >= 10'd390 && y_dis < 10'd420) vga_rgb <= 8'd208;
; J0 k8 I( ]' p    else if(y_dis >= 10'd420 && y_dis < 10'd450) vga_rgb <= 8'd224;
( h! z- A& F7 n1 D) i# g    else if(y_dis >= 10'd450 && y_dis < 10'd480) vga_rgb <= 8'd240;# [2 {: @) y) |+ P6 Y( A
    else if(y_dis >= 10'd480 && y_dis < 10'd510) vga_rgb <= 8'd256;
: ]* f/ I3 O6 t2 h6 p/ d! o0 \    else if(y_dis >= 10'd510 && y_dis < 10'd540) vga_rgb <= 8'd272;" A: k. E& T% F* Y( B7 }
    else if(y_dis >= 10'd540 && y_dis < 10'd570) vga_rgb <= 8'd288;
. l3 P5 l) @9 t, H! D: M7 b2 N    else vga_rgb <= 8'd304;
' ]+ S: Z  c) P" C: m8 l) v   end
" F/ J$ Q3 S. r4 X! c* s  10'd40,10'd80,10'd120,10'd160,10'd200,10'd240,10'd280,10'd320,10'd360,10'd400,10'd440,10'd480,; k  @8 l* t: A+ V
  10'd520,10'd560,10'd600,10'd640,10'd680,10'd720,10'd760,10'd800: vga_rgb <= vga_rgb + 1'b1;* C' L& i" S$ p& C* q, ]
  default:;- z5 n# o7 p! e
  endcase
/ D, ]# o' Q" b3 _* F$ Iend( Y4 @* M* n. G  e7 V& F6 J9 t9 ^7 J
assign vga_r = vga_rgb[7:5];$ l6 `2 w- t- i4 D: ]  @/ X
assign vga_g = vga_rgb[4:2];
' q3 g# c. a' v7 X6 l6 E5 Dassign vga_b = vga_rgb[1:0];( n+ U" r; d' D( O
endmodule9 D/ K" B2 I2 p9 |/ {
请大神帮忙看看,非常感谢!
# A+ d& h2 W! u% g
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-2 13:39 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表