io_unit.sv 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import project_pkg::word;
  2. module io_unit(
  3. input logic clk, rx,
  4. input logic [3:0]switches,
  5. input logic [1:0]keys,
  6. output logic tx,
  7. output logic [7:0]leds
  8. );
  9. logic transmit, received, is_receiving, is_transmitting, recv_error;
  10. logic [7:0] tx_byte, rx_byte;
  11. assign leds[0] = received;
  12. assign leds[1] = is_receiving;
  13. assign leds[2] = is_transmitting;
  14. //assign leds[3] = recv_error;
  15. //assign leds[6] = rx;
  16. //assign leds[7] = tx;
  17. logic clk_slow;
  18. clk_div clk_div12(clk, rst, clk_slow);
  19. assign rst = ~keys[0];
  20. //assign transmit = keys[1];
  21. //assign tx_byte = rx_byte;
  22. uart uart0(clk, rst, rx, tx, transmit, tx_byte, received, rx_byte, is_receiving, is_transmitting, );
  23. //assign clk = keys[1];
  24. logic mem_wr;
  25. word pc, instr, imm, mem_addr, mem_data, mem_rd_data;
  26. word ext_rd_data, rd_data;
  27. cpu CPU(clk_slow, rst, instr, imm, pc, mem_addr, mem_wr, mem_data, rd_data);
  28. // Instruction memory
  29. instr_mem #("/home/min/devel/fpga/ucl_project_y3/memory/test.mem") IMEM(pc, instr, imm);
  30. // System memory
  31. memory RAM(clk, mem_wr, mem_addr, mem_data, mem_rd_data);
  32. assign ext_rd_data = '{0,0,0,0, 0,0,0,is_transmitting};
  33. assign rd_data = (mem_addr == 8'hFF) ? ext_rd_data : mem_rd_data;
  34. always_ff@(posedge clk_slow) begin
  35. if(mem_wr & mem_addr == 8'hFF) begin
  36. tx_byte <= mem_data;
  37. transmit <= 1;
  38. end
  39. else begin
  40. transmit <= 0;
  41. end
  42. end
  43. endmodule