Advertisement
Guest User

Untitled

a guest
Dec 20th, 2016
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module UART_TX
  2.   #(
  3.     parameter clk_frequency = 50_000_000,
  4.     parameter baud_rate = 921600,
  5.     parameter stop_bits = 2
  6.   )
  7.   (
  8.     input wire clk,
  9.     input wire reset,
  10.     input wire [7:0] data,
  11.     input wire start,
  12.     output wire busy,
  13.     output wire txd
  14.   );
  15.  
  16.   localparam frame_length = 9 + stop_bits;
  17.   localparam stop_bit = 1'b1;
  18.   localparam start_bit = 1'b0;
  19.  
  20.   localparam STATE_IDLE  = 1'b0;
  21.   localparam STATE_TX    = 1'b1;
  22.  
  23.   localparam prescale = clk_frequency / baud_rate;
  24.  
  25.   reg state = STATE_IDLE;
  26.   reg [frame_length - 1:0] data_reg = {frame_length{1'b1}};
  27.   reg [3:0] bit_cnt = 0;
  28.   reg [$clog2(prescale) - 1:0] prescale_reg;
  29.  
  30.   assign busy = (state != STATE_IDLE);
  31.   assign txd = data_reg[0];
  32.  
  33.   always @(posedge clk) begin
  34.     if (reset) begin
  35.       state <= STATE_IDLE;
  36.       prescale_reg <= 0;
  37.       data_reg <= {frame_length{1'b1}};
  38.       bit_cnt <= 0;
  39.     end else begin
  40.       if (state == STATE_IDLE) begin
  41.         if (start) begin
  42.           prescale_reg <= 0;
  43.           bit_cnt <= 0;
  44.           data_reg <= {{stop_bits{stop_bit}}, data, start_bit};
  45.           state <= STATE_TX;
  46.         end
  47.       end else begin
  48.         // state == STATE_TX
  49.         prescale_reg <= prescale_reg + 1'b1;
  50.         if (prescale_reg == prescale - 1) begin
  51.           prescale_reg <= 0;
  52.           data_reg <= {stop_bit, data_reg[frame_length - 2:1]};
  53.           bit_cnt <= bit_cnt + 1'b1;
  54.         end
  55.         if (prescale_reg == prescale - 2 && bit_cnt == frame_length - 1) begin
  56.           state <= STATE_IDLE;
  57.         end
  58.       end
  59.     end
  60.   end
  61. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement