RISC0Top.v 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. `timescale 1ns / 1ps // NW 27.5.09 LL 10.12.09 NW 28.7.2011
  2. module RISC0Top(
  3. input CLK50M,
  4. input rstIn,
  5. input RxD,
  6. input [7:0] swi,
  7. output TxD,
  8. output [7:0] leds);
  9. wire clk, clk50;
  10. reg rst, clk25;
  11. wire[5:0] ioadr;
  12. wire [3:0] iowadr;
  13. wire iowr;
  14. wire[31:0] inbus, outbus;
  15. wire [7:0] dataTx, dataRx;
  16. wire rdyRx, doneRx, startTx, rdyTx;
  17. wire limit; // of cnt0
  18. reg [7:0] Lreg;
  19. reg [15:0] cnt0;
  20. reg [31:0] cnt1; // milliseconds
  21. RISC0 riscx(.clk(clk), .rst(rst), .iord(iord), .iowr(iowr),
  22. .ioadr(ioadr), .inbus(inbus), .outbus(outbus));
  23. RS232R receiver(.clk(clk), .rst(rst), .RxD(RxD), .done(doneRx), .data(dataRx), .rdy(rdyRx));
  24. RS232T transmitter(.clk(clk), .rst(rst), .start(startTx), .data(dataTx), .TxD(TxD), .rdy(rdyTx));
  25. assign iowadr = ioadr[5:2];
  26. assign inbus = (iowadr == 0) ? cnt1 :
  27. (iowadr == 1) ? swi :
  28. (iowadr == 2) ? {24'b0, dataRx} :
  29. (iowadr == 3) ? {30'b0, rdyTx, rdyRx} : 0;
  30. assign dataTx = outbus[7:0];
  31. assign startTx = iowr & (iowadr == 2);
  32. assign doneRx = iord & (iowadr == 2);
  33. assign limit = (cnt0 == 25000);
  34. assign leds = Lreg;
  35. always @(posedge clk)
  36. begin
  37. rst <= ~rstIn;
  38. Lreg <= ~rst ? 0 : (iowr & (iowadr == 1)) ? outbus[7:0] : Lreg;
  39. cnt0 <= limit ? 0 : cnt0 + 1;
  40. cnt1 <= limit ? cnt1 + 1 : cnt1;
  41. end
  42. //The Clocks
  43. IBUFG clkInBuf(.I(CLK50M), .O(clk50));
  44. always @ (posedge clk50) clk25 <= ~clk25;
  45. BUFG clk150buf(.I(clk25), .O(clk));
  46. endmodule