OpenCores
URL https://opencores.org/ocsvn/openriscdevboard/openriscdevboard/trunk

Subversion Repositories openriscdevboard

[/] [openriscdevboard/] [trunk/] [cyc2-openrisc/] [model/] [uart_rx.v] - Rev 3

Compare with Previous | Blame | View Log

//-----------------------------------------------------
// Design Name : uart_rx 
// File Name   : uart_rx.v
// Function    : Simple UART
// Coder       : Deepak Kumar Tala, modified by Steve Fielding
//-----------------------------------------------------
module uart_rx (
reset          ,
rxclk          ,
rx_in          
 
);
// Port declarations
input        reset          ;
input        rxclk          ;
input        rx_in          ;
 
// Internal Variables 
reg [7:0]    rx_reg         ;
reg          uld_rx_data    ;
reg          rx_enable      ;
reg [7:0]    rx_data        ;
reg [3:0]    rx_sample_cnt  ;
reg [3:0]    rx_cnt         ;  
reg          rx_frame_err   ;
reg          rx_over_run    ;
reg          rx_empty       ;
reg          rx_empty_reg   ;
reg          rx_d1          ;
reg          rx_d2          ;
reg          rx_busy        ;
integer      uart_log_file_desc;
 
initial begin
  uart_log_file_desc = $fopen("uart.log") ;
  if ( uart_log_file_desc < 2 )
  begin
    $write("Could not open UART log file!\n") ;
    $finish ;
  end
  $fdisplay(uart_log_file_desc, "********* Start UART Monitor log file *************\n") ;
end
 
 
 
 
// UART RX Logic
always @ (posedge rxclk or posedge reset)
if (reset) begin
  rx_reg        <= 0; 
  rx_data       <= 0;
  rx_sample_cnt <= 0;
  rx_cnt        <= 0;
  rx_frame_err  <= 0;
  rx_over_run   <= 0;
  rx_empty      <= 1;
  rx_d1         <= 1;
  rx_d2         <= 1;
  rx_busy       <= 0;
end else begin
  // Synchronize the asynch signal
  rx_d1 <= rx_in;
  rx_d2 <= rx_d1;
  // Uload the rx data
  if (uld_rx_data) begin
    rx_data  <= rx_reg;
    rx_empty <= 1;
  end
  // Receive data only when rx is enabled
  if (rx_enable) begin
    // Check if just received start of frame
    if (!rx_busy && !rx_d2) begin
      rx_busy       <= 1;
      rx_sample_cnt <= 1;
      rx_cnt        <= 0;
    end
    // Start of frame detected, Proceed with rest of data
    if (rx_busy) begin
       rx_sample_cnt <= rx_sample_cnt + 1;
       // Logic to sample at middle of data
       if (rx_sample_cnt == 7) begin
          if ((rx_d2 == 1) && (rx_cnt == 0)) begin
            rx_busy <= 0;
          end else begin
            rx_cnt <= rx_cnt + 1; 
            // Start storing the rx data
            if (rx_cnt > 0 && rx_cnt < 9) begin
              rx_reg[rx_cnt - 1] <= rx_d2;
            end
            if (rx_cnt == 9) begin
               rx_busy <= 0;
               // Check if End of frame received correctly
               if (rx_d2 == 0) begin
                 rx_frame_err <= 1;
               end else begin
                 rx_empty     <= 0;
                 rx_frame_err <= 0;
                 // Check if last rx data was not unloaded,
                 rx_over_run  <= (rx_empty) ? 0 : 1;
               end
            end
          end
       end 
    end 
  end
  if (!rx_enable) begin
    rx_busy <= 0;
  end
end
 
// print rx data
always @(posedge rxclk or posedge reset) begin
  if (reset == 1'b1) begin
    uld_rx_data <= 1'b0;
    rx_enable <= 1'b1;
    rx_empty_reg <= 1'b1;
  end
  else begin
    rx_empty_reg <= rx_empty;
    if (rx_empty == 1'b0 && rx_empty_reg == 1'b1) begin
      uld_rx_data <= 1'b1;
      $fwrite(uart_log_file_desc,"%c",rx_reg);
    end
    else
      uld_rx_data <= 1'b0;
  end
end
 
endmodule
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.