project.sv 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. interface processor_port(
  2. input clk, rst,
  3. // RAM
  4. output [23:0] ram_addr,
  5. output [15:0] ram_wr_data,
  6. input [15:0] ram_rd_data,
  7. output ram_wr_en,
  8. output ram_rd_en,
  9. input ram_busy,
  10. input ram_rd_ready,
  11. input ram_rd_ack,
  12. // COM
  13. output [7:0] com_addr,
  14. output [7:0] com_wr,
  15. input [7:0] com_rd,
  16. input com_interrupt
  17. );
  18. endinterface
  19. module com_block(
  20. input clk, rst,
  21. // Communication to processor
  22. input wire [7:0] addr,
  23. input reg [7:0] in_data,
  24. output reg [7:0] out_data,
  25. output wire interrupt,
  26. // IO
  27. output reg [7:0] leds,
  28. input wire [3:0] switches,
  29. output wire uart0_tx,
  30. input wire uart0_rx,
  31. input wire key1
  32. );
  33. /* UART */
  34. reg [2:0] uart0_reg;
  35. reg uart0_transmit;
  36. reg [7:0] tx_byte, rx_byte;
  37. // Clock divide = 1e6 / (9600 * 4)
  38. uart#(.CLOCK_DIVIDE(26)) uart0(
  39. .clk(clk),
  40. .rst(rst),
  41. .rx(uart0_rx),
  42. .tx(uart0_tx),
  43. .tx_byte(tx_byte),
  44. .rx_byte(rx_byte),
  45. .received(uart0_reg[0]),
  46. .is_receiving(uart0_reg[1]),
  47. .is_transmitting(uart0_reg[2]),
  48. .transmit(uart0_transmit)
  49. );
  50. always_ff@(posedge clk) begin
  51. if(addr == 8'h06) leds <= in_data;
  52. if(addr == 8'h05) tx_byte <= in_data;
  53. if(addr == 8'h05) uart0_transmit <= 1;
  54. else uart0_transmit <= 0;
  55. end
  56. always_comb begin
  57. case(addr)
  58. 8'h04: out_data = {5'b0, uart0_reg};
  59. 8'h05: out_data = {5'b0, uart0_reg};
  60. 8'h07: out_data = {4'b0, switches};
  61. default: out_data = 0;
  62. endcase
  63. end
  64. endmodule
  65. module sdram_block(
  66. input mclk, fclk, rst,
  67. // SDRAM Control
  68. input [23:0] ram_addr,
  69. input [15:0] ram_wr_data,
  70. output [15:0] ram_rd_data,
  71. input ram_wr_en,
  72. input ram_rd_en,
  73. output ram_busy,
  74. output ram_rd_ready,
  75. output ram_rd_ack,
  76. // SDRAM I/O
  77. inout [15:0] DRAM_DQ, // Data
  78. output [12:0] DRAM_ADDR, // Address
  79. output [1:0] DRAM_DQM, // Byte Data Mask
  80. output DRAM_CLK, // Clock
  81. output DRAM_CKE, // Clock Enable
  82. output DRAM_WE_N, // Write Enable
  83. output DRAM_CAS_N, // Column Address Strobe
  84. output DRAM_RAS_N, // Row Address Strobe
  85. output DRAM_CS_N, // Chip Select
  86. output [1:0] DRAM_BA // Bank Address
  87. );
  88. /* SDRAM */
  89. // 1 MHz side wires
  90. wire [39:0] wr_fifo;// Address 24-bit and 16-bit Data
  91. wire wr_enable; // wr_enable ] <-> [ wr : wr_enable to push fifo
  92. wire wr_full; // wr_full ] <-> [ full : signal that we are full
  93. wire rd_enable; // rd_enable - wr : rd_enable to push rd addr to fifo
  94. wire rdaddr_full; // rdaddr_full - full : signal we cannot read more
  95. wire [15:0] rddo_fifo;
  96. wire ctrl_rd_ready; // wr - rd_ready : push data from dram to fifo
  97. // 100MHz side wires
  98. wire [39:0] wro_fifo;
  99. wire ctrl_busy; // rd ] <-> [ busy : pop fifo when ctrl not busy
  100. wire ctrl_wr_enable; // empty_n - wr_enable : signal ctrl data is ready
  101. wire [23:0] rdao_fifo;
  102. wire ctrl_rd_enable; // empty_n - rd_enable : signal ctrl addr ready
  103. wire [15:0] rddata_fifo;
  104. wire rd_ready; // rd_ready - empty_n : signal interface data ready
  105. wire rd_ack; // rd_ack - rd : pop fifo after data read
  106. wire busy; // RAM is busy because RW FIFO is full
  107. assign busy = wr_full | rdaddr_full;
  108. fifo #(.BUS_WIDTH(40)) dram_wr_fifo (
  109. .wr_clk (mclk),
  110. .rd_clk (fclk),
  111. .wr_data (wr_fifo),
  112. .rd_data (wro_fifo),
  113. .rd (ctrl_busy),
  114. .wr (wr_enable),
  115. .full (wr_full),
  116. .empty_n (ctrl_wr_enable),
  117. .rst_n (rst)
  118. );
  119. fifo #(.BUS_WIDTH(24)) dram_rd_addr_fifo (
  120. .wr_clk (mclk),
  121. .rd_clk (fclk),
  122. .wr_data (wr_fifo[39:16]),
  123. .rd_data (rdao_fifo),
  124. .rd (ctrl_busy),
  125. .wr (rd_enable),
  126. .full (rdaddr_full),
  127. .empty_n (ctrl_rd_enable),
  128. .rst_n (rst)
  129. );
  130. fifo #(.BUS_WIDTH(16)) dram_rd_data_fifo (
  131. .wr_clk (fclk),
  132. .rd_clk (mclk),
  133. .wr_data (rddo_fifo),
  134. .rd_data (rddata_fifo),
  135. .rd (rd_ack),
  136. .wr (ctrl_rd_ready),
  137. .empty_n (rd_ready),
  138. .rst_n (rst)
  139. );
  140. // Setting SDRAM clock to 100MHz
  141. assign DRAM_CLK = fclk;
  142. sdram_controller sdram_control0 (
  143. // HOST INTERFACE
  144. .wr_addr (wro_fifo[39:16]),
  145. .wr_data (wro_fifo[15:0]),
  146. .wr_enable (ctrl_wr_enable),
  147. .rd_addr (rdao_fifo),
  148. .rd_data (rddo_fifo),
  149. .rd_ready (ctrl_rd_ready),
  150. .rd_enable (ctrl_rd_enable),
  151. .busy (ctrl_busy),
  152. .rst_n (rst),
  153. .clk (fclk),
  154. // SDRAM SIDE
  155. .addr (DRAM_ADDR),
  156. .bank_addr (DRAM_BA),
  157. .data (DRAM_DQ),
  158. .clock_enable (DRAM_CKE),
  159. .cs_n (DRAM_CS_N),
  160. .ras_n (DRAM_RAS_N),
  161. .cas_n (DRAM_CAS_N),
  162. .we_n (DRAM_WE_N),
  163. .data_mask_low (DRAM_DQM[0]),
  164. .data_mask_high(DRAM_DQM[1])
  165. );
  166. // Assign inputs
  167. assign wr_fifo[39:16] = ram_addr;
  168. assign wr_fifo[15:0] = ram_wr_data;
  169. assign wr_enable = ram_wr_en;
  170. assign rd_enable = ram_rd_en;
  171. // Assign outputs
  172. assign ram_rd_data = rddata_fifo;
  173. assign ram_busy = busy;
  174. assign ram_rd_ready = rd_ready;
  175. assign ram_rd_ack = rd_ack;
  176. endmodule