• 【FPGA的小娱乐】在tft显示屏上画X型


    前言

    我的最终目的还是想在FPGA上做一个小游戏,具体做啥还没想好但是需要一些基本的素材,所以先在屏幕上画一个X出来再说,就像下面这个图:

    制作

    有一个基础的tft模块已经在 【FPGA的小娱乐】tft显示屏生成信号辅助测试阵列 里说明过了,就是提供chan_in作为输入接口的tft_ctrl模块,基于这个模块的接口可以很简单的做出来画矩形的模块:

    1. module square_gen(
    2. input [10-1:0]x_point,
    3. input [10-1:0]y_point,
    4. input [10-1:0]x_size,
    5. input [10-1:0]y_size,
    6. input [8 -1:0]r,
    7. input [8 -1:0]g,
    8. input [8 -1:0]b,
    9. input [10-1:0]hcount,
    10. input [10-1:0]vcount,
    11. input power_en,
    12. output chan_en,
    13. output[24-1:0]chan_data
    14. );
    15. wire [10-1:0]x_left = x_point;
    16. wire [10-1:0]x_right = (x_point + x_size >= 11'd480) ? 10'd480 : x_point + x_size;
    17. wire [10-1:0]y_top = y_point;
    18. wire [10-1:0]y_bottom = (y_point + y_size >= 11'd272) ? 10'd272 : y_point + y_size;
    19. assign chan_en = power_en && (hcount >= x_left) && (hcount < x_right) && (vcount >= y_top) && (vcount < y_bottom);
    20. assign chan_data = {r,g,b};
    21. endmodule

     那么进一步,画正正当当的直角等腰三角形也很简单:

    1. module triangle_gen(
    2. input [10-1:0]x_point,
    3. input [10-1:0]y_point,
    4. input [10-1:0]size,
    5. input [8 -1:0]r,
    6. input [8 -1:0]g,
    7. input [8 -1:0]b,
    8. input [10-1:0]hcount,
    9. input [10-1:0]vcount,
    10. input power_en,
    11. input [3:0] mode,
    12. output chan_en,
    13. output[24-1:0]chan_data
    14. );
    15. wire [10-1:0]p0_x_point;
    16. wire [10-1:0]p0_y_point;
    17. wire [10-1:0]p1_x_point;
    18. wire [10-1:0]p2_y_point;
    19. assign mode0_power = (x_point - hcount < size) && (y_point - vcount < size) && (x_point - hcount + y_point - vcount < size);
    20. assign mode1_power = (hcount - x_point < size) && (y_point - vcount < size) && (hcount - x_point + y_point - vcount < size);
    21. assign mode2_power = (x_point - hcount < size) && (vcount - y_point < size) && (x_point - hcount + vcount - y_point < size);
    22. assign mode3_power = (hcount - x_point < size) && (vcount - y_point < size) && (hcount - x_point + vcount - y_point < size);
    23. assign chan_en = power_en &&
    24. ((mode[0] & mode0_power) |
    25. (mode[1] & mode1_power) |
    26. (mode[2] & mode2_power) |
    27. (mode[3] & mode3_power));
    28. assign chan_data = {r,g,b};
    29. endmodule

    对四个三角形做任意的例化,很容易就能画出例如下面这样的三角形元素图:

    两个基本图形有了之后,X就很容易画了,第一种方式是一个正方形减去四个8个小三角形X,另一种方式就是先画\ /两种线,再合成一个X。我是用的第二种,那么就开始画/,这个的方式也很容易,一个正方形减去左上和右下两个直角等腰三角形;\对应的则是一个正方形减去左下和右上两个直角等腰三角形,两种斜线合成一个模块,代码的核心其实就是assign chan_en = squ_chan_en && ~tri0_chan_en && ~tri1_chan_en:

    1. module slash_gen(
    2. input [10-1:0]x_point,
    3. input [10-1:0]y_point,
    4. input [10-1:0]size,
    5. input [10-1:0]sub_size,
    6. input [8 -1:0]r,
    7. input [8 -1:0]g,
    8. input [8 -1:0]b,
    9. input [10-1:0]hcount,
    10. input [10-1:0]vcount,
    11. input power_en,
    12. input mode,
    13. output chan_en,
    14. output[24-1:0]chan_data
    15. );
    16. wire squ_chan_en;
    17. square_gen u_squ(
    18. .x_point (x_point),
    19. .y_point (y_point),
    20. .x_size (size),
    21. .y_size (size),
    22. .r (r),
    23. .g (g),
    24. .b (b),
    25. .hcount (hcount),
    26. .vcount (vcount),
    27. .power_en (power_en),
    28. .chan_en (squ_chan_en),
    29. .chan_data ()
    30. );
    31. wire tri0_chan_en;
    32. wire [4-1:0] tri0_mode = mode ? 4'b0010 : 4'b1000;
    33. wire [10-1:0]tri0_x_point = x_point;
    34. wire [10-1:0]tri0_y_point = mode ? y_point + size : y_point;
    35. triangle_gen u_tri0(
    36. .x_point (tri0_x_point),
    37. .y_point (tri0_y_point),
    38. .size (size-sub_size),
    39. .r (r),
    40. .g (g),
    41. .b (b),
    42. .hcount (hcount),
    43. .vcount (vcount),
    44. .power_en (power_en),
    45. .mode (tri0_mode),
    46. .chan_en (tri0_chan_en),
    47. .chan_data ()
    48. );
    49. wire tri1_chan_en;
    50. wire [4-1:0] tri1_mode = mode ? 4'b0100 : 4'b0001;
    51. wire [10-1:0]tri1_x_point = x_point+size;
    52. wire [10-1:0]tri1_y_point = mode ? y_point : y_point+size;
    53. triangle_gen u_tri1(
    54. .x_point (tri1_x_point),
    55. .y_point (tri1_y_point),
    56. .size (size-sub_size),
    57. .r (r),
    58. .g (g),
    59. .b (b),
    60. .hcount (hcount),
    61. .vcount (vcount),
    62. .power_en (power_en),
    63. .mode (tri1_mode),
    64. .chan_en (tri1_chan_en),
    65. .chan_data ()
    66. );
    67. assign chan_en = power_en && (squ_chan_en && ~tri0_chan_en && ~tri1_chan_en);
    68. assign chan_data = {r,g,b};
    69. endmodule

    然后再例化两个斜线,对应的X就出来了:

    1. module x_gen(
    2. input [10-1:0]x_point,
    3. input [10-1:0]y_point,
    4. input [10-1:0]size,
    5. input [10-1:0]sub_size,
    6. input [8 -1:0]r,
    7. input [8 -1:0]g,
    8. input [8 -1:0]b,
    9. input [10-1:0]hcount,
    10. input [10-1:0]vcount,
    11. input power_en,
    12. output chan_en,
    13. output[24-1:0]chan_data
    14. );
    15. wire [1 -1:0]slash0_chan_in;
    16. slash_gen u_slash0(
    17. .x_point (x_point),
    18. .y_point (y_point),
    19. .size (size),
    20. .sub_size (sub_size),
    21. .r (r),
    22. .g (g),
    23. .b (b),
    24. .hcount (hcount),
    25. .vcount (vcount),
    26. .power_en (1'b1),
    27. .mode (1'b0),
    28. .chan_en (slash0_chan_in),
    29. .chan_data ()
    30. );
    31. wire [1 -1:0]slash1_chan_in;
    32. slash_gen u_slash1(
    33. .x_point (x_point),
    34. .y_point (y_point),
    35. .size (size),
    36. .sub_size (sub_size),
    37. .r (r),
    38. .g (g),
    39. .b (b),
    40. .hcount (hcount),
    41. .vcount (vcount),
    42. .power_en (1'b1),
    43. .mode (1'b1),
    44. .chan_en (slash1_chan_in),
    45. .chan_data ()
    46. );
    47. assign chan_en = power_en && (slash0_chan_in || slash1_chan_in);
    48. assign chan_data = {r,g,b};
    49. endmodule

    在工程里跑一下,输出就是下图:

  • 相关阅读:
    内存池的实现与场景分析
    11809 - Floating-Point Numbers (UVA)
    Bigemap在地质矿产行业的应用
    Linux 信号集 及其 部分函数
    程序设计中遇到的程序不通、逻辑不顺等问题
    【自学CSS笔记第10篇】——CSS浮动及清除浮动(此一篇足以)
    Element+Vue+OpenLayers的项目实战
    腾讯前端高频手写面试题
    2022“杭电杯”中国大学生算法设计超级联赛(4)D、F、G、K
    力扣刷题之数组专栏(共16道题)
  • 原文地址:https://blog.csdn.net/moon9999/article/details/124811993