RISC5Top.Lola.txt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. MODULE RISC5Top( (*NW 23.9.2015*)
  2. IN CLK50M: BIT;
  3. IN btn: [4] BIT;
  4. IN swi: BYTE;
  5. IN RxD: BIT;
  6. OUT TxD: BIT;
  7. OUT leds: BYTE;
  8. OUT SRce0, SRce1, SRwe, SRoe: BIT; (*SRAM*)
  9. OUT SRbe: [4] BIT;
  10. OUT SRadr: [18] BIT;
  11. INOUT SRdat: WORD;
  12. IN MISO: [2] BIT; (*SPI - SD card & network*)
  13. OUT SCLK, MOSI, SS: [2] BIT;
  14. OUT NEN: BIT; (*network enable*)
  15. OUT hsync, vsync: BIT; (*video control*)
  16. OUT RGB: [3] BIT;
  17. IN PS2C, PS2D: BIT; (*keyboard*)
  18. INOUT msclk, msdat: BIT;
  19. INOUT gpio: BYTE);
  20. (* I/O addresses:
  21. 0 millisconds / --
  22. 1 switches / LEDs
  23. 2 RS232 data / data (start)
  24. 3 RS232 status / control
  25. 4 SPI data / data (start)
  26. 5 SPI status / control
  27. 6 PS2 keyboard data
  28. 7 mouse
  29. 8 general-purpose I/O data
  30. 9 general-purpose I/O tri-state control *)
  31. TYPE RISC5 := MODULE (
  32. IN clk, rst, stallX: BIT;
  33. inbus, codebus: WORD;
  34. OUT adr: [24] BIT;
  35. rd, wr, ben: BIT;
  36. outbus: WORD) ^;
  37. RS232R := MODULE (
  38. IN clk, rst, done, RxD, fsel: BIT;
  39. OUT rdy: BIT; data: BYTE) ^;
  40. RS232T := MODULE (
  41. IN clk, rst, start, fsel: BIT; data: BYTE;
  42. OUT rdy, TxD: BIT) ^;
  43. SPI := MODULE (
  44. IN clk, rst, start, fast: BIT; dataTx: WORD;
  45. OUT dataRx: WORD; rdy: BIT;
  46. IN MISO: BIT;
  47. OUT MOSI, SCLK: BIT) ^;
  48. VID := MODULE (
  49. IN clk, inv: BIT; viddata: WORD;
  50. OUT req: BIT; vidadr: [18] BIT;
  51. hsync, vsync: BIT; RGB: [3] BIT) ^;
  52. MouseP := MODULE (
  53. IN clk, rst: BIT;
  54. INOUT msclk, msdat: BIT;
  55. OUT out: [28] BIT) ^;
  56. PS2 = MODULE (
  57. IN clk, rst, done: BIT;
  58. OUT rdy, shift: BIT; data: BYTE;
  59. IN PS2C, PS2D: BIT) ^;
  60. REG (CLK50M) clk: BIT;
  61. REG (clk) rst: BIT;
  62. bitrate: BIT; (*RS-232*)
  63. Lreg: BYTE; (*LED*)
  64. cnt0: [16] BIT;
  65. cnt1: WORD; (*milliseconds*)
  66. spiCtrl: [4] BIT;
  67. gpout, gpoc: BYTE;
  68. VAR riscx: RISC5;
  69. receiver: RS232R;
  70. transmitter: RS232T;
  71. spi: SPI; (*CD-ROM and net*)
  72. vid: VID;
  73. kbd: PS2;
  74. Ms: MouseP;
  75. dmy: BIT;
  76. adr: [24] BIT;
  77. iowadr: [4] BIT; (*word adress*)
  78. rd, wr, ben, ioenb, dspreq: BIT;
  79. be0, be1: BIT;
  80. inbus, inbus0: WORD; (*data to RISC6 core*)
  81. outbus: WORD; (*data from RISC6 core*)
  82. dataTx, dataRx, dataKbd: BYTE;
  83. rdyRx, doneRx, startTx, rdyTx, rdyKbd, doneKbd: BIT;
  84. dataMs: [28] BIT; (*mouse*)
  85. limit: BIT; (*of cnt0*)
  86. spiRx: WORD;
  87. spiStart, spiRdy, MOSI1, SCLK1: BIT;
  88. vidadr: [18] BIT;
  89. gpin: BYTE;
  90. BEGIN
  91. riscx (clk, rst, dspreq, inbus, inbus0, adr, rd, wr, ben, outbus);
  92. receiver (clk, rst, doneRx, RxD, bitrate, rdyRx, dataRx);
  93. transmitter (clk, rst, startTx, bitrate, dataTx, rdyTx, TxD);
  94. spi (clk, rst, spiStart, spiCtrl.2, outbus, spiRx, spiRdy, MISO.0 & MISO.1, MOSI1, SCLK1);
  95. vid (clk, swi.7, inbus0, dspreq, vidadr, hsync, vsync, RGB);
  96. kbd (clk, rst, doneKbd, rdyKbd, dmy, dataKbd, PS2C, PS2D);
  97. Ms (clk, rst, msclk, msdat, dataMs);
  98. TS(SRdat, inbus0, outbus, ~wr);
  99. TS(gpio, gpin, gpout, gpoc);
  100. iowadr := adr[5:2];
  101. ioenb := (adr[23:6] = 3FFFFH'18);
  102. inbus := ~ioenb -> inbus0 :
  103. ((iowadr = 0) -> cnt1 :
  104. (iowadr = 1) -> {0'20, btn, swi} :
  105. (iowadr = 2) -> {0'24, dataRx} :
  106. (iowadr = 3) -> {0'30, rdyTx, rdyRx} :
  107. (iowadr = 4) -> spiRx :
  108. (iowadr = 5) -> {0'31, spiRdy} :
  109. (iowadr = 6) -> {0'3, rdyKbd, dataMs} :
  110. (iowadr = 7) -> {0'24, dataKbd} :
  111. (iowadr = 8) -> {0'24, gpin} :
  112. (iowadr = 9) -> {0'24, gpoc} : 0'32);
  113. (*access to SRAM*)
  114. be0 := ben & adr.0;
  115. be1 := ben & ~adr.0;
  116. SRce0 := ben & adr.1;
  117. SRce1 := ben & ~adr.1;
  118. SRwe := ~wr | clk;
  119. SRoe := wr;
  120. SRbe := {be1, be0, be1, be0};
  121. SRadr := dspreq -> vidadr : adr[19:2];
  122. dataTx := outbus[7:0];
  123. startTx := wr & ioenb & (iowadr = 2);
  124. doneRx := rd & ioenb & (iowadr = 2);
  125. spiStart := wr & ioenb & (iowadr = 4);
  126. doneKbd := rd & ioenb & (iowadr = 7);
  127. limit := (cnt0 = 24999);
  128. leds := Lreg;
  129. SS := ~spiCtrl[1:0]; (*active low slave select*)
  130. MOSI := {MOSI1, MOSI1}; SCLK := {SCLK1, SCLK1};
  131. NEN := spiCtrl[3];
  132. rst := (cnt1[4:0] = 0'5) & limit -> ~btn[3] : rst;
  133. Lreg := ~rst -> 0 : (wr & ioenb & (iowadr = 1)) -> outbus[7:0] : Lreg;
  134. spiCtrl := ~rst -> 0 : (wr & ioenb & (iowadr = 5)) -> outbus[3:0] : spiCtrl;
  135. bitrate := ~rst -> 0 : (wr & ioenb & (iowadr = 3)) -> outbus[0] : bitrate;
  136. gpout := ~rst -> 0 : (wr & ioenb & (iowadr = 8)) -> outbus[7:0] : gpout;
  137. gpoc := ~rst -> 0 : (wr & ioenb & (iowadr = 9)) -> outbus[7:0] : gpoc;
  138. cnt0 := limit -> 0 : cnt0 + 1;
  139. cnt1 := cnt1 + limit;
  140. clk := ~clk (* @ 50 MHz *)
  141. END RISC5Top.