top.sv 4.7 KB

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