project.sv 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. `include "const.sv"
  2. interface processor_port(
  3. input clk, rst,
  4. // RAM
  5. output [23:0] ram_addr,
  6. output [15:0] ram_wr_data,
  7. input [15:0] ram_rd_data,
  8. output ram_wr_en,
  9. output ram_rd_en,
  10. input ram_busy,
  11. input ram_rd_ready,
  12. input ram_rd_ack,
  13. // COM
  14. output [7:0] com_addr,
  15. output [7:0] com_wr,
  16. input [7:0] com_rd,
  17. input com_interrupt
  18. );
  19. endinterface
  20. module com_block(
  21. input clk, rst,
  22. // Communication to processor
  23. input wire [7:0] addr,
  24. input reg [7:0] in_data,
  25. output reg [7:0] out_data,
  26. output reg interrupt,
  27. // IO
  28. output reg [7:0] leds,
  29. input wire [3:0] switches,
  30. output wire uart0_tx,
  31. input wire uart0_rx,
  32. input wire key1
  33. );
  34. /* UART */
  35. reg [3:0] uart0_reg;
  36. // UART REG
  37. // 0: Is Recieving
  38. // 1: Is Transmitting
  39. // 2: Echo ON
  40. // 3: Recieved and waiting
  41. reg uart0_recv;
  42. reg uart0_transmit;
  43. reg [7:0] tx_byte, rx_byte, rx_buf;
  44. // Clock divide = 1e6 / (9600 * 4) = 26
  45. // for 115200 clock divide = 2
  46. //uart#(.CLOCK_DIVIDE(1302)) uart0(
  47. uart#(.CLOCK_DIVIDE(`UART0_CLK_DIV)) uart0(
  48. .clk(clk),
  49. .rst(0),
  50. .rx(uart0_rx),
  51. .tx(uart0_tx),
  52. .tx_byte(tx_byte),
  53. .rx_byte(rx_byte),
  54. .received(uart0_recv),
  55. `ifdef SYNTHESIS
  56. .is_receiving(uart0_reg[0]),
  57. .is_transmitting(uart0_reg[1]),
  58. `endif
  59. .transmit(uart0_transmit)
  60. );
  61. initial uart0_reg[1:0] = 2'b00;
  62. //reg [7:0] reset_str [7];
  63. //reg [2:0] reset_seq;
  64. //always_comb begin
  65. // reset_str[0] = 8'h72;
  66. // reset_str[1] = 8'h65;
  67. // reset_str[2] = 8'h73;
  68. // reset_str[3] = 8'h65;
  69. // reset_str[4] = 8'h74;
  70. // reset_str[5] = 8'h2e;
  71. // reset_str[6] = 8'h10;
  72. //end
  73. reg interrupt_reg;
  74. assign interrupt = (key1 & interrupt_reg);
  75. always_ff@(posedge clk) begin
  76. if(rst) begin
  77. //reset_seq <= 0;
  78. uart0_reg[2] <= 0;
  79. uart0_reg[3] <= 0;
  80. //interrupt <= 0;
  81. interrupt_reg <= 0;
  82. leds <= 'b0000_0000;
  83. rx_buf <= 0;
  84. end
  85. //else if(~uart0_reg[2] && reset_seq != 7) reset_seq <= reset_seq + 1;
  86. else begin
  87. case(addr)
  88. 8'h03: uart0_reg[2] <= in_data[2];
  89. //8'h06: leds <= in_data;
  90. endcase
  91. if(~key1) interrupt_reg <= 1;
  92. if(interrupt) interrupt_reg <= 0;
  93. leds <= {3'b0, uart0_recv, uart0_reg};
  94. if(uart0_recv) begin
  95. uart0_reg[3] <= 1;
  96. rx_buf <= rx_byte;
  97. end
  98. if(~uart0_recv & addr == 8'h09) uart0_reg[3] <= 0;
  99. end
  100. end
  101. always_comb begin
  102. //tx_byte = 8'h23;
  103. //uart0_transmit = 1;
  104. uart0_transmit = (addr == 8'h05) || (uart0_recv && uart0_reg[2]);
  105. tx_byte = (uart0_recv && uart0_reg[2]) ? rx_byte : in_data;
  106. //tx_byte = in_data;
  107. case(addr)
  108. 8'h03: out_data = in_data; // Set uart0 flags
  109. 8'h04: out_data = {4'b0, uart0_reg}; // Read uart0 flags
  110. 8'h05: out_data = in_data; // Write to uart0
  111. 8'h07: out_data = leds; // Read current LEDs
  112. 8'h08: out_data = {4'b0, switches}; // Read DIP
  113. 8'h09: out_data = rx_buf; // Write to uart0
  114. default: out_data = 0;
  115. endcase
  116. end
  117. endmodule
  118. module sdram_block(
  119. input mclk, fclk, rst_n,
  120. // SDRAM Control
  121. input [23:0] ram_addr,
  122. input [15:0] ram_wr_data,
  123. output reg [15:0] ram_rd_data,
  124. input ram_wr_en,
  125. input ram_rd_en,
  126. output ram_busy,
  127. output ram_rd_ready,
  128. output ram_rd_ack,
  129. // SDRAM I/O
  130. inout [15:0] DRAM_DQ, // Data
  131. output [12:0] DRAM_ADDR, // Address
  132. output [1:0] DRAM_DQM, // Byte Data Mask
  133. output DRAM_CLK, // Clock
  134. output DRAM_CKE, // Clock Enable
  135. output DRAM_WE_N, // Write Enable
  136. output DRAM_CAS_N, // Column Address Strobe
  137. output DRAM_RAS_N, // Row Address Strobe
  138. output DRAM_CS_N, // Chip Select
  139. output [1:0] DRAM_BA // Bank Address
  140. );
  141. /* SDRAM */
  142. // 1 MHz side wires
  143. //wire [39:0] wr_fifo;// Address 24-bit and 16-bit Data
  144. //wire wr_enable; // wr_enable ] <-> [ wr : wr_enable to push fifo
  145. //wire wr_full; // wr_full ] <-> [ full : signal that we are full
  146. //wire rd_enable; // rd_enable - wr : rd_enable to push rd addr to fifo
  147. //wire rdaddr_full; // rdaddr_full - full : signal we cannot read more
  148. //wire [15:0] rddo_fifo;
  149. //wire ctrl_rd_ready; // wr - rd_ready : push data from dram to fifo
  150. //// 100MHz side wires
  151. //wire [39:0] wro_fifo;
  152. //wire ctrl_busy; // rd ] <-> [ busy : pop fifo when ctrl not busy
  153. //wire ctrl_wr_enable; // empty_n - wr_enable : signal ctrl data is ready
  154. //wire [23:0] rdao_fifo;
  155. //wire ctrl_rd_enable; // empty_n - rd_enable : signal ctrl addr ready
  156. //wire [15:0] rddata_fifo;
  157. //wire rd_ready; // rd_ready - empty_n : signal interface data ready
  158. //wire rd_ack; // rd_ack - rd : pop fifo after data read
  159. //wire busy; // RAM is busy because RW FIFO is full
  160. //assign busy = wr_full | rdaddr_full;
  161. //fifo #(.BUS_WIDTH(40)) dram_wr_fifo (
  162. // .wr_clk (mclk),
  163. // .rd_clk (fclk),
  164. // .wr_data (wr_fifo),
  165. // .rd_data (wro_fifo),
  166. // .rd (ctrl_busy),
  167. // .wr (wr_enable),
  168. // .full (wr_full),
  169. // .empty_n (ctrl_wr_enable),
  170. // .rst_n (rst_n)
  171. //);
  172. //
  173. //fifo #(.BUS_WIDTH(24)) dram_rd_addr_fifo (
  174. // .wr_clk (mclk),
  175. // .rd_clk (fclk),
  176. // .wr_data (wr_fifo[39:16]),
  177. // .rd_data (rdao_fifo),
  178. // .rd (ctrl_busy),
  179. // .wr (rd_enable),
  180. // .full (rdaddr_full),
  181. // .empty_n (ctrl_rd_enable),
  182. // .rst_n (rst_n)
  183. //);
  184. //
  185. //fifo #(.BUS_WIDTH(16)) dram_rd_data_fifo (
  186. // .wr_clk (fclk),
  187. // .rd_clk (mclk),
  188. // .wr_data (rddo_fifo),
  189. // .rd_data (rddata_fifo),
  190. // .rd (rd_ack),
  191. // .wr (ctrl_rd_ready),
  192. // .empty_n (rd_ready),
  193. // .rst_n (rst_n)
  194. //);
  195. reg busy, rd_ready, rd_en, wr_en;
  196. reg [1:0] state;
  197. reg [15:0] wr_data, rd_data, rd_data_reg;
  198. always_ff@(posedge fclk) begin
  199. if(~rst_n) begin
  200. state <= 0;
  201. wr_en <= 0;
  202. rd_en <= 0;
  203. end
  204. else begin
  205. if(rd_ready) ram_rd_data <= rd_data;
  206. if(mclk & (state == 0)) state <= 1;
  207. //if(rd_ready) rd_data_reg <= rd_data;
  208. else if(state == 1 && ~busy) begin
  209. wr_data <= ram_wr_data;
  210. wr_en <= ram_wr_en;
  211. rd_en <= ram_rd_en;
  212. state <= (ram_wr_en | ram_rd_en) ? 2 : 1;
  213. end else if (state == 2) begin
  214. wr_en <= 0;
  215. rd_en <= 0;
  216. state <= 3;
  217. end
  218. if(~mclk & (state == 3)) state <= 0;
  219. end
  220. end
  221. //always_ff@(posedge mclk) begin
  222. //state <= 0;
  223. //ram_rd_data <= rd_data_reg;
  224. //end
  225. //assign ram_rd_data = rd_data_reg;
  226. // Setting SDRAM clock to 100MHz
  227. assign DRAM_CLK = fclk;
  228. `ifdef SYNTHESIS
  229. sdram_controller sdram_control0 (
  230. // HOST INTERFACE
  231. .wr_addr (ram_addr),
  232. .wr_data (wr_data),
  233. .wr_enable (wr_en),
  234. .rd_addr (ram_addr),
  235. .rd_data (rd_data),
  236. .rd_ready (rd_ready),
  237. .rd_enable (rd_en),
  238. .busy (busy),
  239. .rst_n (rst_n),
  240. .clk (fclk),
  241. // SDRAM SIDE
  242. .addr (DRAM_ADDR),
  243. .bank_addr (DRAM_BA),
  244. .data (DRAM_DQ),
  245. .clock_enable (DRAM_CKE),
  246. .cs_n (DRAM_CS_N),
  247. .ras_n (DRAM_RAS_N),
  248. .cas_n (DRAM_CAS_N),
  249. .we_n (DRAM_WE_N),
  250. .data_mask_low (DRAM_DQM[0]),
  251. .data_mask_high(DRAM_DQM[1])
  252. );
  253. `else
  254. reg [15:0] rd_data0;
  255. memory#(.WIDTH(16), .LENGTH(2**8)) mock_sdram0(
  256. .clk(fclk),
  257. .wr_en(wr_en),
  258. .rd_en(rd_en),
  259. .wd(wr_data),
  260. .rd(rd_data0),
  261. .addr(ram_addr[7:0])
  262. );
  263. always_ff@(posedge fclk) begin
  264. if(~rst_n) busy <= 0;
  265. else begin
  266. rd_data <= rd_data0;
  267. rd_ready <= rd_en;
  268. busy <= rd_en | wr_en;
  269. end
  270. end
  271. `endif
  272. //// Assign inputs
  273. //assign wr_fifo[39:16] = ram_addr;
  274. //assign wr_fifo[15:0] = ram_wr_data;
  275. //assign wr_enable = ram_wr_en;
  276. //assign rd_enable = ram_rd_en;
  277. //
  278. //// Assign outputs
  279. //assign ram_rd_data = rddata_fifo;
  280. //assign ram_busy = busy;
  281. //assign ram_rd_ready = rd_ready;
  282. //assign ram_rd_ack = rd_ack;
  283. endmodule
  284. /**
  285. * Testbench for sdram_controller modules, simulates:
  286. * - Iinit
  287. * - Write
  288. * - Read
  289. */
  290. module sdram_controller_tb();
  291. //vlog_tb_utils vlog_tb_utils0();
  292. /* HOST CONTROLLS */
  293. reg [23:0] haddr;
  294. reg [15:0] data_input;
  295. wire [15:0] data_output;
  296. wire busy;
  297. reg rd_enable, wr_enable, rst_n, clk;
  298. /* SDRAM SIDE */
  299. wire [12:0] addr;
  300. wire [1:0] bank_addr;
  301. wire [15:0] data;
  302. wire clock_enable, cs_n, ras_n, cas_n, we_n, data_mask_low, data_mask_high;
  303. reg [15:0] data_r;
  304. assign data = data_r;
  305. initial
  306. begin
  307. haddr = 24'd0;
  308. data_input = 16'd0;
  309. rd_enable = 1'b0;
  310. wr_enable = 1'b0;
  311. rst_n = 1'b1;
  312. clk = 1'b0;
  313. data_r = 16'hzzzz;
  314. end
  315. always
  316. #1 clk <= ~clk;
  317. initial
  318. begin
  319. #3 rst_n = 1'b0;
  320. #3 rst_n = 1'b1;
  321. #120 haddr = 24'hfedbed;
  322. data_input = 16'd3333;
  323. #3 wr_enable = 1'b1;
  324. #6 wr_enable = 1'b0;
  325. haddr = 24'd0;
  326. data_input = 16'd0;
  327. #120 haddr = 24'hbedfed;
  328. #3 rd_enable = 1'b1;
  329. #6 rd_enable = 1'b0;
  330. haddr = 24'd0;
  331. #8 data_r = 16'hbbbb;
  332. #2 data_r = 16'hzzzz;
  333. #1000 $finish;
  334. end
  335. sdram_controller sdram_controlleri (
  336. /* HOST INTERFACE */
  337. .wr_addr(haddr),
  338. .wr_data(data_input),
  339. .rd_data(data_output),
  340. .busy(busy), .rd_enable(rd_enable), .wr_enable(wr_enable), .rst_n(rst_n), .clk(clk),
  341. /* SDRAM SIDE */
  342. .addr(addr), .bank_addr(bank_addr), .data(data), .clock_enable(clock_enable), .cs_n(cs_n), .ras_n(ras_n), .cas_n(cas_n), .we_n(we_n), .data_mask_low(data_mask_low), .data_mask_high(data_mask_high)
  343. );
  344. endmodule