• FPGA project : inf_rcv


    1. module top (
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire inf_in ,
    5. output wire led ,
    6. output wire ds ,
    7. output wire oe ,
    8. output wire shcp ,
    9. output wire stcp
    10. );
    11. // 例化连线
    12. wire [7:0] data ;
    13. wire sign ;
    14. wire [19:00] data_w ;
    15. assign data_w = {12'd0,data} ;
    16. wire [05:00] point_w ;
    17. assign point_w = 6'b000000 ;
    18. wire sign_w ;
    19. assign sign_w = 1'b0 ;
    20. wire seg_en_w ;
    21. assign seg_en_w = 1'b1 ;
    22. inf_rcv inf_rcv_insert(
    23. .sys_clk ( sys_clk ) ,
    24. .sys_rst_n ( sys_rst_n ) ,
    25. .inf_in ( inf_in ) ,
    26. .data ( data ) ,
    27. .sign ( sign )
    28. );
    29. led led_insert(
    30. .sys_clk ( sys_clk ) ,
    31. .sys_rst_n ( sys_rst_n ) ,
    32. .key_in ( sign ) ,
    33. .led_out ( led )
    34. );
    35. seg_595_dynamic seg_595_dynamic_insert(
    36. .sys_clk ( sys_clk ) ,
    37. .sys_rst_n ( sys_rst_n ) ,
    38. .data ( data_w ) ,
    39. .point ( point_w ) ,
    40. .sign ( sign_w ) ,
    41. .seg_en ( seg_en_w ) ,
    42. .ds ( ds ) ,
    43. .oe ( oe ) ,
    44. .shcp ( shcp ) ,
    45. .stcp ( stcp )
    46. );
    47. endmodule
    1. module inf_rcv (
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire inf_in ,
    5. output reg [7:0] data ,
    6. output reg sign
    7. );
    8. // parameter degine
    9. parameter T_9MS = 19'd450_000 ,
    10. T_4_5MS = 18'd225_000 ,
    11. T_2_225MS= 17'd112_500 ,
    12. T_560US = 15'd28_000 ,
    13. T_1_69MS = 17'd84_500 ;
    14. // parameter degine
    15. localparam IDLE = 5'b0_0001 ,
    16. TIME_9MS = 5'b0_0010 ,
    17. ARBITE = 5'b0_0100 ,
    18. DATA = 5'b0_1000 ,
    19. REPEAT = 5'b1_0000 ;
    20. // wire signal define
    21. wire nege ;
    22. wire pose ;
    23. // reg signal define
    24. reg inf_in_reg0 ;
    25. reg inf_in_reg1 ;
    26. reg inf_in_reg2 ;
    27. reg [ 4:0] state ;
    28. reg [19:0] cnt ; // 虽然最大计数9ms只需19位宽,但还是定义20位宽。
    29. reg flag_9ms ; // 由于设备制造精度与环境因素影响,这个标志信号在指定目标附近拉高即可。
    30. reg flag_4_5ms ;
    31. reg flag_2_25ms ;
    32. reg flag_560us ;
    33. reg flag_1_69ms ;
    34. reg [ 5:0] cnt_bit ; // 32 bit 数据
    35. reg [31:0] data_reg ;
    36. // // reg signal define
    37. // reg inf_in_reg0 ;
    38. // reg inf_in_reg1 ;
    39. // reg inf_in_reg2 ;
    40. always @(posedge sys_clk or negedge sys_rst_n) begin
    41. if(~sys_rst_n) begin
    42. inf_in_reg0 <= 1'b1 ;
    43. inf_in_reg1 <= 1'b1 ;
    44. inf_in_reg2 <= 1'b1 ;
    45. end else begin
    46. inf_in_reg0 <= inf_in ;
    47. inf_in_reg1 <= inf_in_reg0 ;
    48. inf_in_reg2 <= inf_in_reg1 ;
    49. end
    50. end
    51. // // wire signal define
    52. // wire nege ;
    53. // wire pose ;
    54. assign nege = ~inf_in_reg1 && inf_in_reg2 ;
    55. assign pose = inf_in_reg1 && ~inf_in_reg2 ;
    56. // reg [ 4:0] state ;
    57. always @(posedge sys_clk or negedge sys_rst_n)
    58. if(~sys_rst_n)
    59. state <= IDLE ;
    60. else case (state)
    61. IDLE :if (nege == 1'b1)
    62. state <= TIME_9MS ;
    63. else
    64. state <= IDLE ;
    65. TIME_9MS:if(pose == 1'b1 && flag_9ms == 1'b1) //T_9MS - 19'd100
    66. state <= ARBITE ;
    67. else if(pose == 1'b1 && flag_9ms == 1'b0)
    68. state <= IDLE ;
    69. else
    70. state <= TIME_9MS ;
    71. ARBITE :if(nege == 1'b1 && flag_4_5ms == 1'b1) // 说明是引导码
    72. state <= DATA ;
    73. else if(nege == 1'b1 && flag_2_25ms == 1'b1) // 说明是重复码
    74. state <= REPEAT ;
    75. else if(nege == 1'b1 && flag_4_5ms == 1'b0 && flag_2_25ms == 1'b0)
    76. state <= IDLE ;
    77. else
    78. state <= ARBITE ;
    79. DATA :if((pose == 1'b1 && flag_560us == 1'b1 && cnt_bit == 6'd32)
    80. || (pose == 1'b1 && flag_560us == 1'b0)
    81. || (nege == 1'b1 && ( flag_560us == 1'b0 && flag_1_69ms == 1'b0)))
    82. state <= IDLE ;
    83. else
    84. state <= DATA ;
    85. REPEAT :if(pose == 1'b1 )
    86. state <= IDLE ;
    87. else
    88. state <= REPEAT ;
    89. default : state <= IDLE ;
    90. endcase
    91. // reg [19:0] cnt ; // 虽然最大计数9ms只需19位宽,但还是定义20位宽。
    92. // reg flag_9ms ; // 由于设备制造精度与环境因素影响,这个标志信号在指定目标附近拉高即可。
    93. // reg flag_4_5ms ;
    94. // reg flag_2_25ms ;
    95. // reg flag_560us ;
    96. // reg flag_1_69ms ;
    97. // reg [ 5:0] cnt_bit ; // 32 bit 数据
    98. always @(posedge sys_clk or negedge sys_rst_n) begin
    99. if(~sys_rst_n) begin
    100. cnt <= 20'd0 ;
    101. flag_9ms <= 1'b0 ;
    102. flag_4_5ms <= 1'b0 ;
    103. flag_2_25ms <= 1'b0 ;
    104. flag_560us <= 1'b0 ;
    105. flag_1_69ms <= 1'b0 ;
    106. cnt_bit <= 6'd0 ;
    107. end else begin
    108. case (state)
    109. IDLE :begin
    110. cnt <= 20'd0 ;
    111. flag_9ms <= 1'b0 ;
    112. flag_4_5ms <= 1'b0 ;
    113. flag_2_25ms <= 1'b0 ;
    114. flag_560us <= 1'b0 ;
    115. flag_1_69ms <= 1'b0 ;
    116. cnt_bit <= 6'd0 ;
    117. end
    118. TIME_9MS:begin
    119. if(pose == 1'b1) begin
    120. cnt <= 20'd0 ;
    121. end else begin
    122. cnt <= cnt + 1'b1 ;
    123. end
    124. if(cnt >= T_9MS - 19'd8000 && cnt <= T_9MS + 19'd8000) // 9ms附近拉高。不能太“离谱”。
    125. flag_9ms <= 1'b1 ;
    126. else
    127. flag_9ms <= 1'b0 ;
    128. flag_4_5ms <= 1'b0 ;
    129. flag_2_25ms <= 1'b0 ;
    130. flag_560us <= 1'b0 ;
    131. flag_1_69ms <= 1'b0 ;
    132. cnt_bit <= 6'd0 ;
    133. end
    134. ARBITE :begin
    135. if(nege == 1'b1)
    136. cnt <= 20'd0 ;
    137. else
    138. cnt <= cnt + 1'b1 ;
    139. if(cnt >= T_4_5MS - 18'd8000 && cnt <= T_4_5MS + 18'd8000)
    140. flag_4_5ms <= 1'b1 ;
    141. else
    142. flag_4_5ms <= 1'b0 ;
    143. if(cnt >= T_2_225MS - 17'd8000 && cnt <= T_2_225MS + 17'd8000)
    144. flag_2_25ms <= 1'b1 ;
    145. else
    146. flag_2_25ms <= 1'b0 ;
    147. flag_9ms <= 1'b0 ;
    148. flag_560us <= 1'b0 ;
    149. flag_1_69ms <= 1'b0 ;
    150. cnt_bit <= 6'd0 ;
    151. end
    152. DATA :begin
    153. if(nege == 1'b1 || pose == 1'b1)
    154. cnt <= 20'd0 ;
    155. else
    156. cnt <= cnt + 1'b1 ;
    157. if(cnt >= T_560US - 15'd8000 && cnt <= T_560US + 15'd8000)
    158. flag_560us <= 1'b1 ;
    159. else
    160. flag_560us <= 1'b0 ;
    161. if(cnt >= T_1_69MS - 15'd8000 && cnt <= T_1_69MS + 15'd8000)
    162. flag_1_69ms <= 1'b1 ;
    163. else
    164. flag_1_69ms <= 1'b0 ;
    165. flag_9ms <= 1'b0 ;
    166. flag_4_5ms <= 1'b0 ;
    167. flag_2_25ms <= 1'b0 ;
    168. if(pose == 1'b1 && flag_560us == 1'b1 && cnt_bit == 6'd32)
    169. cnt_bit <= 'd0 ;
    170. else if(nege == 1'b1)
    171. cnt_bit <= cnt_bit + 1'b1 ;
    172. else
    173. cnt_bit <= cnt_bit ;
    174. end
    175. REPEAT :begin
    176. cnt <= 20'd0 ;
    177. flag_9ms <= 1'b0 ;
    178. flag_4_5ms <= 1'b0 ;
    179. flag_2_25ms <= 1'b0 ;
    180. flag_560us <= 1'b0 ;
    181. flag_1_69ms <= 1'b0 ;
    182. cnt_bit <= 6'd0 ;
    183. end
    184. default:begin
    185. cnt <= 20'd0 ;
    186. flag_9ms <= 1'b0 ;
    187. flag_4_5ms <= 1'b0 ;
    188. flag_2_25ms <= 1'b0 ;
    189. flag_560us <= 1'b0 ;
    190. flag_1_69ms <= 1'b0 ;
    191. cnt_bit <= 6'd0 ;
    192. end
    193. endcase
    194. end
    195. end
    196. // reg [31:0] data_reg ;
    197. always @(posedge sys_clk or negedge sys_rst_n)
    198. if(~sys_rst_n)
    199. data_reg <= 31'd0 ;
    200. else if(state == DATA && nege == 1'b1 && cnt_bit <= 6'd31 && flag_1_69ms == 1'b1)
    201. data_reg[cnt_bit] <= 1'b1 ;
    202. else if(state == DATA && nege == 1'b1 && cnt_bit <= 6'd31 && flag_560us == 1'b1)
    203. data_reg[cnt_bit] <= 1'b0 ;
    204. else
    205. data_reg <= data_reg ;
    206. // output signal
    207. // reg [7:0] data ,
    208. always @(posedge sys_clk or negedge sys_rst_n)
    209. if(~sys_rst_n)
    210. data <= 8'd0 ;
    211. else if((data_reg[23:16] == ~data_reg[31:24]) && (data_reg[7:0] == ~data_reg[15:8]))
    212. data <= data_reg[23:16] ;
    213. else
    214. data <= data ;
    215. // reg sign
    216. always @(posedge sys_clk or negedge sys_rst_n)
    217. if(~sys_rst_n)
    218. sign <= 1'b0 ;
    219. else if(state == REPEAT)
    220. sign <= 1'b1 ;
    221. else
    222. sign <= 1'b0 ;
    223. endmodule
    1. module led(
    2. input sys_clk ,
    3. input sys_rst_n ,
    4. input key_in ,
    5. output wire led_out
    6. );
    7. reg key_in_reg1 ;
    8. reg key_in_reg2 ;
    9. wire pose ;
    10. reg [24:0] cnt_500ms ; // 24_999_999
    11. always @(posedge sys_clk or negedge sys_rst_n) begin
    12. if(~sys_rst_n) begin
    13. key_in_reg1 <= 1'b0 ;
    14. key_in_reg2 <= 1'b0 ;
    15. end else begin
    16. key_in_reg1 <= key_in ;
    17. key_in_reg2 <= key_in_reg1 ;
    18. end
    19. end
    20. assign pose = ~key_in_reg2 && key_in_reg1 ;
    21. always @(posedge sys_clk or negedge sys_rst_n) begin
    22. if(~sys_rst_n) begin
    23. cnt_500ms <= 25'd0 ;
    24. end else begin
    25. if(cnt_500ms == 25'd0 && pose == 1'b1) begin
    26. cnt_500ms <= 25'd24_999_999 ;
    27. end else begin
    28. if(cnt_500ms == 25'd0) begin
    29. cnt_500ms <= cnt_500ms ;
    30. end else begin
    31. cnt_500ms <= cnt_500ms - 1'b1 ;
    32. end
    33. end
    34. end
    35. end
    36. assign led_out = (cnt_500ms == 0) ? 1'b1 : 1'b0 ; // 低电平亮。
    37. endmodule

     

    1. `timescale 1ns/1ns
    2. module test_inf_rcv();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg inf_in ;
    6. wire [7:0] data ;
    7. wire sign ;
    8. // Instantiation
    9. inf_rcv inf_rcv_insert(
    10. .sys_clk ( sys_clk ) ,
    11. .sys_rst_n ( sys_rst_n ) ,
    12. .inf_in ( inf_in ) ,
    13. .data ( data ) ,
    14. .sign ( sign )
    15. );
    16. parameter CYCLE = 20 ;
    17. initial begin
    18. sys_clk = 1'b1 ;
    19. sys_rst_n <= 1'b0 ;
    20. inf_in <= 1'b1 ;
    21. #( CYCLE * 10 ) ;
    22. sys_rst_n <= 1'b1 ;
    23. #( CYCLE * 500 ) ;
    24. // 引导码
    25. inf_in <= 1'b0 ;
    26. #(9_000_000) ;
    27. inf_in <= 1'b1 ;
    28. #(4_500_000) ;
    29. // 地址码 8'h57 0101_0111 1110_1010
    30. inf_in <= 1'b0 ; // 1
    31. #(560_000) ;
    32. inf_in <= 1'b1 ;
    33. #(1690_000) ;
    34. inf_in <= 1'b0 ; // 1
    35. #(560_000) ;
    36. inf_in <= 1'b1 ;
    37. #(1690_000) ;
    38. inf_in <= 1'b0 ; // 1
    39. #(560_000) ;
    40. inf_in <= 1'b1 ;
    41. #(1690_000) ;
    42. inf_in <= 1'b0 ; // 0
    43. #(560_000) ;
    44. inf_in <= 1'b1 ;
    45. #(560_000) ;
    46. inf_in <= 1'b0 ; // 1
    47. #(560_000) ;
    48. inf_in <= 1'b1 ;
    49. #(1690_000) ;
    50. inf_in <= 1'b0 ; // 0
    51. #(560_000) ;
    52. inf_in <= 1'b1 ;
    53. #(560_000) ;
    54. inf_in <= 1'b0 ; // 1
    55. #(560_000) ;
    56. inf_in <= 1'b1 ;
    57. #(1690_000) ;
    58. inf_in <= 1'b0 ; // 0
    59. #(560_000) ;
    60. inf_in <= 1'b1 ;
    61. #(560_000) ;
    62. // 地址反码 8'hA8 1010_1000 0001_0101
    63. inf_in <= 1'b0 ; // 0
    64. #(560_000) ;
    65. inf_in <= 1'b1 ;
    66. #(560_000) ;
    67. inf_in <= 1'b0 ; // 0
    68. #(560_000) ;
    69. inf_in <= 1'b1 ;
    70. #(560_000) ;
    71. inf_in <= 1'b0 ; // 0
    72. #(560_000) ;
    73. inf_in <= 1'b1 ;
    74. #(560_000) ;
    75. inf_in <= 1'b0 ; // 1
    76. #(560_000) ;
    77. inf_in <= 1'b1 ;
    78. #(1690_000) ;
    79. inf_in <= 1'b0 ; // 0
    80. #(560_000) ;
    81. inf_in <= 1'b1 ;
    82. #(560_000) ;
    83. inf_in <= 1'b0 ; // 1
    84. #(560_000) ;
    85. inf_in <= 1'b1 ;
    86. #(1690_000) ;
    87. inf_in <= 1'b0 ; // 0
    88. #(560_000) ;
    89. inf_in <= 1'b1 ;
    90. #(560_000) ;
    91. inf_in <= 1'b0 ; // 1
    92. #(560_000) ;
    93. inf_in <= 1'b1 ;
    94. #(1690_000) ;
    95. // 数据码 8'h22 0010_0010 0100_0100
    96. inf_in <= 1'b0 ; // 0
    97. #(560_000) ;
    98. inf_in <= 1'b1 ;
    99. #(560_000) ;
    100. inf_in <= 1'b0 ; // 1
    101. #(560_000) ;
    102. inf_in <= 1'b1 ;
    103. #(1690_000) ;
    104. inf_in <= 1'b0 ; // 0
    105. #(560_000) ;
    106. inf_in <= 1'b1 ;
    107. #(560_000) ;
    108. inf_in <= 1'b0 ; // 0
    109. #(560_000) ;
    110. inf_in <= 1'b1 ;
    111. #(560_000) ;
    112. inf_in <= 1'b0 ; // 0
    113. #(560_000) ;
    114. inf_in <= 1'b1 ;
    115. #(560_000) ;
    116. inf_in <= 1'b0 ; // 1
    117. #(560_000) ;
    118. inf_in <= 1'b1 ;
    119. #(1690_000) ;
    120. inf_in <= 1'b0 ; // 0
    121. #(560_000) ;
    122. inf_in <= 1'b1 ;
    123. #(560_000) ;
    124. inf_in <= 1'b0 ; // 0
    125. #(560_000) ;
    126. inf_in <= 1'b1 ;
    127. #(560_000) ;
    128. // 数据反码 8'hDD 1101_1101 1011_1011
    129. inf_in <= 1'b0 ; // 1
    130. #(560_000) ;
    131. inf_in <= 1'b1 ;
    132. #(1690_000) ;
    133. inf_in <= 1'b0 ; // 0
    134. #(560_000) ;
    135. inf_in <= 1'b1 ;
    136. #(560_000) ;
    137. inf_in <= 1'b0 ; // 1
    138. #(560_000) ;
    139. inf_in <= 1'b1 ;
    140. #(1690_000) ;
    141. inf_in <= 1'b0 ; // 1
    142. #(560_000) ;
    143. inf_in <= 1'b1 ;
    144. #(1690_000) ;
    145. inf_in <= 1'b0 ; // 1
    146. #(560_000) ;
    147. inf_in <= 1'b1 ;
    148. #(1690_000) ;
    149. inf_in <= 1'b0 ; // 0
    150. #(560_000) ;
    151. inf_in <= 1'b1 ;
    152. #(560_000) ;
    153. inf_in <= 1'b0 ; // 1
    154. #(560_000) ;
    155. inf_in <= 1'b1 ;
    156. #(1690_000) ;
    157. inf_in <= 1'b0 ; // 1
    158. #(560_000) ;
    159. inf_in <= 1'b1 ;
    160. #(1690_000) ;
    161. // 结束码
    162. inf_in <= 1'b0 ;
    163. #(560_000) ;
    164. inf_in <= 1'b1 ;
    165. #(1_000_000) ;
    166. // 重复码
    167. inf_in <= 1'b0 ;
    168. #(9_000_000) ;
    169. inf_in <= 1'b1 ;
    170. #(2_250_000) ;
    171. // 结束码
    172. inf_in <= 1'b0 ;
    173. #(560_000) ;
    174. inf_in <= 1'b1 ;
    175. #(1_000_000) ;
    176. $stop ;
    177. end
    178. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    179. endmodule

     

     

    其他模块是之前的。

    上板验证成功。

  • 相关阅读:
    word转PDF的方法 简介快速
    OceanBase!一场专为开发者打造的数据库技术交流盛宴!
    SpringBoot-拦截器
    以太坊学习二:签名
    【STL】用一棵红黑树封装map和set
    CentOS7 建立静态地址网桥br0
    TensorFlow学习笔记--(1)张量的随机生成
    前端面试宝典React篇15 如何提升 React 代码可维护性?
    《论文阅读》Generating Responses with a Specific Emotion in Dialog
    集成学习思想
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/133033846