RISC5Top.v 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. `timescale 1ns / 1ps // 22.9.2015
  2. // with SRAM, byte access, flt.-pt., 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 milliseconds / --
  26. // 1 switches / LEDs
  27. // 2 RS-232 data / RS-232 data (start)
  28. // 3 RS-232 status / RS-232 control
  29. // 4 SPI data / SPI data (start)
  30. // 5 SPI status / SPI control
  31. // 6 PS2 keyboard / --
  32. // 7 mouse / --
  33. // 8 general-purpose I/O data
  34. // 9 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 rd, wr, ben, ioenb, dspreq;
  41. wire [7:0] dataTx, dataRx, dataKbd;
  42. wire rdyRx, doneRx, startTx, rdyTx, rdyKbd, doneKbd;
  43. wire [27:0] dataMs;
  44. reg bitrate; // for RS232
  45. wire limit; // of cnt0
  46. reg [7:0] Lreg;
  47. reg [15:0] cnt0;
  48. reg [31:0] cnt1; // milliseconds
  49. wire [31:0] spiRx;
  50. wire spiStart, spiRdy;
  51. reg [3:0] spiCtrl;
  52. wire [17:0] vidadr;
  53. reg [7:0] gpout, gpoc;
  54. wire [7:0] gpin;
  55. RISC5 riscx(.clk(clk), .rst(rst), .rd(rd), .wr(wr), .ben(ben), .stallX(dspreq),
  56. .adr(adr), .codebus(inbus0), .inbus(inbus), .outbus(outbus));
  57. RS232R receiver(.clk(clk), .rst(rst), .RxD(RxD), .fsel(bitrate), .done(doneRx),
  58. .data(dataRx), .rdy(rdyRx));
  59. RS232T transmitter(.clk(clk), .rst(rst), .start(startTx), .fsel(bitrate),
  60. .data(dataTx), .TxD(TxD), .rdy(rdyTx));
  61. SPI spi(.clk(clk), .rst(rst), .start(spiStart), .dataTx(outbus),
  62. .fast(spiCtrl[2]), .dataRx(spiRx), .rdy(spiRdy),
  63. .SCLK(SCLK[0]), .MOSI(MOSI[0]), .MISO(MISO[0] & MISO[1]));
  64. VID vid(.clk(clk), .req(dspreq), .inv(swi[7]),
  65. .vidadr(vidadr), .viddata(inbus0), .RGB(RGB), .hsync(hsync), .vsync(vsync));
  66. PS2 kbd(.clk(clk), .rst(rst), .done(doneKbd), .rdy(rdyKbd), .shift(),
  67. .data(dataKbd), .PS2C(PS2C), .PS2D(PS2D));
  68. MouseP Ms(.clk(clk), .rst(rst), .msclk(msclk), .msdat(msdat), .out(dataMs));
  69. assign iowadr = adr[5:2];
  70. assign ioenb = (adr[23:6] == 18'h3FFFF);
  71. assign inbus = ~ioenb ? inbus0 :
  72. ((iowadr == 0) ? cnt1 :
  73. (iowadr == 1) ? {20'b0, btn, swi} :
  74. (iowadr == 2) ? {24'b0, dataRx} :
  75. (iowadr == 3) ? {30'b0, rdyTx, rdyRx} :
  76. (iowadr == 4) ? spiRx :
  77. (iowadr == 5) ? {31'b0, spiRdy} :
  78. (iowadr == 6) ? {3'b0, rdyKbd, dataMs} :
  79. (iowadr == 7) ? {24'b0, dataKbd} :
  80. (iowadr == 8) ? {24'b0, gpin} :
  81. (iowadr == 9) ? {24'b0, gpoc} : 0);
  82. assign SRce0 = ben & adr[1];
  83. assign SRce1 = ben & ~adr[1];
  84. assign SRbe0 = ben & adr[0];
  85. assign SRbe1 = ben & ~adr[0];
  86. assign SRwe = ~wr | clk;
  87. assign SRoe = wr;
  88. assign SRbe = {SRbe1, SRbe0, SRbe1, SRbe0};
  89. assign SRadr = dspreq ? vidadr : adr[19:2];
  90. genvar i;
  91. generate // tri-state buffer for SRAM
  92. for (i = 0; i < 32; i = i+1)
  93. begin: bufblock
  94. IOBUF SRbuf (.I(outbus[i]), .O(inbus0[i]), .IO(SRdat[i]), .T(~wr));
  95. end
  96. endgenerate
  97. generate // tri-state buffer for gpio port
  98. for (i = 0; i < 8; i = i+1)
  99. begin: gpioblock
  100. IOBUF gpiobuf (.I(gpout[i]), .O(gpin[i]), .IO(gpio[i]), .T(~gpoc[i]));
  101. end
  102. endgenerate
  103. assign dataTx = outbus[7:0];
  104. assign startTx = wr & ioenb & (iowadr == 2);
  105. assign doneRx = rd & ioenb & (iowadr == 2);
  106. assign limit = (cnt0 == 24999);
  107. assign leds = Lreg;
  108. assign spiStart = wr & ioenb & (iowadr == 4);
  109. assign SS = ~spiCtrl[1:0]; //active low slave select
  110. assign MOSI[1] = MOSI[0], SCLK[1] = SCLK[0], NEN = spiCtrl[3];
  111. assign doneKbd = rd & ioenb & (iowadr == 7);
  112. always @(posedge clk)
  113. begin
  114. rst <= ((cnt1[4:0] == 0) & limit) ? ~btn[3] : rst;
  115. Lreg <= ~rst ? 0 : (wr & ioenb & (iowadr == 1)) ? outbus[7:0] : Lreg;
  116. cnt0 <= limit ? 0 : cnt0 + 1;
  117. cnt1 <= cnt1 + limit;
  118. spiCtrl <= ~rst ? 0 : (wr & ioenb & (iowadr == 5)) ? outbus[3:0] : spiCtrl;
  119. bitrate <= ~rst ? 0 : (wr & ioenb & (iowadr == 3)) ? outbus[0] : bitrate;
  120. gpout <= (wr & ioenb & (iowadr == 8)) ? outbus[7:0] : gpout;
  121. gpoc <= ~rst ? 0 : (wr & ioenb & (iowadr == 9)) ? outbus[7:0] : gpoc;
  122. end
  123. always @ (posedge CLK50M) clk <= ~clk;
  124. endmodule