pr.v
上传用户:tzxuweilin
上传日期:2022-08-10
资源大小:747k
文件大小:10k
源码类别:

VHDL/FPGA/Verilog

开发平台:

VHDL

  1. module pr(sm, mask, request, isr, sp, eoi, isr_set, isr_clr, intr, code);
  2. input sm;
  3. input[7:0] mask;
  4. input[7:0] request;
  5. input[7:0] isr;
  6. input[2:0] sp;
  7. input[7:0] eoi;
  8. output[7:0] isr_set;
  9. output[7:0] isr_clr;
  10. output intr;
  11. output[2:0] code;
  12. wire[7:0] nmr;
  13. wire[7:0] isr_clr;
  14. wire[7:0] isr_set;
  15. reg[2:0] position, hp_nmr, hp_isr;
  16. assign nmr = (~mask) & request;
  17. assign isr_clr = eoi;
  18. assign isr_set[0] = (sm && /*hp_nmr != 3'd8 && */position == 3'd0) || (~sm && hp_nmr < hp_isr && position == 3'd0) ? 1'b1 : 1'b0;
  19. assign isr_set[1] = (sm && /*hp_nmr != 3'd8 && */position == 3'd1) || (~sm && hp_nmr < hp_isr && position == 3'd1) ? 1'b1 : 1'b0;
  20. assign isr_set[2] = (sm && /*hp_nmr != 3'd8 && */position == 3'd2) || (~sm && hp_nmr < hp_isr && position == 3'd2) ? 1'b1 : 1'b0;
  21. assign isr_set[3] = (sm && /*hp_nmr != 3'd8 && */position == 3'd3) || (~sm && hp_nmr < hp_isr && position == 3'd3) ? 1'b1 : 1'b0;
  22. assign isr_set[4] = (sm && /*hp_nmr != 3'd8 && */position == 3'd4) || (~sm && hp_nmr < hp_isr && position == 3'd4) ? 1'b1 : 1'b0;
  23. assign isr_set[5] = (sm && /*hp_nmr != 3'd8 && */position == 3'd5) || (~sm && hp_nmr < hp_isr && position == 3'd5) ? 1'b1 : 1'b0;
  24. assign isr_set[6] = (sm && /*hp_nmr != 3'd8 && */position == 3'd6) || (~sm && hp_nmr < hp_isr && position == 3'd6) ? 1'b1 : 1'b0;
  25. assign isr_set[7] = (sm && /*hp_nmr != 3'd8 && */position == 3'd7) || (~sm && hp_nmr < hp_isr && position == 3'd7) ? 1'b1 : 1'b0;
  26. // FOR /L %i IN (0, 1, 7) do (ECHO "assign isr_set[%i] = (sm && /*hp_nmr != 3'd8 && */position == 3'd%i) || (~sm && hp_nmr < hp_isr && position == 3'd%i) ? 1'b1 : 1'b0;" >> a.txt)
  27. assign code = (isr == 8'd0) ? 3'b000 : position;
  28. assign intr = ((/*hp_nmr != 3'd8 && */sm) || (/*hp_nmr != 3'd8 && */~sm && hp_nmr < hp_isr)) ? 1'b1 : 1'b0;
  29. always @(sp)
  30. begin
  31. if (nmr != 8'd0)
  32. begin
  33. case (sp)
  34. 3'd7:
  35. begin
  36. if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd0; end
  37. else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd1; end
  38. else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd2; end
  39. else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd3; end
  40. else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd4; end
  41. else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd5; end
  42. else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd6; end
  43. else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd7; end
  44. end
  45. 3'd6:
  46. begin
  47. if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd0; end
  48. else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd1; end
  49. else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd2; end
  50. else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd3; end
  51. else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd4; end
  52. else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd5; end
  53. else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd6; end
  54. else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd7; end
  55. end
  56. 3'd5:
  57. begin
  58. if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd0; end
  59. else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd1; end
  60. else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd2; end
  61. else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd3; end
  62. else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd4; end
  63. else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd5; end
  64. else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd6; end
  65. else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd7; end
  66. end
  67. 3'd4:
  68. begin
  69. if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd0; end
  70. else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd1; end
  71. else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd2; end
  72. else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd3; end
  73. else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd4; end
  74. else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd5; end
  75. else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd6; end
  76. else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd7; end
  77. end
  78. 3'd3:
  79. begin
  80. if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd0; end
  81. else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd1; end
  82. else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd2; end
  83. else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd3; end
  84. else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd4; end
  85. else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd5; end
  86. else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd6; end
  87. else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd7; end
  88. end
  89. 3'd2:
  90. begin
  91. if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd0; end
  92. else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd1; end
  93. else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd2; end
  94. else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd3; end
  95. else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd4; end
  96. else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd5; end
  97. else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd6; end
  98. else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd7; end
  99. end
  100. 3'd1:
  101. begin
  102. if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd0; end
  103. else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd1; end
  104. else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd2; end
  105. else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd3; end
  106. else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd4; end
  107. else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd5; end
  108. else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd6; end
  109. else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd7; end
  110. end
  111. 3'd0:
  112. begin
  113. if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd0; end
  114. else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd1; end
  115. else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd2; end
  116. else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd3; end
  117. else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd4; end
  118. else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd5; end
  119. else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd6; end
  120. else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd7; end
  121. end
  122. //// FOR /L %i in (0, 1, 7) do (ECHO "else if (nmr[%i] == 1) begin position <= %i; hp_nmr <= %i; end" >>a.txt)
  123. endcase
  124. end
  125. if (isr != 0)
  126. begin
  127. case (sp)
  128. 3'd7:
  129. begin
  130. if (isr[0] == 1'b1) hp_isr <= 3'd0;
  131. else if (isr[1] == 1'b1) hp_isr <= 3'd1;
  132. else if (isr[2] == 1'b1) hp_isr <= 3'd2;
  133. else if (isr[3] == 1'b1) hp_isr <= 3'd3;
  134. else if (isr[4] == 1'b1) hp_isr <= 3'd4;
  135. else if (isr[5] == 1'b1) hp_isr <= 3'd5;
  136. else if (isr[6] == 1'b1) hp_isr <= 3'd6;
  137. else if (isr[7] == 1'b1) hp_isr <= 3'd7;
  138. end
  139. 3'd6:
  140. begin
  141. if (isr[1] == 1'b1) hp_isr <= 3'd0;
  142. else if (isr[2] == 1'b1) hp_isr <= 3'd1;
  143. else if (isr[3] == 1'b1) hp_isr <= 3'd2;
  144. else if (isr[4] == 1'b1) hp_isr <= 3'd3;
  145. else if (isr[5] == 1'b1) hp_isr <= 3'd4;
  146. else if (isr[6] == 1'b1) hp_isr <= 3'd5;
  147. else if (isr[7] == 1'b1) hp_isr <= 3'd6;
  148. else if (isr[0] == 1'b1) hp_isr <= 3'd7;
  149. end
  150. 3'd5:
  151. begin
  152. if (isr[2] == 1'b1) hp_isr <= 3'd0;
  153. else if (isr[3] == 1'b1) hp_isr <= 3'd1;
  154. else if (isr[4] == 1'b1) hp_isr <= 3'd2;
  155. else if (isr[5] == 1'b1) hp_isr <= 3'd3;
  156. else if (isr[6] == 1'b1) hp_isr <= 3'd4;
  157. else if (isr[7] == 1'b1) hp_isr <= 3'd5;
  158. else if (isr[0] == 1'b1) hp_isr <= 3'd6;
  159. else if (isr[1] == 1'b1) hp_isr <= 3'd7;
  160. end
  161. 3'd4:
  162. begin
  163. if (isr[3] == 1'b1) hp_isr <= 3'd0;
  164. else if (isr[4] == 1'b1) hp_isr <= 3'd1;
  165. else if (isr[5] == 1'b1) hp_isr <= 3'd2;
  166. else if (isr[6] == 1'b1) hp_isr <= 3'd3;
  167. else if (isr[7] == 1'b1) hp_isr <= 3'd4;
  168. else if (isr[0] == 1'b1) hp_isr <= 3'd5;
  169. else if (isr[1] == 1'b1) hp_isr <= 3'd6;
  170. else if (isr[2] == 1'b1) hp_isr <= 3'd7;
  171. end
  172. 3'd3:
  173. begin
  174. if (isr[4] == 1'b1) hp_isr <= 3'd0;
  175. else if (isr[5] == 1'b1) hp_isr <= 3'd1;
  176. else if (isr[6] == 1'b1) hp_isr <= 3'd2;
  177. else if (isr[7] == 1'b1) hp_isr <= 3'd3;
  178. else if (isr[0] == 1'b1) hp_isr <= 3'd4;
  179. else if (isr[1] == 1'b1) hp_isr <= 3'd5;
  180. else if (isr[2] == 1'b1) hp_isr <= 3'd6;
  181. else if (isr[3] == 1'b1) hp_isr <= 3'd7;
  182. end
  183. 3'd2:
  184. begin
  185. if (isr[5] == 1'b1) hp_isr <= 3'd0;
  186. else if (isr[6] == 1'b1) hp_isr <= 3'd1;
  187. else if (isr[7] == 1'b1) hp_isr <= 3'd2;
  188. else if (isr[0] == 1'b1) hp_isr <= 3'd3;
  189. else if (isr[1] == 1'b1) hp_isr <= 3'd4;
  190. else if (isr[2] == 1'b1) hp_isr <= 3'd5;
  191. else if (isr[3] == 1'b1) hp_isr <= 3'd6;
  192. else if (isr[4] == 1'b1) hp_isr <= 3'd7;
  193. end
  194. 3'd1:
  195. begin
  196. if (isr[6] == 1'b1) hp_isr <= 3'd0;
  197. else if (isr[7] == 1'b1) hp_isr <= 3'd1;
  198. else if (isr[0] == 1'b1) hp_isr <= 3'd2;
  199. else if (isr[1] == 1'b1) hp_isr <= 3'd3;
  200. else if (isr[2] == 1'b1) hp_isr <= 3'd4;
  201. else if (isr[3] == 1'b1) hp_isr <= 3'd5;
  202. else if (isr[4] == 1'b1) hp_isr <= 3'd6;
  203. else if (isr[5] == 1'b1) hp_isr <= 3'd7;
  204. end
  205. 3'd0:
  206. begin
  207. if (isr[7] == 1'b1) hp_isr <= 3'd0;
  208. else if (isr[0] == 1'b1) hp_isr <= 3'd1;
  209. else if (isr[1] == 1'b1) hp_isr <= 3'd2;
  210. else if (isr[2] == 1'b1) hp_isr <= 3'd3;
  211. else if (isr[3] == 1'b1) hp_isr <= 3'd4;
  212. else if (isr[4] == 1'b1) hp_isr <= 3'd5;
  213. else if (isr[5] == 1'b1) hp_isr <= 3'd6;
  214. else if (isr[6] == 1'b1) hp_isr <= 3'd7;
  215. end
  216. endcase
  217. // FOR /L %i in (0, 1, 7) do (ECHO "else if (isr[%i] == 1) hp_isr <= %i;" >>a.txt)
  218. end
  219. end
  220. endmodule