Registers.v 986 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. `timescale 1ns / 1ps // 1.2.2018
  2. // register file, triple-port
  3. module Registers(
  4. input clk,wr,
  5. input [3:0] rno0, rno1, rno2,
  6. input [31:0] din,
  7. output [31:0] dout0, dout1, dout2);
  8. genvar i;
  9. generate //triple port register file, duplicated LUT array
  10. for (i = 0; i < 32; i = i+1)
  11. begin: rf32
  12. RAM16X1D # (.INIT(16'h0000))
  13. rfb(
  14. .DPO(dout1[i]), // data out
  15. .SPO(dout0[i]),
  16. .A0(rno0[0]), // R/W address, controls D and SPO
  17. .A1(rno0[1]),
  18. .A2(rno0[2]),
  19. .A3(rno0[3]),
  20. .D(din[i]), // data in
  21. .DPRA0(rno1[0]), // read-only adr, controls DPO
  22. .DPRA1(rno1[1]),
  23. .DPRA2(rno1[2]),
  24. .DPRA3(rno1[3]),
  25. .WCLK(clk),
  26. .WE(wr));
  27. RAM16X1D # (.INIT(16'h0000))
  28. rfc(
  29. .DPO(dout2[i]), // data out
  30. .SPO(),
  31. .A0(rno0[0]), // R/W address, controls D and SPO
  32. .A1(rno0[1]),
  33. .A2(rno0[2]),
  34. .A3(rno0[3]),
  35. .D(din[i]), // data in
  36. .DPRA0(rno2[0]), // read-only adr, controls DPO
  37. .DPRA1(rno2[1]),
  38. .DPRA2(rno2[2]),
  39. .DPRA3(rno2[3]),
  40. .WCLK(clk),
  41. .WE(wr));
  42. end
  43. endgenerate
  44. endmodule