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

Subversion Repositories 8051

[/] [8051/] [tags/] [rel_12/] [rtl/] [verilog/] [oc8051_uart.v] - Diff between revs 115 and 116

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 115 Rev 116
Line 42... Line 42...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.11  2003/04/07 13:29:16  simont
 
// change uart to meet timing.
 
//
// Revision 1.10  2003/01/13 14:14:41  simont
// Revision 1.10  2003/01/13 14:14:41  simont
// replace some modules
// replace some modules
//
//
// Revision 1.9  2002/09/30 17:33:59  simont
// Revision 1.9  2002/09/30 17:33:59  simont
// prepared header
// prepared header
Line 58... Line 61...
 
 
`include "oc8051_defines.v"
`include "oc8051_defines.v"
 
 
module oc8051_uart (rst, clk,
module oc8051_uart (rst, clk,
             bit_in, data_in,
             bit_in, data_in,
             rd_addr, wr_addr,
             wr_addr,
             bit_out, data_out,
 
             wr, wr_bit,
             wr, wr_bit,
             rxd, txd,
             rxd, txd,
             intr,
             intr,
             brate2, t1_ow, pres_ow,
             brate2, t1_ow, pres_ow,
             rclk, tclk);
             rclk, tclk,
 
//registers
 
             scon, pcon, sbuf);
 
 
input        rst,
input        rst,
             clk,
             clk,
             bit_in,
             bit_in,
             wr,
             wr,
Line 77... Line 81...
             t1_ow,
             t1_ow,
             brate2,
             brate2,
             pres_ow,
             pres_ow,
             rclk,
             rclk,
             tclk;
             tclk;
input [7:0]  rd_addr,
input [7:0]  data_in,
             data_in,
 
             wr_addr;
             wr_addr;
 
 
output       txd,
output       txd,
             intr,
             intr;
             bit_out;
output [7:0] scon,
output [7:0] data_out;
             pcon,
 
             sbuf;
 
 
reg /*txd, */bit_out;
 
reg [7:0] data_out;
 
 
 
reg t1_ow_buf;
reg t1_ow_buf;
//reg tr_start, trans, trans_buf, t1_ow_buf;
//
//reg [5:0] smod_cnt_r, smod_cnt_t;
reg [7:0] scon, pcon;
//reg receive, receive_buf, rxd_buf, r_int;
 
//
 
reg [7:0] /*sbuf_rxd, sbuf_txd, */scon, pcon;
 
//reg [10:0] sbuf_rxd_tmp;
 
//
 
//tr_count      trancive counter
 
//re_count      receive counter
 
//reg [3:0] tr_count, re_count, re_count_buff;
 
 
 
 
 
reg        txd,
reg        txd,
           trans,
           trans,
           receive,
           receive,
Line 117... Line 111...
           re_count;
           re_count;
reg [7:0]  sbuf_rxd;
reg [7:0]  sbuf_rxd;
reg [11:0] sbuf_rxd_tmp;
reg [11:0] sbuf_rxd_tmp;
reg [12:0] sbuf_txd;
reg [12:0] sbuf_txd;
 
 
 
assign sbuf = sbuf_rxd;
assign intr = scon[1] | scon [0];
assign intr = scon[1] | scon [0];
 
 
//
//
//serial port control register
//serial port control register
//
//
Line 259... Line 253...
  end else begin
  end else begin
    shift_tr <= #1 1'b0;
    shift_tr <= #1 1'b0;
  end
  end
end
end
 
 
/*
 
//
 
// transmit
 
//
 
always @(posedge clk or posedge rst)
 
begin
 
  if (rst) begin
 
    txd <= #1 1'b1;
 
    tr_count <= #1 4'd0;
 
    trans <= #1 1'b0;
 
    smod_cnt_t <= #1 6'h0;
 
//
 
// start transmiting
 
//
 
  end else if (tr_start) begin
 
    case (scon[7:6])
 
      2'b00: begin  // mode 0
 
        txd <= #1 sbuf_txd[0];
 
        tr_count <= #1 4'd1;
 
      end
 
      2'b10: begin
 
        txd <= #1 1'b0;
 
        tr_count <= #1 4'd0;
 
      end
 
      default: begin  // mode 1 and mode 3
 
        tr_count <= #1 4'b1111;
 
      end
 
    endcase
 
    trans <= #1 1'b1;
 
    smod_cnt_t <= #1 6'h0;
 
//
 
// transmiting/
 
//
 
  end else if (trans)
 
  begin
 
    case (scon[7:6])
 
      2'b00: begin //mode 0
 
        if (smod_cnt_t == 6'd12) begin
 
          if (tr_count==4'd8)
 
          begin
 
                  trans <= #1 1'b0;
 
                  txd <= #1 1'b1;
 
                end else begin
 
            txd <= #1 sbuf_txd[tr_count];
 
                  tr_count <= #1 tr_count + 4'b1;
 
                end
 
          smod_cnt_t <= #1 6'h0;
 
              end else smod_cnt_t <= #1 smod_cnt_t + 6'h01;
 
      end
 
      2'b01: begin // mode 1
 
        if ((t1_ow) & !(t1_ow_buf))
 
        begin
 
                if (((pcon[7]) &  (smod_cnt_t == 6'd15))| (!(pcon[7]) & (smod_cnt_t==6'd31)))
 
                begin
 
            case (tr_count)
 
              4'd8: txd <= #1 1'b1;  // stop bit
 
                    4'd9: trans <= #1 1'b0;
 
                    4'b1111: txd <= #1 1'b0; //start bit
 
                    default: txd <= #1 sbuf_txd[tr_count];
 
                  endcase
 
            tr_count <= #1 tr_count + 4'b1;
 
                  smod_cnt_t <= #1 6'h0;
 
                end else smod_cnt_t <= #1 smod_cnt_t + 6'h01;
 
              end
 
      end
 
      2'b10: begin // mode 2
 
//
 
// if smod (pcon[7]) is 1 count to 4 else count to 6
 
//
 
        if (((pcon[7]) & (smod_cnt_t==6'd31)) | (!(pcon[7]) & (smod_cnt_t==6'd63))) begin
 
            case (tr_count)
 
            4'd8: begin
 
                    txd <= #1 scon[3];
 
                  end
 
            4'd9: begin
 
                    txd <= #1 1'b1; //stop bit
 
                  end
 
            4'd10: begin
 
                    trans <= #1 1'b0;
 
                  end
 
 
 
                  default: begin
 
                    txd <= #1 sbuf_txd[tr_count];
 
                  end
 
                endcase
 
          tr_count <= #1 tr_count+1'b1;
 
                smod_cnt_t <= #1 6'h00;
 
              end else begin
 
          smod_cnt_t <= #1 smod_cnt_t + 6'h01;
 
              end
 
      end
 
      default: begin // mode 3
 
        if ((t1_ow) & !(t1_ow_buf))
 
        begin
 
      if (((pcon[7]) &  (smod_cnt_t == 6'd15))| (!(pcon[7]) & (smod_cnt_t==6'd31)))
 
          begin
 
            case (tr_count)
 
              4'd8: begin
 
                txd <= #1 scon[3];
 
              end
 
              4'd9: begin
 
                txd <= #1 1'b1; //stop bit
 
              end
 
              4'd10: begin
 
          trans <= #1 1'b0;
 
        end
 
              4'b1111: txd <= #1 1'b0; //start bit
 
              default: begin
 
                txd <= #1 sbuf_txd[tr_count];
 
              end
 
            endcase
 
            tr_count <= #1 tr_count+1'b1;
 
            smod_cnt_t <= #1 6'h00;
 
          end else smod_cnt_t <= #1 smod_cnt_t + 6'h01;
 
        end
 
      end
 
    endcase
 
  end else
 
    txd <= #1 1'b1;
 
end
 
*/
 
 
 
//
//
//serial port buffer (receive)
//serial port buffer (receive)
//
//
always @(posedge clk or posedge rst)
always @(posedge clk or posedge rst)
Line 397... Line 270...
    rxd_r        <= #1 1'b1;
    rxd_r        <= #1 1'b1;
    rx_sam       <= #1 2'b00;
    rx_sam       <= #1 2'b00;
  end else if (!rx_done) begin
  end else if (!rx_done) begin
    receive <= #1 1'b0;
    receive <= #1 1'b0;
    rx_done <= #1 1'b1;
    rx_done <= #1 1'b1;
//    if (scon[7:6]==2'b00) begin
 
      sbuf_rxd <= #1 sbuf_rxd_tmp[10:3];
      sbuf_rxd <= #1 sbuf_rxd_tmp[10:3];
//    end else begin
 
//      sbuf_rxd <= #1 sbuf_rxd_tmp[8:1];
 
//    end
 
  end else if (receive & (scon[7:6]==2'b00) & pres_ow) begin //mode 0
  end else if (receive & (scon[7:6]==2'b00) & pres_ow) begin //mode 0
    {sbuf_rxd_tmp, rx_done} <= #1 {rxd, sbuf_rxd_tmp};
    {sbuf_rxd_tmp, rx_done} <= #1 {rxd, sbuf_rxd_tmp};
  end else if (receive & (scon[7:6]!=2'b00) & shift_re) begin //mode 1, 2, 3
  end else if (receive & (scon[7:6]!=2'b00) & shift_re) begin //mode 1, 2, 3
    re_count <= #1 re_count + 4'd1;
    re_count <= #1 re_count + 4'd1;
    case (re_count)
    case (re_count)
Line 464... Line 333...
    shift_re <= #1 1'b0;
    shift_re <= #1 1'b0;
  end
  end
end
end
 
 
 
 
/*
 
always @(posedge clk or posedge rst)
 
begin
 
  if (rst) begin
 
    re_count <= #1 4'd0;
 
    receive <= #1 1'b0;
 
    sbuf_rxd <= #1 8'h00;
 
    sbuf_rxd_tmp <= #1 11'd0;
 
    smod_cnt_r <= #1 6'h00;
 
    r_int <= #1 1'b0;
 
  end else if (receive) begin
 
    case (scon[7:6])
 
      2'b00: begin // mode 0
 
        if (smod_cnt_r==6'd12) begin
 
          if (re_count==4'd8) begin
 
                  receive <= #1 1'b0;
 
                  r_int <= #1 1'b1;
 
                  sbuf_rxd <= #1 sbuf_rxd_tmp[8:1];
 
              end else begin
 
            sbuf_rxd_tmp[re_count + 4'd1] <= #1 rxd;
 
                  r_int <= #1 1'b0;
 
                end
 
          re_count <= #1 re_count + 4'd1;
 
          smod_cnt_r <= #1 6'h00;
 
        end else smod_cnt_r <= #1 smod_cnt_r + 6'h01;
 
      end
 
      2'b01: begin // mode 1
 
        if ((t1_ow) & !(t1_ow_buf))
 
        begin
 
          if (((pcon[7]) &  (smod_cnt_r == 6'd15))| (!(pcon[7]) & (smod_cnt_r==6'd31)))
 
                begin
 
            r_int <= #1 1'b0;
 
            re_count <= #1 re_count + 4'd1;
 
            smod_cnt_r <= #1 6'h00;
 
            sbuf_rxd_tmp[re_count_buff] <= #1 rxd;
 
            if ((re_count==4'd0) && (rxd))
 
              receive <= #1 1'b0;
 
 
 
                end else smod_cnt_r <= #1 smod_cnt_r + 6'h01;
 
              end else begin
 
              r_int <= #1 1'b1;
 
            if (re_count == 4'd10)
 
          begin
 
              sbuf_rxd <= #1 sbuf_rxd_tmp[8:1];
 
            receive <= #1 1'b0;
 
              r_int <= #1 1'b1;
 
          end else r_int <= #1 1'b0;
 
        end
 
      end
 
      2'b10: begin // mode 2
 
        if (((pcon[7]) & (smod_cnt_r==6'd31)) | (!(pcon[7]) & (smod_cnt_r==6'd63))) begin
 
          r_int <= #1 1'b0;
 
            re_count <= #1 re_count + 4'd1;
 
          smod_cnt_r <= #1 6'h00;
 
          sbuf_rxd_tmp[re_count_buff] <= #1 rxd;
 
          re_count <= #1 re_count + 4'd1;
 
              end else begin
 
          smod_cnt_r <= #1 smod_cnt_r + 6'h1;
 
                if (re_count==4'd11) begin
 
                  sbuf_rxd <= #1 sbuf_rxd_tmp[8:1];
 
                  r_int <= #1 sbuf_rxd_tmp[0] | !scon[5];
 
                  receive <= #1 1'b0;
 
                end else
 
                  r_int <= #1 1'b0;
 
        end
 
      end
 
      default: begin // mode 3
 
        if ((t1_ow) & !(t1_ow_buf))
 
        begin
 
          if (((pcon[7]) &  (smod_cnt_r == 6'd15))| (!(pcon[7]) & (smod_cnt_r==6'd31)))
 
                begin
 
            sbuf_rxd_tmp[re_count] <= #1 rxd;
 
                  r_int <= #1 1'b0;
 
                re_count <= #1 re_count + 4'd1;
 
                  smod_cnt_r <= #1 6'h00;
 
                end else smod_cnt_r <= #1 smod_cnt_r + 6'h01;
 
              end else begin
 
          if (re_count==4'd11) begin
 
            sbuf_rxd <= #1 sbuf_rxd_tmp[8:1];
 
            receive <= #1 1'b0;
 
                  r_int <= #1 sbuf_rxd_tmp[0] | !scon[5];
 
                end else begin
 
            r_int <= #1 1'b0;
 
          end
 
              end
 
      end
 
    endcase
 
  end else begin
 
    case (scon[7:6])
 
      2'b00: begin
 
        if ((scon[4]) && !(scon[0]) && !(r_int)) begin
 
          receive <= #1 1'b1;
 
          smod_cnt_r <= #1 6'h6;
 
        end
 
      end
 
      2'b10: begin
 
        if ((scon[4]) && !(rxd)) begin
 
          receive <= #1 1'b1;
 
          if (pcon[7])
 
            smod_cnt_r <= #1 6'd15;
 
          else smod_cnt_r <= #1 6'd31;
 
        end
 
      end
 
      default: begin
 
        if ((scon[4]) && (!rxd)) begin
 
          if (pcon[7])
 
            smod_cnt_r <= #1 6'd7;
 
          else smod_cnt_r <= #1 6'd15;
 
          receive <= #1 1'b1;
 
        end
 
      end
 
    endcase
 
 
 
    sbuf_rxd_tmp <= #1 11'd0;
 
    re_count <= #1 4'd0;
 
    r_int <= #1 1'b0;
 
  end
 
end
 
*/
 
 
 
//
//
//
//
//
//
always @(posedge clk or posedge rst)
 
begin
 
  if (rst) data_out <= #1 8'h0;
 
  else if (wr & !wr_bit & (wr_addr==rd_addr) & ((wr_addr==`OC8051_SFR_PCON) |
 
     (wr_addr==`OC8051_SFR_SCON))) begin
 
    data_out <= #1 data_in;
 
  end else begin
 
    case (rd_addr)
 
      `OC8051_SFR_SBUF: data_out <= #1 sbuf_rxd;
 
      `OC8051_SFR_PCON: data_out <= #1 pcon;
 
      default: data_out <= #1 scon;
 
    endcase
 
  end
 
end
 
 
 
 
 
always @(posedge clk or posedge rst)
always @(posedge clk or posedge rst)
begin
begin
  if (rst) begin
  if (rst) begin
//    trans_buf <= #1 1'b0;
 
//    receive_buf <= #1 1'b0;
 
    t1_ow_buf <= #1 1'b0;
    t1_ow_buf <= #1 1'b0;
//    rxd_buf <= #1 1'b0;
 
  end else begin
  end else begin
//    trans_buf <= #1 trans;
 
//    receive_buf <= #1 receive;
 
    t1_ow_buf <= #1 t1_ow;
    t1_ow_buf <= #1 t1_ow;
//    rxd_buf <= #1 rxd;
 
  end
  end
end
end
 
 
 
 
always  @(posedge clk or posedge rst)
 
begin
 
  if (rst) bit_out <= #1 1'b0;
 
  else if (wr & wr_bit & (rd_addr==wr_addr) & (wr_addr[7:3]==`OC8051_SFR_B_SCON)) begin
 
    bit_out <= #1 bit_in;
 
  end else
 
    bit_out <= #1 scon[rd_addr[2:0]];
 
end
 
 
 
/*
 
always @(posedge clk or posedge rst)
 
  if (rst)
 
    re_count_buff <= #1 4'h4;
 
  else re_count_buff <= #1 re_count;
 
*/
 
 
 
endmodule
endmodule
 
 
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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