Advertisement
Guest User

Untitled

a guest
Jan 13th, 2019
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2.  
  3.  
  4. module uart(
  5.     input rst,
  6.     input clk,
  7.     input rx,
  8.     output tx,
  9.     input r_clk,
  10.     input r_enable,
  11.     output [63:0] r_out,
  12.     output empty,
  13.     output full,
  14.     output [63:0] buff
  15. );
  16.  
  17. localparam FREQ = 100*1000*1000;
  18. localparam BAUD = 9600;
  19. localparam CYCLE = FREQ/BAUD; // 10416, 5208
  20.  
  21.  
  22. reg w_enable;
  23. reg [63:0] buffer;
  24.  
  25. assign buff = buffer;
  26.  
  27. wire [8:0] RDCOUNT, WRCOUNT;
  28. wire RDERR, WRERR, ALMOSTEMPTY, ALMOSTFULL;
  29.  
  30.  
  31. FIFO_DUALCLOCK_MACRO #(
  32.     .ALMOST_EMPTY_OFFSET(13'h0080), // Sets the almost empty threshold
  33.     .ALMOST_FULL_OFFSET(13'h0080), // Sets almost full threshold
  34.     .DATA_WIDTH(64), // Valid values are 1-72 (37-72 only valid when FIFO_SIZE="36Kb")
  35.     .DEVICE("7SERIES"), // Target device: "VIRTEX5", "VIRTEX6", "7SERIES"
  36.     .FIFO_SIZE ("36Kb"), // Target BRAM: "18Kb" or "36Kb"
  37.     .FIRST_WORD_FALL_THROUGH ("FALSE") // Sets the FIfor FWFT to "TRUE" or "FALSE"
  38. ) FIFO_DUALCLOCK_MACRO_inst (
  39.     .ALMOSTEMPTY(ALMOSTEMPTY), // 1-bit output almost empty
  40.     .ALMOSTFULL(ALMOSTFULL), // 1-bit output almost full
  41.     .EMPTY(empty), // 1-bit output empty
  42.     .FULL(full), // 1-bit output full
  43.  
  44.     .RDCOUNT(RDCOUNT), // Output read count, width determined by FIfor depth
  45.     .RDERR(RDERR), // 1-bit output read error
  46.     .WRCOUNT(WRCOUNT), // Output write count, width determined by FIfor depth
  47.     .WRERR(WRERR), // 1-bit output write error
  48.  
  49.     .DO(r_out), // Output data, width defined by DATA_WIDTH parameter
  50.     .RDCLK(r_clk), // 1-bit input read clock
  51.     .RDEN(r_enable), // 1-bit input read enable
  52.  
  53.     .RST(rst), // 1-bit input reset
  54.  
  55.     .DI(buffer), // Input data, width defined by DATA_WIDTH parameter
  56.     .WRCLK(clk), // 1-bit input write clock
  57.     .WREN(w_enable) // 1-bit input write enable
  58. );
  59.  
  60.  
  61. localparam UNDEF            = 16'bxxxxxxxxxxxxxxxx;
  62. localparam READY            = 16'b1 << 0;
  63. localparam READING          = 16'b1 << 1;
  64.  
  65. reg [15:0] state = READY;
  66.  
  67. reg [31:0] nomsg_cnt;
  68. reg [15:0] delay;
  69. reg [7:0] bits_to_read, bits_read;
  70.  
  71.  
  72. always @(posedge clk) begin
  73.     w_enable <= 0;
  74.     nomsg_cnt <= nomsg_cnt + 1;
  75.     if (rx == 0)
  76.         nomsg_cnt <= 0;
  77.     if (nomsg_cnt == 1000*1000) begin // 1/100s, reset the automaton
  78.         bits_read <= 0;
  79.         nomsg_cnt <= 0;
  80.     end
  81.  
  82.     if (delay)
  83.         delay <= delay - 1;
  84.     else case(state)
  85.     READY: begin
  86.         if (rx == 0) begin
  87.             state <= READING;
  88.             bits_to_read <= 7;
  89.             delay <= (CYCLE * 3) / 2;
  90.         end else
  91.             state <= READY;
  92.     end
  93.     READING: begin
  94.         buffer <= {rx, buffer[63:1]};
  95.         delay <= CYCLE;
  96.         bits_read <= bits_read + 1;
  97.         if (bits_read == 63)
  98.             w_enable <= 1;
  99.         if (bits_to_read == 0) begin
  100.             state <= READY;
  101.         end else begin
  102.             bits_to_read <= bits_to_read - 1;
  103.             state <= READING;
  104.         end
  105.     end
  106.     default: state <= UNDEF;
  107.     endcase
  108. end
  109.  
  110. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement