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

Subversion Repositories yifive

[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [spi_master/] [src/] [spim_clkgen.sv] - Blame information for rev 21

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 18 dinesha
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  SPI Clkgen  Module                                          ////
4
////                                                              ////
5
////  This file is part of the YIFive cores project               ////
6
////  http://www.opencores.org/cores/yifive/                      ////
7
////                                                              ////
8
////  Description                                                 ////
9
////      This is SPI Master Clock Generation control logic.      ////
10
////      This logic also generate spi clock rise and fall pulse  ////
11
////      Basis assumption is master clock is 2x time spi clock   ////
12
////         1. spi fall pulse is used to transmit spi data       ////
13
////         2. spi rise pulse is used to received spi data       ////
14
////     SPI Master Top module                                    ////
15
////                                                              ////
16
////  To Do:                                                      ////
17
////    nothing                                                   ////
18
////                                                              ////
19
////  Author(s):                                                  ////
20
////      - Dinesh Annayya, dinesha@opencores.org                 ////
21
////                                                              ////
22
////  Revision:                                                   ////
23
////      0.1 - 16th Feb 2021, Dinesh A                           ////
24
////            Initial version                                   ////
25
////      0.2 - 24th Mar 2021, Dinesh A                           ////
26
////            1. Comments are added                             ////
27
////            2. RTL clean-up done and the output are registred ////
28
////                                                              ////
29
//////////////////////////////////////////////////////////////////////
30
////                                                              ////
31
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
32
////                                                              ////
33
//// This source file may be used and distributed without         ////
34
//// restriction provided that this copyright statement is not    ////
35
//// removed from the file and that any derivative work contains  ////
36
//// the original copyright notice and the associated disclaimer. ////
37
////                                                              ////
38
//// This source file is free software; you can redistribute it   ////
39
//// and/or modify it under the terms of the GNU Lesser General   ////
40
//// Public License as published by the Free Software Foundation; ////
41
//// either version 2.1 of the License, or (at your option) any   ////
42
//// later version.                                               ////
43
////                                                              ////
44
//// This source is distributed in the hope that it will be       ////
45
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
46
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
47
//// PURPOSE.  See the GNU Lesser General Public License for more ////
48
//// details.                                                     ////
49
////                                                              ////
50
//// You should have received a copy of the GNU Lesser General    ////
51
//// Public License along with this source; if not, download it   ////
52
//// from http://www.opencores.org/lgpl.shtml                     ////
53
////                                                              ////
54
//////////////////////////////////////////////////////////////////////
55
 
56
module spim_clkgen
57
(
58
    input  logic                        clk,
59
    input  logic                        rstn,
60
    input  logic                        en,
61
    input  logic          [7:0]         cfg_sck_period,
62
    output logic                        spi_clk,
63
    output logic                        spi_fall,
64
    output logic                        spi_rise
65
);
66
 
67
        logic [7:0] sck_half_period;
68
        logic [7:0] clk_cnt;
69
 
70
    assign sck_half_period = {1'b0, cfg_sck_period[7:1]};
71
 
72
    // The first transition on the sck_toggle happens one SCK period
73
    // after en is asserted
74
    always @(posedge clk or negedge rstn) begin
75
        if(!rstn) begin
76
           clk_cnt    <= 'h1;
77
           spi_clk    <= 1'b1;
78
           spi_fall   <= 1'b0;
79
           spi_rise   <= 1'b0;
80
        end // if (!reset_n)
81
        else
82
        begin
83
           if(en)
84
           begin
85
              if(clk_cnt == sck_half_period)
86
              begin
87
                 spi_clk    <= 1'b0;
88
              end // if (clk_cnt == sck_half_period)
89 21 dinesha
              else if(clk_cnt == cfg_sck_period) begin
90 18 dinesha
                    spi_clk    <= 1'b1;
91 21 dinesha
              end
92
           end else begin
93
              spi_clk    <= 1'b1;
94 18 dinesha
           end // else: !if(en)
95
        end // else: !if(!reset_n)
96
    end // always @ (posedge clk or negedge reset_n)
97
 
98 21 dinesha
    // Generate Free runnng spi_fall and rise pulse
99
    // after en is asserted
100
    always @(posedge clk or negedge rstn) begin
101
        if(!rstn) begin
102
           clk_cnt    <= 'h1;
103
           spi_fall   <= 1'b0;
104
           spi_rise   <= 1'b0;
105
        end // if (!reset_n)
106
        else
107
        begin
108
           if(clk_cnt == sck_half_period)
109
           begin
110
              spi_fall   <= 1'b0;
111
              spi_rise   <= 1'b1;
112
              clk_cnt    <= clk_cnt + 1'b1;
113
           end // if (clk_cnt == sck_half_period)
114
           else begin
115
              if(clk_cnt == cfg_sck_period)
116
              begin
117
                 spi_fall   <= 1'b1;
118
                 spi_rise   <= 1'b0;
119
                 clk_cnt    <= 'h1;
120
              end // if (clk_cnt == cfg_sck_period)
121
              else
122
              begin
123
                 clk_cnt    <= clk_cnt + 1'b1;
124
                 spi_fall   <= 1'b0;
125
                 spi_rise   <= 1'b0;
126
               end // else: !if(clk_cnt == cfg_sck_period)
127
           end // else: !if(clk_cnt == sck_half_period)
128
        end // else: !if(!reset_n)
129
    end // always @ (posedge clk or negedge reset_n)
130
 
131 18 dinesha
endmodule

powered by: WebSVN 2.1.0

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