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

Subversion Repositories yifive

[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [spi_master/] [src/] [spim_tx.sv] - Diff between revs 18 and 21

Show entire file | Details | Blame | View Log

Rev 18 Rev 21
Line 78... Line 78...
  logic                 tx32b_done     ;  // 32 bit Transmit done
  logic                 tx32b_done     ;  // 32 bit Transmit done
  logic                 en_quad;
  logic                 en_quad;
 
 
  enum logic [0:0] { IDLE, TRANSMIT } tx_CS, tx_NS;
  enum logic [0:0] { IDLE, TRANSMIT } tx_CS, tx_NS;
 
 
  // Counter Exit condition, quad mode div-4 , else actual counter
 
  always_comb
 
  begin
 
     counter_trgt = (en_quad_in) ? {2'b00,counter_in[15:2]} : counter_in;
 
  end
 
 
 
  //Indicate end of transmission of all the bytes
 
  assign tx_done = (counter == counter_trgt) && tx_edge;
 
 
 
 
 
  // Indicate 32 bit data done, usefull for readining next 32b from txfifo
  // Indicate 32 bit data done, usefull for readining next 32b from txfifo
  assign tx32b_done  = (!en_quad && (counter[4:0] == 5'b11111)) || (en_quad && (counter[2:0] == 3'b111)) && tx_edge;
  assign tx32b_done  = (!en_quad && (counter[4:0] == 5'b11111)) || (en_quad && (counter[2:0] == 3'b111)) && tx_edge;
 
 
 
 
 
 
  always_comb
  always_comb
  begin
  begin
    tx_NS         = tx_CS;
    tx_NS         = tx_CS;
    clk_en_o      = 1'b0;
 
    data_int_next = data_int;
    data_int_next = data_int;
    data_ready    = 1'b0;
    data_ready    = 1'b0;
    counter_next  = counter;
    counter_next  = counter;
 
 
    case (tx_CS)
    case (tx_CS)
      IDLE: begin
      IDLE: begin
        clk_en_o = 1'b0;
 
        data_int_next = txdata;
        data_int_next = txdata;
 
        counter_next  = '0;
 
 
        if (en && data_valid) begin
        if (en && data_valid) begin
          data_ready    = 1'b1;
          data_ready    = 1'b1;
          tx_NS         = TRANSMIT;
          tx_NS         = TRANSMIT;
        end
        end
      end
      end
 
 
      TRANSMIT: begin
      TRANSMIT: begin
        clk_en_o = 1'b1;
 
        counter_next = counter + 1;
        counter_next = counter + 1;
        data_int_next = (en_quad) ? {data_int[27:0],4'b0000} : {data_int[30:0],1'b0};
        data_int_next = (en_quad) ? {data_int[27:0],4'b0000} : {data_int[30:0],1'b0};
 
 
        if (tx_done) begin
        if (tx_done) begin
            counter_next = 0;
            counter_next = 0;
Line 125... Line 114...
            if (en && data_valid) begin
            if (en && data_valid) begin
              data_int_next = txdata;
              data_int_next = txdata;
              data_ready    = 1'b1;
              data_ready    = 1'b1;
              tx_NS         = TRANSMIT;
              tx_NS         = TRANSMIT;
            end else begin
            end else begin
              clk_en_o = 1'b0;
 
              tx_NS    = IDLE;
              tx_NS    = IDLE;
            end
            end
        end else if (tx32b_done) begin
        end else if (tx32b_done) begin
            if (data_valid) begin
            if (data_valid) begin
              data_int_next = txdata;
              data_int_next = txdata;
              data_ready    = 1'b1;
              data_ready    = 1'b1;
            end else begin
            end else begin
              clk_en_o = 1'b0;
 
              tx_NS    = IDLE;
              tx_NS    = IDLE;
            end
            end
        end
        end
      end
      end
    endcase
    endcase
Line 149... Line 136...
    begin
    begin
      counter      <= 0;
      counter      <= 0;
      data_int     <= 'h0;
      data_int     <= 'h0;
      tx_CS        <= IDLE;
      tx_CS        <= IDLE;
      en_quad      <= 0;
      en_quad      <= 0;
 
      tx_done      <= '0;
 
      clk_en_o     <= '0;
 
      sdo0         <= '0;
 
      sdo1         <= '0;
 
      sdo2         <= '0;
 
      sdo3         <= '0;
 
      counter_trgt <= '0;
    end
    end
    else
    else
    begin
    begin
       if(tx_edge) begin
       if(tx_edge) begin
          counter      <= counter_next;
          counter      <= counter_next;
          data_int     <= data_int_next;
          data_int     <= data_int_next;
          sdo0         <= (en_quad_in) ? data_int_next[28] : data_int_next[31];
          sdo0         <= (en_quad_in) ? data_int_next[28] : data_int_next[31];
          sdo1         <= (en_quad_in) ? data_int_next[29] : 1'b1;
          sdo1         <= (en_quad_in) ? data_int_next[29] : 1'b0;
          sdo2         <= (en_quad_in) ? data_int_next[30] : 1'b1;
          sdo2         <= (en_quad_in) ? data_int_next[30] : 1'b0;
          sdo3         <= (en_quad_in) ? data_int_next[31] : 1'b1;
          sdo3         <= (en_quad_in) ? data_int_next[31] : 1'b0;
          tx_CS        <= tx_NS;
          tx_CS        <= tx_NS;
          en_quad      <= en_quad_in;
          en_quad      <= en_quad_in;
 
          tx_done      <= (counter_next == (counter_trgt -1)) && (tx_NS == TRANSMIT);
 
          clk_en_o     <= (tx_NS == TRANSMIT);
 
       end
 
       // Counter Exit condition, quad mode div-4 , else actual counter
 
       if (en && data_valid) begin
 
          counter_trgt <= (en_quad_in) ? {2'b00,counter_in[15:2]} : counter_in;
       end
       end
    end
    end
  end
  end
endmodule
endmodule

powered by: WebSVN 2.1.0

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