Advertisement
Guest User

Untitled

a guest
Dec 8th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2.  
  3. //commands:
  4. // 4'h0 - NOP
  5. // 4'h1 - SCROLL 64'd0
  6. // 4'h2 - NUMBER {32'd0, number}
  7.  
  8. module display(
  9.     input hclk,
  10.     input clk,
  11.     output [3:0] vgaRed,
  12.     output [3:0] vgaGreen,
  13.     output [3:0] vgaBlue,
  14.     output Vsync,
  15.     output Hsync,
  16.     input [3:0] cmd,
  17.     input [63:0] data,
  18.     output ready,
  19.     output [15:0] led
  20.     );
  21.  
  22. (* ASYNC_REG = "TRUE" *) reg [5:0] offset;
  23.  
  24. reg [12:0] write_addr;
  25. reg [31:0] write_value;
  26. reg write_enable;
  27.  
  28. vga vga(
  29.     hclk,
  30.     vgaRed, vgaGreen, vgaBlue,
  31.     Vsync, Hsync,
  32.     clk, write_addr, write_value, write_enable,
  33.     offset
  34. );
  35.  
  36.  
  37. reg dabbler_enable;
  38. wire [39:0] bcd;
  39. wire [3:0] bcd_digits[9:0];
  40. wire sign;
  41. wire dabbler_ready;
  42.  
  43.  
  44. bin_to_bcd dabbler(
  45.     clk,
  46.     dabbler_enable, data[31:0],
  47.     bcd, sign, dabbler_ready
  48. );
  49.  
  50. genvar i;
  51. generate
  52.     for (i=0; i<10; i = i+1) begin: bcd_to_digits
  53.         assign bcd_digits[i] = bcd[i*4 + 3 : i*4];
  54.     end
  55. endgenerate
  56.  
  57. assign led = {bcd_digits[3], bcd_digits[2], bcd_digits[1], bcd_digits[0]};
  58.  
  59. localparam UNDEF        = 16'bxxxxxxxxxxxxxxxx;
  60. localparam READY        = 16'b1 << 0;
  61. localparam CLEAR_LINE   = 16'b1 << 1;
  62. localparam NUMBER_WAIT  = 16'b1 << 2;
  63. localparam NUMBER_WRITE = 16'b1 << 3;
  64.  
  65. reg [15:0] state = READY;
  66. reg [15:0] countdown;
  67.  
  68.  
  69. // all of the commands that run for >1 cycle should be here
  70. assign ready = (state == READY && cmd == 4'h0);
  71.  
  72. always @(posedge clk) begin
  73.     write_enable <= 0;
  74.     dabbler_enable <= 0;
  75.     if (countdown != 16'd0)
  76.         countdown <= countdown - 1;
  77.     case(state)
  78.         READY:
  79.             case(cmd) // decoder, +1 cycle
  80.                 4'h0:           // NOP
  81.                     state <= READY;
  82.                 4'h1: begin     // SCROLL
  83.                     if (offset == 44)   offset <= 0;
  84.                     else                offset <= offset + 1;
  85.                     countdown <= 16'd159;
  86.                     state <= CLEAR_LINE;
  87.                 end
  88.                 4'h2: begin     // NUMBER
  89.                     dabbler_enable <= 1;
  90.                     state <= NUMBER_WAIT;
  91.                 end
  92.                 default:    state <= READY;
  93.             endcase
  94.  
  95.         CLEAR_LINE: begin
  96.             if (countdown == 16'd0) state <= READY;
  97.             else                    state <= CLEAR_LINE;
  98.  
  99.             write_addr <= (offset == 6'd0 ? 6'd44 : (offset - 6'd1)) * 13'd160 + countdown;
  100.             write_value <= 32'd0;
  101.             write_enable <= 1'b1;
  102.         end
  103.  
  104.         NUMBER_WAIT:
  105.             if (dabbler_ready) begin
  106.                 write_addr <= (offset == 6'd0 ? 6'd44 : (offset - 6'd1)) * 13'd160 + 0;
  107.                 write_value <= {12'hfff, 12'd0, sign ? 8'd45 : 8'd32};
  108.                 write_enable <= 1'b1;
  109.                 countdown <= 9;
  110.                 state <= NUMBER_WRITE;
  111.             end else
  112.                 state <= NUMBER_WAIT;
  113.  
  114.         NUMBER_WRITE: begin
  115.             if (countdown == 16'd0) state <= READY;
  116.             else                    state <= NUMBER_WRITE;
  117.  
  118.             write_addr <= (offset == 6'd0 ? 6'd44 : (offset - 6'd1)) * 13'd160 + 1 + countdown;
  119.             write_value <= {12'hfff, 12'd0, (8'd48 + bcd_digits[countdown[3:0]])};
  120.             write_enable <= 1'b1;
  121.         end
  122.  
  123.         default: state <= UNDEF; // unreachable
  124.     endcase
  125. end
  126.  
  127. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement