当前位置:   article > 正文

Verilog(2)HDMI显示_hdmi verilog

hdmi verilog

一、video_display模块

通过像素点坐标,来规定显示的内容,像素点坐标由驱动模块根据时钟及行场计数来动态改变。

二、video_driver模块

行计数和场计数

  1. //行计数器对像素时钟计数
  2. always @(posedge pixel_clk ) begin
  3. if (!sys_rst_n)
  4. cnt_h <= 11'd0;
  5. else begin
  6. if(cnt_h < H_TOTAL - 1'b1)
  7. cnt_h <= cnt_h + 1'b1;
  8. else
  9. cnt_h <= 11'd0;
  10. end
  11. end
  12. //场计数器对行计数
  13. always @(posedge pixel_clk ) begin
  14. if (!sys_rst_n)
  15. cnt_v <= 11'd0;
  16. else if(cnt_h == H_TOTAL - 1'b1) begin
  17. if(cnt_v < V_TOTAL - 1'b1)
  18. cnt_v <= cnt_v + 1'b1;
  19. else
  20. cnt_v <= 11'd0;
  21. end
  22. end

行场同步信号:

  1. assign video_hs = ( cnt_h < H_SYNC ) ? 1'b0 : 1'b1; //行同步信号赋值
  2. assign video_vs = ( cnt_v < V_SYNC ) ? 1'b0 : 1'b1; //场同步信号赋值

使能信号(在有效显示区间内为1):

  1. //使能RGB数据输出
  2. assign video_en = (((cnt_h >= H_SYNC+H_BACK) && (cnt_h < H_SYNC+H_BACK+H_DISP))
  3. &&((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))
  4. ? 1'b1 : 1'b0;

像素点坐标:

  1. //请求像素点颜色数据输入
  2. assign data_req = (((cnt_h >= H_SYNC+H_BACK-1'b1) &&
  3. (cnt_h < H_SYNC+H_BACK+H_DISP-1'b1))
  4. && ((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))
  5. ? 1'b1 : 1'b0;
  6. //像素点坐标
  7. assign pixel_xpos = data_req ? (cnt_h - (H_SYNC + H_BACK - 1'b1)) : 11'd0;
  8. assign pixel_ypos = data_req ? (cnt_v - (V_SYNC + V_BACK - 1'b1)) : 11'd0;

data_req提前请求一排所以减一。

RGB数据输出:

  1. //RGB888数据输出
  2. assign video_rgb = video_en ? pixel_data : 24'd0;

三、dvi_transmitter_top

异步复位,同步释放:

  1. module asyn_rst_syn(
  2. input clk, //目的时钟域
  3. input reset_n, //异步复位,低有效
  4. output syn_reset //高有效
  5. );
  6. reg reset_1;
  7. reg reset_2;
  8. assign syn_reset = reset_2;
  9. //对异步复位信号进行同步释放,并转换成高有效
  10. always @ (posedge clk or negedge reset_n) begin
  11. if(!reset_n) begin
  12. reset_1 <= 1'b1;
  13. reset_2 <= 1'b1;
  14. end
  15. else begin
  16. reset_1 <= 1'b0;
  17. reset_2 <= reset_1;
  18. end
  19. end
  20. endmodule

当reset信号为active的时候,寄存器立刻被复位,与时钟沿到来与否没有关系。用两级寄存器,是消除复位释放中可能存在的亚稳态

异步复位的亚稳态:当异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之间时,输出结果就会出现亚稳态,造成复位失败。

TMDS编码算法:

串转并:

  1. module serializer_10_to_1(
  2. input reset, // 复位,高有效
  3. input paralell_clk, // 输入并行数据时钟
  4. input serial_clk_5x, // 输入串行数据时钟
  5. input [9:0] paralell_data, // 输入并行数据
  6. output serial_data_out // 输出串行数据
  7. );
  8. //wire define
  9. wire cascade1; //用于两个OSERDESE2级联的信号
  10. wire cascade2;
  11. //*****************************************************
  12. //** main code
  13. //*****************************************************
  14. //例化OSERDESE2原语,实现并串转换,Master模式
  15. OSERDESE2 #(
  16. .DATA_RATE_OQ ("DDR"), // 设置双倍数据速率
  17. .DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR
  18. .DATA_WIDTH (10), // 输入的并行数据宽度为10bit
  19. .SERDES_MODE ("MASTER"), // 设置为Master,用于10bit宽度扩展
  20. .TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE)
  21. .TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE)
  22. .TRISTATE_WIDTH (1) // 3-state converter width (1,4)
  23. )
  24. OSERDESE2_Master (
  25. .CLK (serial_clk_5x), // 串行数据时钟,5倍时钟频率
  26. .CLKDIV (paralell_clk), // 并行数据时钟
  27. .RST (reset), // 1-bit input: Reset
  28. .OCE (1'b1), // 1-bit input: Output data clock enable
  29. .OQ (serial_data_out), // 串行输出数据
  30. .D1 (paralell_data[0]), // D1 - D8: 并行数据输入
  31. .D2 (paralell_data[1]),
  32. .D3 (paralell_data[2]),
  33. .D4 (paralell_data[3]),
  34. .D5 (paralell_data[4]),
  35. .D6 (paralell_data[5]),
  36. .D7 (paralell_data[6]),
  37. .D8 (paralell_data[7]),
  38. .SHIFTIN1 (cascade1), // SHIFTIN1 用于位宽扩展
  39. .SHIFTIN2 (cascade2), // SHIFTIN2
  40. .SHIFTOUT1 (), // SHIFTOUT1: 用于位宽扩展
  41. .SHIFTOUT2 (), // SHIFTOUT2
  42. .OFB (), // 以下是未使用信号
  43. .T1 (1'b0),
  44. .T2 (1'b0),
  45. .T3 (1'b0),
  46. .T4 (1'b0),
  47. .TBYTEIN (1'b0),
  48. .TCE (1'b0),
  49. .TBYTEOUT (),
  50. .TFB (),
  51. .TQ ()
  52. );
  53. //例化OSERDESE2原语,实现并串转换,Slave模式
  54. OSERDESE2 #(
  55. .DATA_RATE_OQ ("DDR"), // 设置双倍数据速率
  56. .DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR
  57. .DATA_WIDTH (10), // 输入的并行数据宽度为10bit
  58. .SERDES_MODE ("SLAVE"), // 设置为Slave,用于10bit宽度扩展
  59. .TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE)
  60. .TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE)
  61. .TRISTATE_WIDTH (1) // 3-state converter width (1,4)
  62. )
  63. OSERDESE2_Slave (
  64. .CLK (serial_clk_5x), // 串行数据时钟,5倍时钟频率
  65. .CLKDIV (paralell_clk), // 并行数据时钟
  66. .RST (reset), // 1-bit input: Reset
  67. .OCE (1'b1), // 1-bit input: Output data clock enable
  68. .OQ (), // 串行输出数据
  69. .D1 (1'b0), // D1 - D8: 并行数据输入
  70. .D2 (1'b0),
  71. .D3 (paralell_data[8]),
  72. .D4 (paralell_data[9]),
  73. .D5 (1'b0),
  74. .D6 (1'b0),
  75. .D7 (1'b0),
  76. .D8 (1'b0),
  77. .SHIFTIN1 (), // SHIFTIN1 用于位宽扩展
  78. .SHIFTIN2 (), // SHIFTIN2
  79. .SHIFTOUT1 (cascade1), // SHIFTOUT1: 用于位宽扩展
  80. .SHIFTOUT2 (cascade2), // SHIFTOUT2
  81. .OFB (), // 以下是未使用信号
  82. .T1 (1'b0),
  83. .T2 (1'b0),
  84. .T3 (1'b0),
  85. .T4 (1'b0),
  86. .TBYTEIN (1'b0),
  87. .TCE (1'b0),
  88. .TBYTEOUT (),
  89. .TFB (),
  90. .TQ ()
  91. );
  92. endmodule

serdes又可以分为iserdes与oserdes两个操作分别是串行转并行以及并行转串行。

串转并之后,产生差分信号

  1. //转换差分信号
  2. OBUFDS #(
  3. .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
  4. ) TMDS0 (
  5. .I (tmds_data_serial[0]),
  6. .O (tmds_data_p[0]),
  7. .OB (tmds_data_n[0])
  8. );
  9. OBUFDS #(
  10. .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
  11. ) TMDS1 (
  12. .I (tmds_data_serial[1]),
  13. .O (tmds_data_p[1]),
  14. .OB (tmds_data_n[1])
  15. );
  16. OBUFDS #(
  17. .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
  18. ) TMDS2 (
  19. .I (tmds_data_serial[2]),
  20. .O (tmds_data_p[2]),
  21. .OB (tmds_data_n[2])
  22. );
  23. OBUFDS #(
  24. .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
  25. ) TMDS3 (
  26. .I (tmds_clk_serial),
  27. .O (tmds_clk_p),
  28. .OB (tmds_clk_n)
  29. );

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/873004
推荐阅读
相关标签
  

闽ICP备14008679号