top.sv 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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. // Adding external reset source
  36. wire debug_rst;
  37. sys_ss#("RST") sys_ss_rst(debug_rst);
  38. assign rst = ~KEY[0] | debug_rst;
  39. `else
  40. initial $display("Assuming this is simulation");
  41. assign rst = ~KEY[0];
  42. `endif
  43. /* Clocks */
  44. wire mclk; // Master clock 1MHz (for cpu)
  45. wire fclk; // Fast clock 100MHz (for sdram)
  46. wire aclk; // Auxiliary clock 32,768kHz (for timers)
  47. `ifdef DEBUG
  48. wire mclk1, mclk0, clkd;
  49. sys_ss#("CLKD", 1) sys_clkd(clkd);
  50. sys_ss#("MCLK", 1) sys_mclk(mclk0);
  51. assign mclk = clkd ? mclk0 : mclk1;
  52. pll_clk pll_clk0 (
  53. .inclk0(CLK50),
  54. .areset(0),
  55. .c0(fclk),
  56. .c1(mclk1),
  57. .c2(aclk)
  58. );
  59. `else
  60. pll_clk pll_clk0 (
  61. .inclk0(CLK50),
  62. .areset(0),
  63. .c0(fclk),
  64. .c1(mclk),
  65. .c2(aclk)
  66. );
  67. `endif
  68. //clk_dive#(28'd50) clk_div_mclk(CLK50, mclk);
  69. //assign mclk = ~KEY[1];
  70. //assign mclk = CLK50;
  71. wire [23:0] ram_addr;
  72. wire [15:0] ram_wr_data;
  73. wire [15:0] ram_rd_data;
  74. wire ram_wr_en;
  75. wire ram_rd_en;
  76. wire ram_busy;
  77. wire ram_rd_ready;
  78. wire ram_rd_ack;
  79. `ifdef OISC
  80. ram#({`RAMDIR, "oisc8.data"})
  81. `elsif
  82. ram#({`RAMDIR, "risc8.data"})
  83. `endif
  84. ram_block0(ram_addr[11:0], mclk, ram_wr_data, ram_wr_en, ram_rd_en, ram_rd_data);
  85. `ifdef DEBUG
  86. reg[23:0] ram_addr_rd_pr, ram_addr_wr_pr;
  87. reg[15:0] ram_data_rd_pr, ram_data_wr_pr;
  88. reg ram_rd_pr0;
  89. always_ff@(posedge mclk) begin
  90. ram_rd_pr0 <= ram_rd_en;
  91. if(ram_wr_en) begin
  92. ram_addr_wr_pr <= ram_addr;
  93. ram_data_wr_pr <= ram_wr_data;
  94. end
  95. if(ram_rd_en) ram_addr_rd_pr <= ram_addr;
  96. if(ram_rd_pr0) ram_data_rd_pr <= ram_rd_data;
  97. end
  98. sys_sp#("ramw",40) sys_ramw({ram_addr_wr_pr,ram_data_wr_pr});
  99. sys_sp#("ramr",40) sys_ramr({ram_addr_rd_pr,ram_data_rd_pr});
  100. `endif
  101. //sdram_block sdram0(
  102. // .mclk(mclk),
  103. // .fclk(fclk),
  104. // .rst_n(~rst),
  105. // .ram_addr(racm_addr),
  106. // .ram_wr_data(ram_wr_data),
  107. // .ram_rd_data(ram_rd_data),
  108. // .ram_wr_en(ram_wr_en),
  109. // .ram_rd_en(ram_rd_en),
  110. // .ram_busy(ram_busy),
  111. // .ram_rd_ready(ram_rd_ready),
  112. // .ram_rd_ack(ram_rd_ack),
  113. // .DRAM_DQ(DRAM_DQ),
  114. // .DRAM_ADDR(DRAM_ADDR),
  115. // .DRAM_DQM(DRAM_DQM),
  116. // .DRAM_CLK(DRAM_CLK),
  117. // .DRAM_CKE(DRAM_CKE),
  118. // .DRAM_WE_N(DRAM_WE_N),
  119. // .DRAM_CAS_N(DRAM_CAS_N),
  120. // .DRAM_RAS_N(DRAM_RAS_N),
  121. // .DRAM_CS_N(DRAM_CS_N),
  122. // .DRAM_BA(DRAM_BA)
  123. //);
  124. //Communication block
  125. wire [7:0] com0_addr, com0_wr, com0_rd;
  126. wire com0_interrupt;
  127. com_block com0 (
  128. `ifdef DEBUG
  129. .clk(mclk1),
  130. `else
  131. .clk(mclk),
  132. `endif
  133. .rst(rst),
  134. .addr(com0_addr),
  135. .in_data(com0_wr),
  136. .out_data(com0_rd),
  137. .interrupt(com0_interrupt),
  138. .leds(LED),
  139. .switches(SWITCH),
  140. .uart0_rx(RX),
  141. .uart0_tx(TX),
  142. .key1(KEY[1])
  143. );
  144. // Processor
  145. processor_port port0 (
  146. .clk(mclk),
  147. .rst(rst),
  148. .ram_addr(ram_addr),
  149. .ram_wr_data(ram_wr_data),
  150. .ram_rd_data(ram_rd_data),
  151. .ram_wr_en(ram_wr_en),
  152. .ram_rd_en(ram_rd_en),
  153. .ram_busy(ram_busy),
  154. .ram_rd_ready(ram_rd_ready),
  155. .ram_rd_ack(ram_rd_ack),
  156. .com_addr(com0_addr),
  157. .com_wr(com0_wr),
  158. .com_rd(com0_rd),
  159. .com_interrupt(com0_interrupt)
  160. );
  161. `ifdef OISC
  162. oisc8_cpu cpu_block0(port0);
  163. `elsif
  164. risc8_cpu cpu_block0(port0);
  165. `endif
  166. endmodule
  167. module clk_dive(clock_in,clock_out);
  168. input clock_in; // input clock on FPGA
  169. output clock_out; // output clock after dividing the input clock by divisor
  170. reg[27:0] counter=28'd0;
  171. parameter DIVISOR = 28'd2;
  172. always @(posedge clock_in)
  173. begin
  174. counter <= counter + 28'd1;
  175. if(counter>=(DIVISOR-1))
  176. counter <= 28'd0;
  177. end
  178. assign clock_out = (counter<DIVISOR/2)?1'b0:1'b1;
  179. endmodule
  180. `timescale 1ns/1ns
  181. module top_tb;
  182. logic CLK50; // Clock 50MHz
  183. logic [3:0] SWITCH; // 4 Dip switches
  184. logic [1:0] KEY; // 2 Keys
  185. wire [7:0] LED; // 8 LEDs
  186. logic RX; // UART Receive
  187. logic TX; // UART Transmit
  188. wire [15:0] DRAM_DQ; // Data
  189. logic [12:0] DRAM_ADDR; // Address
  190. logic [1:0] DRAM_DQM; // Byte Data Mask
  191. logic DRAM_CLK; // Clock
  192. logic DRAM_CKE; // Clock Enable
  193. logic DRAM_WE_N; // Write Enable
  194. logic DRAM_CAS_N; // Column Address Strobe
  195. logic DRAM_RAS_N; // Row Address Strobe
  196. logic DRAM_CS_N; // Chip Select
  197. logic [1:0] DRAM_BA; // Bank Address
  198. top top0(
  199. CLK50,
  200. SWITCH,
  201. KEY,
  202. LED,
  203. RX,
  204. TX,
  205. DRAM_DQ,
  206. DRAM_ADDR,
  207. DRAM_DQM,
  208. DRAM_CLK,
  209. DRAM_CKE,
  210. DRAM_WE_N,
  211. DRAM_CAS_N,
  212. DRAM_RAS_N,
  213. DRAM_CS_N,
  214. DRAM_BA
  215. );
  216. initial if(top0.com0_addr == 8'h05) $display("%t UART0 send: %s", $time, top0.com0_wr);
  217. initial begin
  218. CLK50 = 0;
  219. KEY[0] = 0;
  220. KEY[1] = 1;
  221. SWITCH = 4'b0110;
  222. RX = 0;
  223. #1100ns;
  224. KEY[0] = 1;
  225. //#20us;
  226. //KEY[1] = 0;
  227. //#5us;
  228. //KEY[1] = 1;
  229. #10us;
  230. $stop;
  231. end
  232. initial forever #10ns CLK50 = ~CLK50;
  233. endmodule