• 循环优先级仲裁~位屏蔽仲裁算法


    参考了FPGA奇哥(下列视频中UP主)的讲解。

            应该可以对多路读写DDR3进行操作,仅仲裁,不涉及DMA和Uibuf等。

    2023年11月所写,暂未进行测试,日后补上。

    深入FPGA底层设计系列-循环优先级仲裁器算法:位屏蔽仲裁算法与Verilog代码编写_哔哩哔哩_bilibili

    位屏蔽算法:

            描述:对输入的多通道请求进行仲裁。

            步骤:

            (1)原码减去对应位数(优先级最高的位次)

            (2)求得(1)中输出的反码

            (3)通过(2)中输出与原码进行相与,留下优先级最高的请求。 

    举例:

            【1】

            四通道输入请求,ABCD。破解后为:4‘b1000,此时D通道优先级最高。

            4'b1000-4’b1 =4'b0111 ~4'b0111 = 4'b1000

            1000 & 1000 == 1000

            仲裁完成,准许A通道请求。 

            【2】

              四通道输入请求,ABCD。破解后为:4‘b1110,此时B通道优先级最高。

            1110 - 0100 = 1010

            ~1010 = 0101

            1110 & 0101 = 0100

            仲裁完成,准许B通道请求。 

    Trick:

            此外,为了仲裁A通道,需要对输入的请求进行拼接操作,实现向高位借位的过程。

            每次完仲裁以后,都需要改变优先级最高的那一位的位次,完成循环。

    自写代码参考:

    1. module Aribe_LoopPrior (
    2. input wire Aribe_Clk ,
    3. input wire Aribe_Rst_n ,
    4. //req
    5. input wire Req_0 ,
    6. input wire Req_1 ,
    7. input wire Req_2 ,
    8. input wire Req_3 ,
    9. output wire Req_True ,
    10. );
    11. localparam Process_0 = 5'b00001;
    12. localparam Process_1 = 5'b00010;
    13. localparam Process_2 = 5'b00100;
    14. localparam Process_3 = 5'b01000;
    15. reg [3:0] Concat_Req_0 ;
    16. reg [7:0] Concat_Req_1 ;
    17. reg [3:0] Concat_Req_Process ;
    18. reg [3:0] Concat_Req_Intv ;
    19. reg [3:0] Concat_Result ;
    20. reg [3:0] Aribe_Prior_Value ;
    21. reg [4:0] STATE ;
    22. reg [4:0] Last_STATE ;
    23. reg Process_Flag ;
    24. reg Process_Flag_0 ;
    25. reg Process_Flag_1 ;
    26. reg Process_Flag_2 ;
    27. reg Process_Flag_3 ;
    28. wire Process_First_Begin ;
    29. wire Process_Done ;
    30. assign Process_First_Begin = |Concat_Req_0 ;//有请求未处理则将其拉高
    31. //Process_Flag将在每一次Axi busy前拉高,使用Axi busy的下降沿(或者其他的结束标识来拉低)
    32. always @(posedge Aribe_Clk or negedge Aribe_Rst_n) begin
    33. if(Aribe_Rst_n == 'd0) begin
    34. Process_Flag <= 1'b0;
    35. end else if(Process_First_Begin == 1'b1 && Process_Flag == 1'b0) begin
    36. Process_Flag <= 1'b1;
    37. end else if(Process_Done == 1'b1) begin
    38. Process_Flag <= 1'b0;
    39. end
    40. end
    41. always @(posedge Aribe_Clk) begin
    42. {Process_Flag_0,Process_Flag_1,
    43. Process_Flag_2,Process_Flag_3} <= {Process_Flag,Process_Flag_0,
    44. Process_Flag_1,Process_Flag_2};
    45. end
    46. always @(posedge Aribe_Clk or negedge Aribe_Rst_n) begin
    47. if(Aribe_Rst_n == 'd0) begin
    48. Concat_Req_0 <= 'd0;
    49. Concat_Req_1 <= 'd0;
    50. end else if(Process_First_Begin == 1'b1 && Process_Flag == 1'b0)begin
    51. Concat_Req_0 <= {Req_0, Req_1, Req_2, Req_3};
    52. Concat_Req_1 <= {2{Req_0, Req_1, Req_2, Req_3}};
    53. end
    54. end
    55. //每次传输结束以后修改优先级
    56. always @(posedge Aribe_Clk or negedge Aribe_Rst_n) begin
    57. if(Aribe_Rst_n == 'd0) begin
    58. Aribe_Prior_Value <= 4'b0001;
    59. end else if(Process_Done == 1'b1) begin
    60. case (Last_STATE)
    61. Process_0: begin
    62. Aribe_Prior_Value <= 4'b0010;
    63. end
    64. Process_1: begin
    65. Aribe_Prior_Value <= 4'b0100;
    66. end
    67. Process_2: begin
    68. Aribe_Prior_Value <= 4'b1000;
    69. end
    70. Process_3: begin
    71. Aribe_Prior_Value <= 4'b0001;
    72. end
    73. default: begin
    74. Aribe_Prior_Value <= 4'b0001;
    75. end
    76. endcase
    77. end
    78. end
    79. always @(posedge Aribe_Clk or negedge Aribe_Rst_n) begin
    80. if(Aribe_Rst_n == 'd0) begin
    81. Concat_Req_Process <= 'd0;
    82. end else if(Process_Flag == 1'b1 && Process_Flag_0 == 1'b0) begin
    83. Concat_Req_Process <= Concat_Req_1 - Aribe_Prior_Value;
    84. end
    85. end
    86. always @(posedge Aribe_Clk or negedge Aribe_Rst_n) begin
    87. if(Aribe_Rst_n == 'd0) begin
    88. Concat_Req_Intv <= 'd0;
    89. end else if(Process_Flag_0 == 1'b1 && Process_Flag_1 == 1'b0) begin
    90. Concat_Req_Intv <= ~(Concat_Req_Process[3:0]);
    91. end
    92. end
    93. always @(posedge Aribe_Clk or negedge Aribe_Rst_n) begin
    94. if(Aribe_Rst_n == 'd0) begin
    95. Concat_Result <= 'd0;
    96. end else if(Process_Flag_1 == 1'b1 && Process_Flag_2 == 1'b0) begin
    97. Concat_Result <= Concat_Req_Intv & Concat_Req_0;
    98. end
    99. end
    100. always @(posedge Aribe_Clk or negedge Aribe_Rst_n) begin
    101. if(Aribe_Rst_n == 'd0) begin
    102. Req_True <= 'd0;
    103. end else if(Process_Flag_2 == 1'b1 && Process_Flag_3 == 1'b0)
    104. Req_True <= 1'b1;
    105. end
    106. always @(posedge Aribe_Clk or negedge Aribe_Rst_n) begin
    107. if(Aribe_Rst_n == 'd0) begin
    108. STATE <= 'd0;
    109. end else if(Process_Flag_2 == 1'b1 && Process_Flag_3 == 1'b0) begin
    110. case (Concat_Result)
    111. 4'b0001:begin
    112. STATE <= Process_0;
    113. end
    114. 4'b0010:begin
    115. STATE <= Process_1;
    116. end
    117. 4'b0100:begin
    118. STATE <= Process_2;
    119. end
    120. 4'b1000:begin
    121. STATE <= Process_3;
    122. end
    123. default: STATE <= Process_0;
    124. endcase
    125. end
    126. end
    127. always @(posedge Aribe_Clk or negedge Aribe_Rst_n) begin
    128. if(Aribe_Rst_n == 'd0) begin
    129. Last_STATE <= 'd0;
    130. end else if(Process_Flag_3 == 1'b1) begin
    131. Last_STATE <= STATE;
    132. end
    133. end
    134. endmodule

  • 相关阅读:
    ​《乡村振兴战略下传统村落文化旅游设计》共话2023学生开学季辉少许
    P 算法与 K 算法
    Matplotlib基础
    文件系统相关知识与IO
    Windows启动谷歌浏览器Chrome失败(应用程序无法启动,因为应用程序的并行配置不正确)解决方法
    基于百度云的 AI 接口调用
    Vue——状态管理库Pinia
    二维数组零碎知识梳理
    【第五篇-完结篇】XiaoZaiMultiAutoAiDevices之改造扩展
    RunApi使用详解
  • 原文地址:https://blog.csdn.net/NoNoUnknow/article/details/134430098