基于vivado利用VGA显示的FPGA五子棋游戏

基于FPGA开发板xc7a35tcsg324-1来实现,板子如图所示:

所使用的软件为vivado 2019.2,外接设备为VGA显示屏,最后效果如下:

基本功能有:1、判断棋子双方胜负

                      2、通过flag变换切换棋子颜色

                      3、若红方胜利,则VGA显示为“R WIN”;若绿方胜利,则显示“G WIN”

实现代码如下:

  1. module wuziqi(input clk,//系统时钟100MHz
  2.                input [4:0]yidong,//上下左右移动及落子按键
  3.                input [0:0]flag,   //玩家标志,玩家1,2轮流落子需要切换flag
  4.                output[11:0]disp_rgb,//数据输出
  5.                output wire hsync, //行同步信号
  6.                output wire vsync //场同步信号
  7.                );
  8. reg[11:0]    hcount;        //行信号
  9. reg[11:0]    vcount;        //列信号
  10. reg[11:0]    data;          //最终颜色信息
  11. reg[11:0]    h_data;          //12位的色素显示变量
  12. reg[11:0]    z1_data;         //红棋胜利界面信息
  13. reg[11:0]    z2_data;        //绿棋胜利界面信息
  14. reg[11:0]    y_data;        //颜色信息
  15. reg[11:0]    v_data;
  16. reg[11:0]    x_data;
  17. reg[1:0]      over1=0;       //红旗胜利标志,高有效
  18. reg[1:0]      over2=0;        //绿旗胜利标志,高有效
  19. wire        hcount_ov;
  20. wire        vcount_ov;
  21. wire        data_act;
  22. reg         vga_clk=0;    //VGA时钟
  23. reg         clk_50ms=0;
  24. reg         cnt_clk=0;
  25. localparam DVSR=7000000;     //分频计数的阈值
  26.  reg [28:0] js;                //分频信号的中间计数变量
  27. reg [9:0] R [9:0];            //落子标志
  28. reg [99:0] U;                //存储棋子由玩家1/2落下的信息
  29. reg[9:0]xsync,ysync;
  30. wire [11:0]x_pos, y_pos;
  31. wire [9:0]a;                    
  32. wire [9:0]b;
  33.  //表示每个格子在100个格子的位置
  34. wire [9:0]c;
  35. wire [9:0]d;
  36. wire [99:0] x;
  37. reg [9:0] ball_y_pos = 10'd90 ;
  38. reg [9:0] ball_x_pos = 10'd240 ;
  39. assign         a=(hcount-220)/40;
  40. assign         b=(vcount-70)/40;
  41.  //计算每个格子在100个格子的位置
  42. assign         c=(ball_x_pos-240)/40;
  43. assign         d=(ball_y_pos-90)/40;
  44. /VGA行,场扫描时序参数表/
  45. parameter 
  46. hsync_end = 10'd95,
  47. hdata_begin = 10'd143,
  48. hdata_end   = 10'd783,
  49. hpixel_end = 10'd799,
  50. vsync_end  = 10'd1,
  51. vdata_begin = 10'd34,
  52. vdata_end   = 10'd514,
  53. vline_end  = 10'd524; 
  54. parameter ball_r=20;
  55. //VGA时钟25MHz///
  56. always@(posedge clk)
  57. begin
  58.      if(cnt_clk == 1)
  59.        begin
  60.           vga_clk <= ~vga_clk;
  61.           cnt_clk <= 0;
  62.        end
  63.       else
  64.           cnt_clk <= cnt_clk + 1;
  65. end             
  66. /VGA驱动模块/
  67. //行扫描
  68. always@(posedge vga_clk)
  69. begin
  70.      if(hcount_ov)
  71.         hcount <= 10'd0;
  72.      else
  73.         hcount <= hcount + 10'd1;
  74. end
  75. assign hcount_ov = (hcount == hpixel_end);
  76. //场扫描
  77. always@(posedge vga_clk)
  78. begin
  79.      if(hcount_ov)
  80.      begin
  81.         if(vcount_ov)
  82.            vcount <= 10'd0;
  83.         else
  84.            vcount <= vcount + 10'd1;
  85.      end
  86. end
  87. assign vcount_ov = (vcount == vline_end);
  88. /数据、同步信号输入/
  89. assign data_act = ((hcount >= hdata_begin) && (hcount < hdata_end)) && ((vcount > vdata_begin) && (vcount<vdata_end));
  90. assign hsync   = (hcount > hsync_end);                    
  91. assign vsync   = (vcount > vsync_end);
  92. assign disp_rgb = (data_act)?data:3'h000;         
  93. ///显示模块///
  94. always@(posedge vga_clk)
  95. begin
  96.    if(over1==0&&over2==0)
  97.     data <=v_data&h_data&x_data&y_data;    //落子界面信息载入
  98.     else if(over1==1)                 //红色胜利界面信息载入
  99.     data <=z1_data;                
  100.     else if(over2==1)                 //绿色胜利界面信息载入
  101.     data <=z2_data; 
  102.    
  103. end
  104. 显示区域///
  105.  parameter  WIDTH = 40, //矩形长
  106.             HEIGHT = 40,  //矩形宽         
  107.             
  108.           //显示区域的边界  
  109.             DISV_TOP = 10'd470,  
  110.             DISV_DOWN =10'd70,  
  111.             DISH_LEFT = 10'd220, 
  112.             DISH_RIGHT = 10'd620;               
  113.                   
  114.               //变色区域(棋格) 右边界=左边界+格子宽度                   
  115.             reg [9:0] rightbound = DISH_LEFT + WIDTH ;     
  116.        
  117. /对100MHz的系统时钟进行分频
  118. always @ (posedge clk)                    
  119. begin
  120.          if(js==DVSR)
  121.           begin
  122.            js<=0;
  123.            clk_50ms=~clk_50ms;
  124.           end
  125.         else
  126.            begin
  127.            js<=js+1;
  128.            end 
  129. end
  130. /棋子移动模块///
  131. //上下左右按键控制棋子移动,改变棋子边界坐标
  132. //确认按键落子
  133. always@(posedge clk_50ms)
  134. begin
  135.     case(yidong[4:0])
  136.          5'b00100:begin 
  137.                                           if (ball_x_pos== 10'd240)
  138.                                                  ball_x_pos<=10'd600;
  139.                                              else 
  140.                                                 ball_x_pos<=ball_x_pos-10'd40;
  141.                     end
  142.          5'b01000:begin 
  143.                                           if (ball_x_pos==10'd600)
  144.                                                 ball_x_pos<=10'd240;
  145.                                              else 
  146.                                                  ball_x_pos<= ball_x_pos+10'd40;
  147.                                          end 
  148.         5'b00001: begin 
  149.                                            if (ball_y_pos== 10'd90)
  150.                                                ball_y_pos<=10'd450;
  151.                                            else 
  152.                                                 ball_y_pos<=ball_y_pos-10'd40;                                                
  153.                                                  end
  154.        5'b00010: begin
  155.                                            if(ball_y_pos== 10'd450)
  156.                                            ball_y_pos<=10'd90;
  157.                                            else         
  158.                                            ball_y_pos<=ball_y_pos+10'd40; 
  159.                                            end      
  160.        5'b10000: begin//按下确认落子
  161.                                           if(R[d][c]==0)
  162.                                           begin
  163.                                              R[d][c]<=1;        //落子标志,高有效                             
  164.                                              U[d*10+c]<=flag[0];//存储棋子由玩家1/2落下的信息
  165.                                           end
  166.                                            end     
  167.          default: rightbound<=10'd220;
  168.      endcase
  169. end
  170. /划分一百个格子/
  171. assign x[0] = ((hcount - 240)*(hcount - 240)+(vcount - 90)*(vcount - 90))<=400;
  172. assign x[1] =((hcount - 280)*(hcount - 280)+(vcount - 90)*(vcount - 90))<=400;
  173. assign x[2] =( (hcount - 320)*(hcount - 320)+(vcount - 90)*(vcount - 90))<=400;
  174. assign x[3] = ((hcount - 360)*(hcount - 360)+(vcount - 90)*(vcount - 90))<=400;
  175. assign x[4] =( (hcount - 400)*(hcount - 400)+(vcount - 90)*(vcount - 90))<=400;
  176. assign x[5] = ((hcount - 440)*(hcount - 440)+(vcount - 90)*(vcount - 90))<=400;
  177. assign x[6] = ((hcount - 480)*(hcount - 480)+(vcount - 90)*(vcount - 90))<=400;
  178. assign x[7] = ((hcount - 520)*(hcount - 520)+(vcount - 90)*(vcount - 90))<=400;
  179. assign x[8] =( (hcount - 560)*(hcount - 560)+(vcount - 90)*(vcount - 90))<=400;
  180. assign x[9] = ((hcount - 600)*(hcount - 600)+(vcount - 90)*(vcount - 90))<=400;
  181. assign x[10] = (hcount - 240)*(hcount - 240)+(vcount - 130)*(vcount - 130)<=400;
  182. assign x[11] =  (hcount - 280)*(hcount - 280)+(vcount - 130)*(vcount - 130)<=400;
  183. assign x[12] = (hcount - 320)*(hcount - 320)+(vcount - 130)*(vcount - 130)<=400;
  184. assign x[13] =  (hcount - 360)*(hcount -360)+(vcount - 130)*(vcount - 130)<=400;
  185. assign x[14] =  (hcount - 400)*(hcount - 400)+(vcount - 130)*(vcount - 130)<=400;
  186. assign x[15] =  (hcount - 440)*(hcount - 440)+(vcount - 130)*(vcount - 130)<=400;
  187. assign x[16] =  (hcount - 480)*(hcount -480)+(vcount - 130)*(vcount - 130)<=400;
  188. assign x[17] =  (hcount -520)*(hcount - 520)+(vcount - 130)*(vcount - 130)<=400;
  189. assign x[18] =  (hcount - 560)*(hcount - 560)+(vcount - 130)*(vcount - 130)<=400;
  190. assign x[19] = (hcount - 600)*(hcount - 600)+(vcount - 130)*(vcount - 130)<=400;
  191. assign x[20] = (hcount - 240)*(hcount - 240)+(vcount -170)*(vcount - 170)<=400;
  192. assign x[21] = (hcount - 280)*(hcount - 280)+(vcount -170)*(vcount - 170)<=400;
  193. assign x[22] = (hcount -320)*(hcount - 320)+(vcount -170)*(vcount - 170)<=400;
  194. assign x[23] = (hcount -360)*(hcount - 360)+(vcount -170)*(vcount - 170)<=400;
  195. assign x[24] =(hcount -400)*(hcount - 400)+(vcount -170)*(vcount - 170)<=400;
  196. assign x[25] =(hcount - 440)*(hcount - 440)+(vcount -170)*(vcount - 170)<=400;
  197. assign x[26] = (hcount - 480)*(hcount - 480)+(vcount -170)*(vcount - 170)<=400;
  198. assign x[27] = (hcount - 520)*(hcount - 520)+(vcount -170)*(vcount - 170)<=400;
  199. assign x[28] =(hcount - 560)*(hcount -560)+(vcount -170)*(vcount - 170)<=400;
  200. assign x[29] =(hcount - 600)*(hcount - 600)+(vcount -170)*(vcount - 170)<=400;
  201. assign x[30] = (hcount - 240)*(hcount - 240)+(vcount - 210)*(vcount - 210)<=400;
  202. assign x[31] =(hcount - 280)*(hcount - 280)+(vcount - 210)*(vcount - 210)<=400;
  203. assign x[32] =(hcount - 320)*(hcount - 320)+(vcount - 210)*(vcount - 210)<=400;
  204. assign x[33] = (hcount - 360)*(hcount - 360)+(vcount - 210)*(vcount - 210)<=400;
  205. assign x[34] =(hcount - 400)*(hcount - 400)+(vcount - 210)*(vcount - 210)<=400;
  206. assign x[35] = (hcount - 440)*(hcount - 440)+(vcount - 210)*(vcount - 210)<=400;
  207. assign x[36] = (hcount - 480)*(hcount -480)+(vcount - 210)*(vcount - 210)<=400;
  208. assign x[37] = (hcount - 520)*(hcount - 520)+(vcount - 210)*(vcount - 210)<=400;
  209. assign x[38] =(hcount - 560)*(hcount - 560)+(vcount - 210)*(vcount - 210)<=400;
  210. assign x[39] =(hcount - 600)*(hcount - 600)+(vcount - 210)*(vcount - 210)<=400;
  211. assign x[40] = (hcount - 240)*(hcount - 240)+(vcount - 250)*(vcount - 250)<=400;
  212. assign x[41] = (hcount - 280)*(hcount - 280)+(vcount - 250)*(vcount - 250)<=400;
  213. assign x[42] =  (hcount - 320)*(hcount - 320)+(vcount - 250)*(vcount - 250)<=400;
  214. assign x[43] =  (hcount - 360)*(hcount - 360)+(vcount - 250)*(vcount - 250)<=400;
  215. assign x[44] =  (hcount - 400)*(hcount - 400)+(vcount - 250)*(vcount - 250)<=400;
  216. assign x[45] =  (hcount - 440)*(hcount - 440)+(vcount - 250)*(vcount - 250)<=400;
  217. assign x[46] =  (hcount - 480)*(hcount -480)+(vcount - 250)*(vcount - 250)<=400;
  218. assign x[47] =  (hcount - 520)*(hcount - 520)+(vcount - 250)*(vcount - 250)<=400;
  219. assign x[48] = (hcount - 560)*(hcount -560)+(vcount - 250)*(vcount - 250)<=400;
  220. assign x[49] =  (hcount - 600)*(hcount -600)+(vcount - 250)*(vcount - 250)<=400;
  221. assign x[50] = (hcount - 240)*(hcount - 240)+(vcount - 290)*(vcount - 290)<=400;
  222. assign x[51] =  (hcount - 280)*(hcount - 280)+(vcount - 290)*(vcount - 290)<=400;
  223. assign x[52] =  (hcount - 320)*(hcount - 320)+(vcount - 290)*(vcount - 290)<=400;
  224. assign x[53] =  (hcount - 360)*(hcount - 360)+(vcount - 290)*(vcount - 290)<=400;
  225. assign x[54] =  (hcount - 400)*(hcount -400)+(vcount - 290)*(vcount - 290)<=400;
  226. assign x[55] =  (hcount - 440)*(hcount - 440)+(vcount - 290)*(vcount - 290)<=400;
  227. assign x[56] =  (hcount -480)*(hcount - 480)+(vcount - 290)*(vcount - 290)<=400;
  228. assign x[57] = (hcount - 520)*(hcount - 520)+(vcount - 290)*(vcount - 290)<=400;
  229. assign x[58] =  (hcount - 560)*(hcount - 560)+(vcount - 290)*(vcount - 290)<=400;
  230. assign x[59] =  (hcount - 600)*(hcount - 600)+(vcount - 290)*(vcount - 290)<=400;
  231. assign x[60] = (hcount - 240)*(hcount - 240)+(vcount -330)*(vcount - 330)<=400;
  232. assign x[61] = (hcount - 280)*(hcount - 280)+(vcount -330)*(vcount - 330)<=400;
  233. assign x[62] = (hcount -320)*(hcount - 320)+(vcount -330)*(vcount - 330)<=400;
  234. assign x[63] = (hcount - 360)*(hcount - 360)+(vcount -330)*(vcount - 330)<=400;
  235. assign x[64] = (hcount - 400)*(hcount - 400)+(vcount -330)*(vcount - 330)<=400;
  236. assign x[65] =(hcount - 440)*(hcount - 440)+(vcount -330)*(vcount - 330)<=400;
  237. assign x[66] = (hcount - 480)*(hcount - 480)+(vcount -330)*(vcount - 330)<=400;
  238. assign x[67] =(hcount - 520)*(hcount -520)+(vcount -330)*(vcount - 330)<=400;
  239. assign x[68] = (hcount -560)*(hcount - 560)+(vcount -330)*(vcount - 330)<=400;
  240. assign x[69] =(hcount - 600)*(hcount - 600)+(vcount -330)*(vcount - 330)<=400;
  241. assign x[70] = (hcount - 240)*(hcount - 240)+(vcount - 370)*(vcount - 370)<=400;
  242. assign x[71] = (hcount - 280)*(hcount - 280)+(vcount - 370)*(vcount - 370)<=400;
  243. assign x[72] =(hcount - 320)*(hcount - 320)+(vcount - 370)*(vcount - 370)<=400;
  244. assign x[73] =(hcount -360)*(hcount - 360)+(vcount - 370)*(vcount - 370)<=400;
  245. assign x[74] = (hcount - 400)*(hcount - 400)+(vcount - 370)*(vcount - 370)<=400;
  246. assign x[75] =(hcount - 440)*(hcount - 440)+(vcount - 370)*(vcount - 370)<=400;
  247. assign x[76] = (hcount - 480)*(hcount - 480)+(vcount - 370)*(vcount - 370)<=400;
  248. assign x[77] =(hcount - 520)*(hcount - 520)+(vcount - 370)*(vcount - 370)<=400;
  249. assign x[78] =(hcount - 560)*(hcount -560)+(vcount - 370)*(vcount - 370)<=400;
  250. assign x[79] = (hcount - 600)*(hcount - 600)+(vcount - 370)*(vcount - 370)<=400;
  251. assign x[80] = (hcount - 240)*(hcount - 240)+(vcount - 410)*(vcount -410)<=400;
  252. assign x[81] = (hcount - 280)*(hcount - 280)+(vcount - 410)*(vcount -410)<=400;
  253. assign x[82] = (hcount - 320)*(hcount - 320)+(vcount - 410)*(vcount -410)<=400;
  254. assign x[83] = (hcount - 360)*(hcount - 360)+(vcount - 410)*(vcount -410)<=400;
  255. assign x[84] =(hcount - 400)*(hcount - 400)+(vcount - 410)*(vcount -410)<=400;
  256. assign x[85] = (hcount - 440)*(hcount - 440)+(vcount - 410)*(vcount -410)<=400;
  257. assign x[86] = (hcount - 480)*(hcount - 480)+(vcount - 410)*(vcount -410)<=400;
  258. assign x[87] =(hcount - 520)*(hcount - 520)+(vcount - 410)*(vcount -410)<=400;
  259. assign x[88] = (hcount - 560)*(hcount - 560)+(vcount - 410)*(vcount -410)<=400;
  260. assign x[89] = (hcount - 600)*(hcount - 600)+(vcount - 410)*(vcount -410)<=400;
  261. assign x[90] = (hcount - 240)*(hcount - 240)+(vcount - 450)*(vcount - 450)<=400;
  262. assign x[91] = (hcount - 280)*(hcount - 280)+(vcount - 450)*(vcount -450)<=400;
  263. assign x[92] = (hcount - 320)*(hcount -320)+(vcount -450)*(vcount - 450)<=400;
  264. assign x[93] = (hcount - 360)*(hcount - 360)+(vcount - 450)*(vcount - 450)<=400;
  265. assign x[94] = (hcount - 400)*(hcount - 400)+(vcount - 450)*(vcount - 450)<=400;
  266. assign x[95] = (hcount - 440)*(hcount - 440)+(vcount -450)*(vcount - 450)<=400;
  267. assign x[96] = (hcount - 480)*(hcount - 480)+(vcount - 450)*(vcount - 450)<=400;
  268. assign x[97] = (hcount - 520)*(hcount - 520)+(vcount -450)*(vcount - 450)<=400;
  269. assign x[98] = (hcount - 560)*(hcount - 560)+(vcount -450)*(vcount -450)<=400;
  270. assign x[99] = (hcount - 600)*(hcount - 600)+(vcount - 450)*(vcount - 450)<=400;
  271. 棋子上色模块
  272. always@(posedge vga_clk)
  273. begin
  274.       if ( (hcount - ball_x_pos)*(hcount - ball_x_pos) + (vcount- ball_y_pos)*(vcount - ball_y_pos) <= (ball_r * ball_r)) 
  275.         x_data<= 12'h0ff;        //移动:蓝色
  276.     else if (x[b*10+a]&&R[b][a]&&U[b*10+a])//玩家1落子
  277.     begin
  278.            x_data<= 12'hfff;
  279.            y_data <= 12'hf00;//落子:红棋
  280.            end
  281.     else if (x[b*10+a]&&R[b][a])//玩家2落子
  282.     begin
  283.            x_data<= 12'hfff;
  284.            y_data <= 12'h0f0;//落子:绿棋
  285.            end       
  286.      else 
  287.      begin//没有落子:白色
  288.                 x_data<= 12'hfff;
  289.                y_data <= 12'hfff;         
  290.            end    
  291. end
  292. /棋盘上色和划分模块
  293. //产生竖长条
  294. always@(posedge vga_clk)
  295. begin
  296.     if(hcount<=200||hcount>=640)
  297.     v_data <= 12'h000;//黑色无效区域
  298.     else if(hcount ==240||hcount ==280||hcount ==320||hcount ==360||hcount ==400||hcount ==440||hcount ==480||hcount ==520||hcount==560||hcount==600)
  299.       v_data <= 12'h000;//黑线
  300.    else 
  301.      v_data <= 12'hfff;//白色背景
  302. end
  303. //产生横长条
  304. always@(posedge vga_clk)
  305. begin
  306.     if(vcount<=50||vcount>=490)
  307.     h_data <= 12'h000;//黑色无效区域
  308.     else if(vcount ==90||vcount ==130||vcount ==170||vcount==210 ||vcount==250||vcount ==290||vcount ==330||vcount==370 ||vcount==410||vcount==450)
  309.       h_data <= 12'h000;//黑线
  310.    else
  311.      h_data <= 12'hfff;//白色背景
  312. end  
  313. //输赢状态判断///
  314. always@(posedge vga_clk)//红胜
  315. begin
  316.     if(b<=5&&U[b*10+a]==1&&U[b*10+a+1]==1&&U[b*10+a+2]==1&&U[b*10+a+3]==1&&U[b*10+a+4]==1)//横着五个
  317.     over1=1;
  318.     else if(a<=5&&U[b*10+a]==1&&U[b*10+a+10]==1&&U[b*10+a+20]==1&&U[b*10+a+30]==1&&U[b*10+a+40]==1)//竖着五个
  319.     over1=1;
  320.     else if(a<=5&&b<=5&&U[b*10+a]==1&&U[b*10+a+11]==1&&U[b*10+a+22]==1&&U[b*10+a+33]==1&&U[b*10+a+44]==1)//斜着五个
  321.     over1=1;
  322.     else if(b<=5&&a>=4&&U[b*10+a]==1&&U[b*10+a+9]==1&&U[b*10+a+18]==1&&U[b*10+a+27]==1&&U[b*10+a+36]==1)//斜着五个
  323.     over1=1;
  324. end    
  325.     
  326. always@(posedge vga_clk)//绿胜
  327. begin
  328.     if(b<=5&&U[b*10+a]==0&&U[b*10+a+1]==0&&U[b*10+a+2]==0&&U[b*10+a+3]==0&&U[b*10+a+4]==0&&R[b][a]==1&&R[b][a+1]==1&&R[b][a+2]==1&&R[b][a+3]==1&&R[b][a+4]==1)//横着五个
  329.     over2=1;
  330.     else if(a<=5&&U[b*10+a]==0&&U[b*10+a+10]==0&&U[b*10+a+20]==0&&U[b*10+a+30]==0&&U[b*10+a+40]==0&&R[b][a]==1&&R[b+1][a]==1&&R[b+2][a]==1&&R[b+3][a]==1&&R[b+4][a]==1)//竖着五个
  331.     over2=1;
  332.     else if(a<=5&&b<=5&&U[b*10+a]==0&&U[b*10+a+11]==0&&U[b*10+a+22]==0&&U[b*10+a+33]==0&&U[b*10+a+44]==0&&R[b][a]==1&&R[b+1][a+1]==1&&R[b+2][a+2]==1&&R[b+3][a+3]==1&&R[b+4][a+4]==1)//斜着五个
  333.     over2=1;
  334.     else if(b<=5&&a>=4&&U[b*10+a]==0&&U[b*10+a+9]==0&&U[b*10+a+18]==0&&U[b*10+a+27]==0&&U[b*10+a+36]==0&&R[b][a]==1&&R[b+1][a-1]==1&&R[b+2][a-2]==1&&R[b+3][a-3]==1&&R[b+4][a-4]==1)//斜着五个
  335.     over2=1;
  336. end 
  337. 胜利界面/
  338. always@(posedge vga_clk)//红胜: 红色  R WIN
  339. begin
  340.     if(((hcount>=220&&hcount<=240)||(hcount>=280&&hcount<=300)  ||(hcount>=320&&hcount<=340)||(hcount>=380&&hcount<=400)||(hcount>=440&&hcount<=460)||(hcount>=500&&hcount<=520)||(hcount>=560&&hcount<=580)||(hcount>=640&&hcount<=660))&&(vcount >=200&&vcount <=360))
  341.     z1_data <= 12'hf00;
  342.     else if(hcount>=340&&hcount<=460&&vcount>=340&&vcount <=360)//w
  343.       z1_data <= 12'hf00;
  344.       else if(hcount>=580&&hcount<=640&&vcount>=200&&vcount <=220)//n
  345.       z1_data <= 12'hf00;
  346.       else if(hcount>=220&&hcount<=290&&vcount>=280&&vcount <=300)//R
  347.       z1_data <= 12'hf00;
  348.       else if(hcount>=220&&hcount<=290&&vcount>=200&&vcount <=220)//R
  349.       z1_data <= 12'hf00;
  350.    else
  351.      z1_data <= 12'hfff;
  352. end  
  353. always@(posedge vga_clk)//绿胜:绿色  G WIN
  354. begin
  355.     if(((hcount>=220&&hcount<=240)||(hcount>=320&&hcount<=340)||(hcount>=380&&hcount<=400)||(hcount>=440&&hcount<=460)||(hcount>=500&&hcount<=520)||(hcount>=560&&hcount<=580)||(hcount>=640&&hcount<=660))&&(vcount >=200&&vcount <=360))
  356.     z2_data <= 12'h0f0;
  357.     else if((hcount>=280&&hcount<=300)&&(vcount >=280&&vcount <=360))//G右短竖
  358.     z2_data <= 12'h0f0;
  359.     else if(hcount>=340&&hcount<=460&&vcount>=340&&vcount <=360)//w
  360.       z2_data <= 12'h0f0;
  361.       else if(hcount>=580&&hcount<=640&&vcount>=200&&vcount <=220)//n
  362.       z2_data <= 12'h0f0;
  363.       else if(hcount>=220&&hcount<=300&&vcount>=200&&vcount <=220)//G 上横
  364.       z2_data <= 12'h0f0;
  365.       else if(hcount>=220&&hcount<=300&&vcount>=340&&vcount <=360)//G 下横
  366.       z2_data <= 12'h0f0;
  367.       else if(hcount>=260&&hcount<=300&&vcount>=280&&vcount <=300)//G 中短横
  368.       z2_data <= 12'h0f0;
  369.       
  370.    else
  371.      z2_data <= 12'hfff;
  372. end   
  373.                                                                  
  374. endmodule

代码整体稍微有点长,读者可将其进行例化调用,分成几个小模块,看起来会更加整洁

仔细过程请看:

https://blog.csdn.net/m0_56846436/article/details/118532504

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱电子的央铭丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值