VID.v 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. `timescale 1ns / 1ps
  2. // 1024x768 display controller NW/PR 24.1.2014
  3. module VID(
  4. input clk, inv,
  5. input [31:0] viddata,
  6. output reg req, // SRAM read request
  7. output [17:0] vidadr,
  8. output hsync, vsync, // to display
  9. output [2:0] RGB);
  10. localparam Org = 18'b1101_1111_1111_0000_00; // DFF00: adr of vcnt=1023
  11. reg [10:0] hcnt;
  12. reg [9:0] vcnt;
  13. reg [4:0] hword; // from hcnt, but latched in the clk domain
  14. reg [31:0] vidbuf, pixbuf;
  15. reg hblank;
  16. wire pclk, hend, vend, vblank, xfer, vid;
  17. assign hend = (hcnt == 1343), vend = (vcnt == 801);
  18. assign vblank = (vcnt[8] & vcnt[9]); // (vcnt >= 768)
  19. assign hsync = ~((hcnt >= 1080+6) & (hcnt < 1184+6)); // -ve polarity
  20. assign vsync = (vcnt >= 771) & (vcnt < 776); // +ve polarity
  21. assign xfer = (hcnt[4:0] == 6); // data delay > hcnt cycle + req cycle
  22. assign vid = (pixbuf[0] ^ inv) & ~hblank & ~vblank;
  23. assign RGB = {vid, vid, vid};
  24. assign vidadr = Org + {3'b0, ~vcnt, hword};
  25. always @(posedge pclk) begin // pixel clock domain
  26. hcnt <= hend ? 0 : hcnt+1;
  27. vcnt <= hend ? (vend ? 0 : (vcnt+1)) : vcnt;
  28. hblank <= xfer ? hcnt[10] : hblank; // hcnt >= 1024
  29. pixbuf <= xfer ? vidbuf : {1'b0, pixbuf[31:1]};
  30. end
  31. always @(posedge clk) begin // CPU (SRAM) clock domain
  32. hword <= hcnt[9:5];
  33. req <= ~vblank & ~hcnt[10] & (hcnt[5] ^ hword[0]); // i.e. adr changed
  34. vidbuf <= req ? viddata : vidbuf;
  35. end
  36. // pixel clock generation
  37. (* LOC = "DCM_X1Y1" *) DCM #(.CLKFX_MULTIPLY(3), .CLK_FEEDBACK("NONE"))
  38. dcm(.CLKIN(clk), .CLKFX(pclk));
  39. endmodule