mailbox_wb.v 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * mailbox_wb.v
  3. *
  4. * vim: ts=4 sw=4
  5. *
  6. * Copyright (C) 2025 Krzysztof Skrzynecki, Jakub Duchniewicz <j.duchniewicz@gmail.com>
  7. * SPDX-License-Identifier: TODO:
  8. */
  9. `default_nettype none
  10. module mailbox_wb #(
  11. parameter AW = 4, // Address width for 16 registers (4 bits)
  12. parameter DW = 16 // Data width for each register (16 bits)
  13. )(
  14. input wire clk,
  15. input wire rst,
  16. // Wishbone Interface
  17. input wire [AW-1:0] wb_addr,
  18. input wire [DW-1:0] wb_wdata,
  19. output reg [DW-1:0] wb_rdata,
  20. input wire wb_we,
  21. input wire wb_cyc,
  22. output reg wb_ack,
  23. // Custom hardware side (RTL)
  24. output reg [DW-1:0] registers [15:0] // 16 registers of 16 bits width
  25. );
  26. // Always reset the registers on reset signal
  27. integer i;
  28. always @(posedge clk or posedge rst) begin
  29. if (rst) begin
  30. wb_ack <= 1'b0;
  31. for (i = 0; i < 16; i = i + 1) begin
  32. registers[i] <= 16'h0; // Reset all registers to 0
  33. end
  34. end else begin
  35. // Handle Wishbone communication
  36. wb_ack <= wb_cyc;
  37. // Write operation (if write enable is active)
  38. if (wb_we && wb_cyc) begin
  39. case (wb_addr)
  40. 4'b0000: registers[0] <= wb_wdata;
  41. 4'b0001: registers[1] <= wb_wdata;
  42. 4'b0010: registers[2] <= wb_wdata;
  43. 4'b0011: registers[3] <= wb_wdata;
  44. 4'b0100: registers[4] <= wb_wdata;
  45. 4'b0101: registers[5] <= wb_wdata;
  46. 4'b0110: registers[6] <= wb_wdata;
  47. 4'b0111: registers[7] <= wb_wdata;
  48. 4'b1000: registers[8] <= wb_wdata;
  49. 4'b1001: registers[9] <= wb_wdata;
  50. 4'b1010: registers[10] <= wb_wdata;
  51. 4'b1011: registers[11] <= wb_wdata;
  52. 4'b1100: registers[12] <= wb_wdata;
  53. 4'b1101: registers[13] <= wb_wdata;
  54. 4'b1110: registers[14] <= wb_wdata;
  55. 4'b1111: registers[15] <= wb_wdata;
  56. endcase
  57. end
  58. // Read operation (read the correct register based on address)
  59. case (wb_addr)
  60. 4'b0000: wb_rdata <= registers[0];
  61. 4'b0001: wb_rdata <= registers[1];
  62. 4'b0010: wb_rdata <= registers[2];
  63. 4'b0011: wb_rdata <= registers[3];
  64. 4'b0100: wb_rdata <= registers[4];
  65. 4'b0101: wb_rdata <= registers[5];
  66. 4'b0110: wb_rdata <= registers[6];
  67. 4'b0111: wb_rdata <= registers[7];
  68. 4'b1000: wb_rdata <= registers[8];
  69. 4'b1001: wb_rdata <= registers[9];
  70. 4'b1010: wb_rdata <= registers[10];
  71. 4'b1011: wb_rdata <= registers[11];
  72. 4'b1100: wb_rdata <= registers[12];
  73. 4'b1101: wb_rdata <= registers[13];
  74. 4'b1110: wb_rdata <= registers[14];
  75. 4'b1111: wb_rdata <= registers[15];
  76. default: wb_rdata <= 16'hDEAD; // Default error value
  77. endcase
  78. end
  79. end
  80. endmodule