日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VGA显示正圆

發布時間:2025/3/16 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VGA显示正圆 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  接著上次的隨筆,既然VGA時序已經實現了,那么就顯示點東西看看吧。

  想顯示個圓,但是無從下手,參考了這篇文章:https://user.qzone.qq.com/1241003385/blog/1543804422

  仔細閱讀了這篇文章后才理解所謂顯示圓的算法很簡單,圓的標準方程是(x - a)?2?+ (y - b)?2?= r?2,只要控制顯示范圍滿足圓的方程就可以了。

  當(x-a)2+(y-b)2<=r2區域是圓內,(x-a)2+(y-b)2>=r2的區域就是圓外。

  這里顯示圓的半徑是50個像素點,并且以屏幕正中心為原點所以需要滿足條件:

  distance = (x-a)*(x-a) + (y-b)*(y-b) = (h_cnt-96-48 -320) *(h_cnt-96-48-320) +(v_cnt-2-33 -240) *(v_cnt-2-33 -240);

  其中96,48為行顯示區域以外,320為顯示行的中心,2,33為場顯示區域以外,320為顯示列的正中心。

  如果distance小于r2=(50)2=2500?,說明在圓內,否則在圓外。

  代碼如下:

  

  • module?vga_driver(??
  • ????clk?????????,??
  • ????rst_n???????,??
  • ????vga_hys?????,??
  • ????vga_vys?????,??
  • ????vga_rgb???????
  • );??
  • ??
  • parameter???????DATA_W??=?16;??
  • parameter???????LCD_GREEN?=?16'b00000_111111_00000;??
  • parameter???????LCD_WHITE?=?16'b11111_111111_11111;??
  • ??
  • input?????????clk??????;??
  • input?????????rst_n????;??
  • ??
  • output????????vga_hys????;??
  • output????????vga_vys????;??
  • output?[DATA_W-1:0]??vga_rgb????;??
  • ??
  • reg?????????????vga_hys;??
  • reg?????????????vga_vys;??
  • reg?????[DATA_W-1:0]vga_rgb;??
  • ??
  • reg?????[9:0]???cnt_hys;??
  • reg?????[9:0]???cnt_vys;??
  • reg??????[19:0]?distance;??
  • reg?????????????green_area;??
  • reg?????????????valid_area;??
  • ??
  • wire????????????add_cnt_hys;??
  • wire????????????end_cnt_hys;??
  • wire????????????add_cnt_vys;??
  • wire????????????end_cnt_vys;??
  • wire?????????????????vga_clk;??
  • ??
  • VGA_PLL?U0(??
  • ????.inclk0?(clk),??
  • ????.c0?????(vga_clk)??
  • );??
  • ??
  • ??
  • always?@(posedge?vga_clk?or?negedge?rst_n)begin??
  • ????if(!rst_n)begin??
  • ????????cnt_hys?<=?0;??
  • ????end??
  • ????else?if(add_cnt_hys)begin??
  • ????????if(end_cnt_hys)??
  • ????????????cnt_hys?<=?0;??
  • ????????else??
  • ????????????cnt_hys?<=?cnt_hys?+?1;??
  • ????end??
  • end??
  • ??
  • assign?add_cnt_hys?=?1;?????????
  • assign?end_cnt_hys?=?add_cnt_hys?&&?cnt_hys==?800-1;?????
  • ??
  • always?@(posedge?vga_clk?or?negedge?rst_n)begin??
  • ????if(!rst_n)begin??
  • ????????cnt_vys?<=?0;??
  • ????end??
  • ????else?if(add_cnt_vys)begin??
  • ????????if(end_cnt_vys)??
  • ????????????cnt_vys?<=?0;??
  • ????????else??
  • ????????????cnt_vys?<=?cnt_vys?+?1;??
  • ????end??
  • end??
  • ??
  • assign?add_cnt_vys?=?end_cnt_hys;?????????
  • assign?end_cnt_vys?=?add_cnt_vys?&&?cnt_vys==525-1?;?????
  • ??
  • always??@(posedge?vga_clk?or?negedge?rst_n)begin??
  • ????if(rst_n==1'b0)begin??
  • ????????vga_hys?<=?0;??
  • ????end??
  • ????else?if(add_cnt_hys?&&?cnt_hys?==?96-1)begin??
  • ????????vga_hys?<=?1;??
  • ????end??
  • ????else?if(end_cnt_hys)begin??
  • ????????vga_hys?<=?0;??
  • ????end??
  • end??
  • ??
  • always??@(posedge?vga_clk?or?negedge?rst_n)begin??
  • ????if(rst_n==1'b0)begin??
  • ????????vga_vys?<=?0;??
  • ????end??
  • ????else?if(add_cnt_vys?&&?cnt_vys?==?2-1)begin??
  • ????????vga_vys?<=?1;??
  • ????end??
  • ????else?if(end_cnt_vys)begin??
  • ????????vga_vys?<=?0;??
  • ????end??
  • end??
  • ??
  • always??@(*)begin??
  • ????distance?=?((cnt_hys-96-48-320)*(cnt_hys-96-48-320))+((cnt_vys-2-33-240)*(cnt_vys-2-33-240));??
  • end??
  • ??
  • always??@(*)begin??
  • ????green_area?=?distance?<?2500;??
  • end??
  • ??
  • always??@(*)begin??
  • ????valid_area?=?cnt_hys?>=?(96+48)&&cnt_hys?<(96+48+640)?&&?cnt_vys?>=?(2+33)&&cnt_vys<(2+33+480);??
  • end??
  • ??
  • always??@(posedge?vga_clk?or?negedge?rst_n)begin??
  • ????if(rst_n==1'b0)begin??
  • ????????vga_rgb?<=?16'h0;??
  • ????end??
  • ????else?if(valid_area)??
  • ????????begin??
  • ????????????if(green_area)??
  • ????????????????begin??
  • ????????????????????vga_rgb?<=?LCD_GREEN;??
  • ????????????????end??
  • ????????????else?begin??
  • ????????????????????vga_rgb?<=?LCD_WHITE;??
  • ????????????????end??
  • ????????end??
  • ????else?begin??
  • ????????????vga_rgb?<=?0;??
  • ????????end??
  • end??
  • ??
  • endmodule
  • 顯示效果如下圖
  • ?

  • 中間調試的過程中出現過錯誤,錯誤的顯示效果是:
  • ?

  • 經過排查發現問題出在distance定義的長度上,給distance賦值比自身長度大的數據,導致數據丟失就會產生這樣的結果,同樣的修改distance的長度反而有意外收獲。
  • ?

  • ?

  • ?

  • 轉載于:https://www.cnblogs.com/Librarian/p/10091944.html

    總結

    以上是生活随笔為你收集整理的VGA显示正圆的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。