iodevs.vh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. localparam IODEV_ADDR_BITS = 'h00000004; // 4
  2. localparam IODEV_ADDR_SHIFT = 'h00000007; // 7
  3. localparam SDRAM_ADDR = 'h40000000; // 1073741824
  4. localparam SDRAM_BITS = 'h00000019; // 25
  5. localparam SRAM_ADDR = 'h00000000; // 0
  6. localparam SRAM_BITS = 'h0000000f; // 15
  7. localparam SYS_MAGIC_MAX80 = 'h3858414d; // 945307981
  8. localparam XDEV_ADDR_BITS = 'h00000002; // 2
  9. localparam XDEV_ADDR_SHIFT = 'h0000001c; // 28
  10. localparam _PC_IRQ = 'h00000020; // 32
  11. localparam _PC_RESET = 'h00000010; // 16
  12. reg [31:0] nxdev_rdata;
  13. reg [31:0] iodev_rdata;
  14. wire [ 3:0] xdev_valid = iodev_mem_valid << cpu_mem_addr[29:28];
  15. wire [15:0] iodev_valid = xdev_valid[3] << cpu_mem_addr[10:7];
  16. wire [31:0] iodev_rdata_sys;
  17. wire [ 0:0] iodev_valid_sys = iodev_valid[0:0];
  18. tri1 [ 0:0] iodev_wait_n_sys;
  19. wire [31:0] iodev_rdata_sysclock;
  20. wire [ 0:0] iodev_irq_sysclock;
  21. wire [ 0:0] iodev_valid_sysclock = iodev_valid[1:1];
  22. tri1 [ 0:0] iodev_wait_n_sysclock;
  23. wire [31:0] iodev_rdata_console;
  24. wire [ 0:0] iodev_irq_console;
  25. wire [ 0:0] iodev_valid_console = iodev_valid[2:2];
  26. tri1 [ 0:0] iodev_wait_n_console;
  27. wire [31:0] iodev_rdata_romcopy;
  28. wire [ 0:0] iodev_irq_romcopy;
  29. wire [ 0:0] iodev_valid_romcopy = iodev_valid[3:3];
  30. tri1 [ 0:0] iodev_wait_n_romcopy;
  31. wire [31:0] iodev_rdata_sdcard;
  32. wire [ 0:0] iodev_irq_sdcard;
  33. wire [ 0:0] iodev_valid_sdcard = iodev_valid[4:4];
  34. tri1 [ 0:0] iodev_wait_n_sdcard;
  35. wire [31:0] iodev_rdata_i2c;
  36. wire [ 0:0] iodev_irq_i2c;
  37. wire [ 0:0] iodev_valid_i2c = iodev_valid[5:5];
  38. tri1 [ 0:0] iodev_wait_n_i2c;
  39. wire [31:0] iodev_rdata_esp;
  40. wire [ 0:0] iodev_irq_esp;
  41. wire [ 0:0] iodev_valid_esp = iodev_valid[6:6];
  42. tri1 [ 0:0] iodev_wait_n_esp;
  43. wire [31:0] iodev_rdata_abc;
  44. wire [ 0:0] iodev_irq_abc;
  45. wire [ 0:0] iodev_valid_abc = iodev_valid[7:7];
  46. tri1 [ 0:0] iodev_wait_n_abc;
  47. wire [31:0] iodev_rdata_abcmemmap;
  48. wire [ 0:0] iodev_valid_abcmemmap = xdev_valid[0:0];
  49. tri1 [ 0:0] iodev_wait_n_abcmemmap;
  50. // I/O input MUX
  51. always_comb
  52. case (cpu_mem_addr[29:28])
  53. 2'd0: iodev_rdata = iodev_rdata_abcmemmap;
  54. 2'd3:
  55. case (cpu_mem_addr[10:7])
  56. 4'd0: iodev_rdata = iodev_rdata_sys;
  57. 4'd1: iodev_rdata = iodev_rdata_sysclock;
  58. 4'd2: iodev_rdata = iodev_rdata_console;
  59. 4'd3: iodev_rdata = iodev_rdata_romcopy;
  60. 4'd4: iodev_rdata = iodev_rdata_sdcard;
  61. 4'd5: iodev_rdata = iodev_rdata_i2c;
  62. 4'd6: iodev_rdata = iodev_rdata_esp;
  63. 4'd7: iodev_rdata = iodev_rdata_abc;
  64. default: iodev_rdata = 32'hxxxxxxxx;
  65. endcase
  66. default: iodev_rdata = 32'hxxxxxxxx;
  67. endcase
  68. tri0 [31:0] sys_irq;
  69. assign sys_irq[ 3] = iodev_irq_sysclock[0];
  70. assign sys_irq[ 4] = iodev_irq_console[0];
  71. assign sys_irq[ 5] = iodev_irq_romcopy[0];
  72. assign sys_irq[ 6] = iodev_irq_sdcard[0];
  73. assign sys_irq[ 7] = iodev_irq_i2c[0];
  74. assign sys_irq[ 8] = iodev_irq_esp[0];
  75. assign sys_irq[ 9] = iodev_irq_abc[0];
  76. localparam [31:0] irq_edge_mask = 32'h00000008;
  77. localparam [31:0] irq_masked = ~32'h000003ff;
  78. wire iodev_wait_n = (&iodev_wait_n_sys) &
  79. (&iodev_wait_n_sysclock) &
  80. (&iodev_wait_n_console) &
  81. (&iodev_wait_n_romcopy) &
  82. (&iodev_wait_n_sdcard) &
  83. (&iodev_wait_n_i2c) &
  84. (&iodev_wait_n_esp) &
  85. (&iodev_wait_n_abc) &
  86. (&iodev_wait_n_abcmemmap);