RISC5Top.v 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. `timescale 1ns / 1ps // 14.6.2018
  2. // with SRAM, and gpio
  3. // PS/2 mouse and network 7.1.2014 PDR
  4. module RISC5Top(
  5. input CLK50M,
  6. input [3:0] btn,
  7. input [7:0] swi,
  8. input RxD, // RS-232
  9. output TxD,
  10. output [7:0] leds,
  11. output SRce0, SRce1, SRwe, SRoe, //SRAM
  12. output [3:0] SRbe,
  13. output [17:0] SRadr,
  14. inout [31:0] SRdat,
  15. input [1:0] MISO, // SPI - SD card & network
  16. output [1:0] SCLK, MOSI,
  17. output [1:0] SS,
  18. output NEN, // network enable
  19. output hsync, vsync, // video controller
  20. output [2:0] RGB,
  21. input PS2C, PS2D, // keyboard
  22. inout msclk, msdat,
  23. inout [7:0] gpio);
  24. // IO addresses for input / output
  25. // 0 -64 FFFFC0 milliseconds / --
  26. // 1 -60 FFFFC4 switches / LEDs
  27. // 2 -56 FFFFC8 RS-232 data / RS-232 data (start)
  28. // 3 -52 FFFFCC RS-232 status / RS-232 control
  29. // 4 -48 FFFFD0 SPI data / SPI data (start)
  30. // 5 -44 FFFFD4 SPI status / SPI control
  31. // 6 -40 FFFFD8 PS2 mouse data, keyboard status / --
  32. // 7 -36 FFFFDC keyboard data / --
  33. // 8 -32 FFFFE0 general-purpose I/O data
  34. // 9 -28 FFFFE4 general-purpose I/O tri-state control
  35. reg rst, clk;
  36. wire[23:0] adr;
  37. wire [3:0] iowadr; // word address
  38. wire [31:0] inbus, inbus0; // data to RISC core
  39. wire [31:0] outbus; // data from RISC core
  40. wire [31:0] romout, codebus; // code to RISC core
  41. wire SRbe0, SRbe1;
  42. wire rd, wr, ben, ioenb, vidreq;
  43. wire [7:0] dataTx, dataRx, dataKbd;
  44. wire rdyRx, doneRx, startTx, rdyTx, rdyKbd, doneKbd;
  45. wire [27:0] dataMs;
  46. reg bitrate; // for RS232
  47. wire limit; // of cnt0
  48. reg [7:0] Lreg;
  49. reg [15:0] cnt0;
  50. reg [31:0] cnt1; // milliseconds
  51. wire [31:0] spiRx;
  52. wire spiStart, spiRdy;
  53. reg [3:0] spiCtrl;
  54. wire [17:0] vidadr;
  55. reg [7:0] gpout, gpoc;
  56. wire [7:0] gpin;
  57. RISC5 riscx(.clk(clk), .rst(rst), .irq(limit),
  58. .rd(rd), .wr(wr), .ben(ben), .stallX(vidreq),
  59. .adr(adr), .codebus(codebus), .inbus(inbus),
  60. .outbus(outbus));
  61. PROM PM (.adr(adr[10:2]), .data(romout), .clk(~clk));
  62. RS232R receiver(.clk(clk), .rst(rst), .RxD(RxD), .fsel(bitrate),
  63. .done(doneRx), .data(dataRx), .rdy(rdyRx));
  64. RS232T transmitter(.clk(clk), .rst(rst), .start(startTx),
  65. .fsel(bitrate), .data(dataTx), .TxD(TxD), .rdy(rdyTx));
  66. SPI spi(.clk(clk), .rst(rst), .start(spiStart), .dataTx(outbus),
  67. .fast(spiCtrl[2]), .dataRx(spiRx), .rdy(spiRdy),
  68. .SCLK(SCLK[0]), .MOSI(MOSI[0]), .MISO(MISO[0] & MISO[1]));
  69. VID vid(.clk(clk), .req(vidreq), .inv(swi[7]),
  70. .vidadr(vidadr), .viddata(inbus0), .RGB(RGB),
  71. .hsync(hsync), .vsync(vsync));
  72. PS2 kbd(.clk(clk), .rst(rst), .done(doneKbd), .rdy(rdyKbd), .shift(),
  73. .data(dataKbd), .PS2C(PS2C), .PS2D(PS2D));
  74. MouseP Ms(.clk(clk), .rst(rst), .msclk(msclk),
  75. .msdat(msdat), .out(dataMs));
  76. assign codebus = (adr[23:14] == 10'h3FF) ? romout : inbus0;
  77. assign iowadr = adr[5:2];
  78. assign ioenb = (adr[23:6] == 18'h3FFFF);
  79. assign inbus = ~ioenb ? inbus0 :
  80. ((iowadr == 0) ? cnt1 :
  81. (iowadr == 1) ? {20'b0, btn, swi} :
  82. (iowadr == 2) ? {24'b0, dataRx} :
  83. (iowadr == 3) ? {30'b0, rdyTx, rdyRx} :
  84. (iowadr == 4) ? spiRx :
  85. (iowadr == 5) ? {31'b0, spiRdy} :
  86. (iowadr == 6) ? {3'b0, rdyKbd, dataMs} :
  87. (iowadr == 7) ? {24'b0, dataKbd} :
  88. (iowadr == 8) ? {24'b0, gpin} :
  89. (iowadr == 9) ? {24'b0, gpoc} : 0);
  90. assign SRce0 = ~(~ben | ~adr[1]);
  91. assign SRce1 = ~(~ben | adr[1]);
  92. assign SRbe0 = ~(~ben | ~adr[0]);
  93. assign SRbe1 = ~(~ben | adr[0]);
  94. assign SRwe = ~wr | clk;
  95. assign SRoe = wr;
  96. assign SRbe = {SRbe1, SRbe0, SRbe1, SRbe0};
  97. assign SRadr = vidreq ? vidadr : adr[19:2];
  98. genvar i;
  99. generate // tri-state buffer for SRAM
  100. for (i = 0; i < 32; i = i+1)
  101. begin: bufblock
  102. IOBUF SRbuf (.I(outbus[i]), .O(inbus0[i]), .IO(SRdat[i]), .T(~wr));
  103. end
  104. endgenerate
  105. generate // tri-state buffer for gpio port
  106. for (i = 0; i < 8; i = i+1)
  107. begin: gpioblock
  108. IOBUF gpiobuf (.I(gpout[i]), .O(gpin[i]), .IO(gpio[i]), .T(~gpoc[i]));
  109. end
  110. endgenerate
  111. assign dataTx = outbus[7:0];
  112. assign startTx = wr & ioenb & (iowadr == 2);
  113. assign doneRx = rd & ioenb & (iowadr == 2);
  114. assign limit = (cnt0 == 24999);
  115. assign leds = Lreg;
  116. assign spiStart = wr & ioenb & (iowadr == 4);
  117. assign SS = ~spiCtrl[1:0]; //active low slave select
  118. assign MOSI[1] = MOSI[0], SCLK[1] = SCLK[0], NEN = spiCtrl[3];
  119. assign doneKbd = rd & ioenb & (iowadr == 7);
  120. always @(posedge clk)
  121. begin
  122. rst <= ((cnt1[4:0] == 0) & limit) ? ~btn[3] : rst;
  123. Lreg <= ~rst ? 0 : (wr & ioenb & (iowadr == 1)) ? outbus[7:0] : Lreg;
  124. cnt0 <= limit ? 0 : cnt0 + 1;
  125. cnt1 <= cnt1 + limit;
  126. spiCtrl <= ~rst ? 0 : (wr & ioenb & (iowadr == 5)) ? outbus[3:0] : spiCtrl;
  127. bitrate <= ~rst ? 0 : (wr & ioenb & (iowadr == 3)) ? outbus[0] : bitrate;
  128. gpout <= (wr & ioenb & (iowadr == 8)) ? outbus[7:0] : gpout;
  129. gpoc <= ~rst ? 0 : (wr & ioenb & (iowadr == 9)) ? outbus[7:0] : gpoc;
  130. end
  131. always @ (posedge CLK50M) clk <= ~clk;
  132. endmodule