top.sv 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * This is top level entity file.
  3. * It includes all cpu external modules like UART
  4. * and SDRAM controller.
  5. */
  6. // Compile OISC?
  7. `define OISC
  8. `ifdef OISC
  9. `include "oisc/cpu.sv"
  10. `elsif
  11. `include "risc/cpu.sv"
  12. `endif
  13. module top(
  14. input CLK50, // Clock 50MHz
  15. // Board connections
  16. input [3:0] SWITCH, // 4 Dip switches
  17. input [1:0] KEY, // 2 Keys
  18. output [7:0] LED, // 8 LEDs
  19. // UART
  20. input RX, // UART Receive
  21. output TX, // UART Transmit
  22. // SDRAM
  23. inout [15:0] DRAM_DQ, // Data
  24. output [12:0] DRAM_ADDR, // Address
  25. output [1:0] DRAM_DQM, // Byte Data Mask
  26. output DRAM_CLK, // Clock
  27. output DRAM_CKE, // Clock Enable
  28. output DRAM_WE_N, // Write Enable
  29. output DRAM_CAS_N, // Column Address Strobe
  30. output DRAM_RAS_N, // Row Address Strobe
  31. output DRAM_CS_N, // Chip Select
  32. output [1:0] DRAM_BA // Bank Address
  33. );
  34. `ifdef SYNTHESIS
  35. initial $display("Assuming this is synthesis");
  36. `else
  37. initial $display("Assuming this is simulation");
  38. `endif
  39. assign rst = ~KEY[0];
  40. /* Clocks */
  41. wire mclk; // Master clock 1MHz (for cpu)
  42. wire fclk; // Fast clock 100MHz (for sdram)
  43. wire aclk; // Auxiliary clock 32,768kHz (for timers)
  44. pll_clk pll_clk0 (
  45. .inclk0(CLK50),
  46. .areset(0),
  47. .c0(fclk),
  48. .c1(mclk),
  49. .c2(aclk)
  50. );
  51. //clk_dive#(28'd50) clk_div_mclk(CLK50, mclk);
  52. //assign mclk = ~KEY[1];
  53. //assign mclk = CLK50;
  54. wire [23:0] ram_addr;
  55. wire [15:0] ram_wr_data;
  56. wire [15:0] ram_rd_data;
  57. wire ram_wr_en;
  58. wire ram_rd_en;
  59. wire ram_busy;
  60. wire ram_rd_ready;
  61. wire ram_rd_ack;
  62. ram#("../../memory/risc8.data") ram_block0(ram_addr[11:0], mclk, ram_wr_data, ram_wr_en, ram_rd_en, ram_rd_data);
  63. //sdram_block sdram0(
  64. // .mclk(mclk),
  65. // .fclk(fclk),
  66. // .rst_n(~rst),
  67. // .ram_addr(racm_addr),
  68. // .ram_wr_data(ram_wr_data),
  69. // .ram_rd_data(ram_rd_data),
  70. // .ram_wr_en(ram_wr_en),
  71. // .ram_rd_en(ram_rd_en),
  72. // .ram_busy(ram_busy),
  73. // .ram_rd_ready(ram_rd_ready),
  74. // .ram_rd_ack(ram_rd_ack),
  75. // .DRAM_DQ(DRAM_DQ),
  76. // .DRAM_ADDR(DRAM_ADDR),
  77. // .DRAM_DQM(DRAM_DQM),
  78. // .DRAM_CLK(DRAM_CLK),
  79. // .DRAM_CKE(DRAM_CKE),
  80. // .DRAM_WE_N(DRAM_WE_N),
  81. // .DRAM_CAS_N(DRAM_CAS_N),
  82. // .DRAM_RAS_N(DRAM_RAS_N),
  83. // .DRAM_CS_N(DRAM_CS_N),
  84. // .DRAM_BA(DRAM_BA)
  85. //);
  86. //Communication block
  87. wire [7:0] com0_addr, com0_wr, com0_rd;
  88. wire com0_interrupt;
  89. com_block com0 (
  90. .clk(mclk),
  91. .rst(rst),
  92. .addr(com0_addr),
  93. .in_data(com0_wr),
  94. .out_data(com0_rd),
  95. .interrupt(com0_interrupt),
  96. .leds(LED),
  97. .switches(SWITCH),
  98. .uart0_rx(RX),
  99. .uart0_tx(TX),
  100. .key1(KEY[1])
  101. );
  102. // Processor
  103. processor_port port0 (
  104. .clk(mclk),
  105. .rst(rst),
  106. .ram_addr(ram_addr),
  107. .ram_wr_data(ram_wr_data),
  108. .ram_rd_data(ram_rd_data),
  109. .ram_wr_en(ram_wr_en),
  110. .ram_rd_en(ram_rd_en),
  111. .ram_busy(ram_busy),
  112. .ram_rd_ready(ram_rd_ready),
  113. .ram_rd_ack(ram_rd_ack),
  114. .com_addr(com0_addr),
  115. .com_wr(com0_wr),
  116. .com_rd(com0_rd),
  117. .com_interrupt(com0_interrupt)
  118. );
  119. `ifdef OISC
  120. oisc8_cpu cpu_block0(port0);
  121. `elsif
  122. risc8_cpu cpu_block0(port0);
  123. `endif
  124. endmodule
  125. module clk_dive(clock_in,clock_out);
  126. input clock_in; // input clock on FPGA
  127. output clock_out; // output clock after dividing the input clock by divisor
  128. reg[27:0] counter=28'd0;
  129. parameter DIVISOR = 28'd2;
  130. always @(posedge clock_in)
  131. begin
  132. counter <= counter + 28'd1;
  133. if(counter>=(DIVISOR-1))
  134. counter <= 28'd0;
  135. end
  136. assign clock_out = (counter<DIVISOR/2)?1'b0:1'b1;
  137. endmodule
  138. `timescale 1ns/1ns
  139. module top_tb;
  140. logic CLK50; // Clock 50MHz
  141. logic [3:0] SWITCH; // 4 Dip switches
  142. logic [1:0] KEY; // 2 Keys
  143. wire [7:0] LED; // 8 LEDs
  144. logic RX; // UART Receive
  145. logic TX; // UART Transmit
  146. wire [15:0] DRAM_DQ; // Data
  147. logic [12:0] DRAM_ADDR; // Address
  148. logic [1:0] DRAM_DQM; // Byte Data Mask
  149. logic DRAM_CLK; // Clock
  150. logic DRAM_CKE; // Clock Enable
  151. logic DRAM_WE_N; // Write Enable
  152. logic DRAM_CAS_N; // Column Address Strobe
  153. logic DRAM_RAS_N; // Row Address Strobe
  154. logic DRAM_CS_N; // Chip Select
  155. logic [1:0] DRAM_BA; // Bank Address
  156. top top0(
  157. CLK50,
  158. SWITCH,
  159. KEY,
  160. LED,
  161. RX,
  162. TX,
  163. DRAM_DQ,
  164. DRAM_ADDR,
  165. DRAM_DQM,
  166. DRAM_CLK,
  167. DRAM_CKE,
  168. DRAM_WE_N,
  169. DRAM_CAS_N,
  170. DRAM_RAS_N,
  171. DRAM_CS_N,
  172. DRAM_BA
  173. );
  174. initial if(top0.com0_addr == 8'h05) $display("%t UART0 send: %s", $time, top0.com0_wr);
  175. initial begin
  176. CLK50 = 0;
  177. KEY[0] = 0;
  178. KEY[1] = 1;
  179. SWITCH = 4'b0110;
  180. RX = 0;
  181. #1100ns;
  182. KEY[0] = 1;
  183. //#20us;
  184. //KEY[1] = 0;
  185. //#5us;
  186. //KEY[1] = 1;
  187. #300us;
  188. $stop;
  189. end
  190. initial forever #10ns CLK50 = ~CLK50;
  191. endmodule