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

VHDL/FPGA/Verilog

开发平台:

VHDL

  1. module core(cs, rd, wr, inta, a0, reset, isrset, code, datain, busdatain, ltim, sm, rd_isr, rd_imr, wr_imr, clr_imr, rd_irr, eor, setzero, sp, dataout, busdataout);
  2. input cs;
  3. input rd, wr;
  4. input inta;
  5. input a0;
  6. input reset;
  7. input[7:0] isrset;
  8. input[2:0] code;
  9. input[7:0] datain, busdatain;
  10. output ltim;
  11. output sm;
  12. output rd_isr;
  13. output rd_imr, wr_imr, clr_imr;
  14. output rd_irr;
  15. output[7:0] eor;
  16. output[7:0] setzero;
  17. output[2:0] sp;
  18. output[7:0] dataout;
  19. output[7:0] busdataout;
  20. reg[2:0] state;
  21. wire write1, write2, clk;
  22. wire[7:0] icw1, icw2, icw3, icw4, ocw1, ocw2, ocw3;
  23. wire o1;
  24. wire[5:0] codeocw2, erocw2;
  25. //reg[1:0] edge1;
  26. initial begin state = 3'd1; end
  27. assign write1 = (~cs && ~wr && rd && ~a0) ? 1 : 0;
  28. assign write2 = (~cs && ~wr && rd && a0) ? 1 : 0;
  29. assign clk = write1 | write2;
  30. assign icw1 = reset ? 8'h00 : (state == 1 && write1 ? datain : icw1);
  31. assign icw2 = reset ? 8'h00 : (state == 2 && write1 ? datain : icw2);
  32. assign icw3 = reset ? 8'h00 : (state == 3 && write1 ? datain : icw3);
  33. assign icw4 = reset ? 8'h00 : (state == 4 && write1 ? datain : icw4);
  34. assign ocw1 = reset ? 8'h00 : (state == 5 && write2 ? datain : ocw1);
  35. assign ocw2 = reset ? 8'h00 : (state == 5 && write1 && datain[4:3] == 2'b00 ? datain : ocw2);
  36. assign ocw3 = reset ? 8'h00 : (state == 5 && write1 && datain[4:3] == 2'b01 ? datain : ocw3);
  37. assign ltim = icw1[3];
  38. assign read1 = (~cs && wr && ~rd && a0) ? 1 : 0;
  39. assign read1 = (~cs && wr && ~rd && ~a0) ? 1 : 0;
  40. assign dataout = (read2 || (read1 && ocw3[1] == 1)) ? busdatain : ((flag2 == 0 && flag1 == 1) ? {icw2[7:3], code[2:0]} : 8'b0);
  41. assign o1 = (state==5 && write2);
  42. assign busdataout = o1 ? ocw1 : 8'b0;
  43. assign sm = (ocw3[6:5] == 2'b10) ? 1 : 0;
  44. assign rd_irr = (read1 && ocw3[1:0] == 2'b10) ? 1 : 0;
  45. assign rd_isr = (read1 && ocw3[1:0] == 2'b11) ? 1 : 0;
  46. always @(posedge clk or posedge reset)
  47. begin
  48. if (reset) state <= 1;
  49. else
  50. begin
  51. case (state)
  52. 1:
  53. if (write2)
  54. begin
  55. state <= 2;
  56. //edge1 = 2'b01;
  57. end
  58. 2:
  59. begin
  60. if (~icw1[1])
  61. state <= 3;
  62. else if (icw1[0])
  63. state <= 4;
  64. else
  65. state <= 5;
  66. end
  67. 3:
  68. begin
  69. if (icw1[0])
  70. state <= 4;
  71. else
  72. state <= 5;
  73. end
  74. 4:
  75. //if (edge1 == 2'b11)
  76. state <= 5;
  77. 5:
  78. if (write1 && datain[4])
  79. state <= 1;
  80. end
  81. end
  82. assign codeocw2 = {code, ocw2[2:0]};
  83. always @(codeocw2)
  84. begin
  85. if (reset || mclr)
  86. er <= 8'hff;
  87. else if (icw4[1])
  88. begin
  89. if (flag2)
  90. begin
  91. case (code)
  92. 3'd0: er <= 
  93. end
  94. end
  95. end
  96. endmodule