source: PlatformSupport/CustomPeripherals/pcores/eeprom_v1_07_a/hdl/verilog/clk_prescaler.v

Last change on this file was 1166, checked in by murphpo, 15 years ago

adding updated EEPROM core/driver with better clocking

File size: 5.8 KB
Line 
1//--------------------------------------------------------------------------
2//                                                                        --
3//  OneWireMaster                                                         --
4//   A synthesizable 1-wire master peripheral                             --
5//   Copyright 1999-2005 Dallas Semiconductor Corporation                 --
6//                                                                        --
7//--------------------------------------------------------------------------
8//                                                                        --
9//  Purpose:  Provides timing and control of Dallas 1-wire bus            --
10//            through a memory-mapped peripheral                          --
11//  File:     clk_prescaler.v                                             --
12//  Date:     February 1, 2005                                            --
13//  Version:  v2.100                                                      --
14//  Authors:  Rick Downs and Charles Hill,                                --
15//            Dallas Semiconductor Corporation                            --
16//                                                                        --
17//  Note:     This source code is available for use without license.      --
18//            Dallas Semiconductor is not responsible for the             --
19//            functionality or utility of this product.                   --
20//                                                                        --
21//  REV:      Significant changes to improve synthesis - English          --
22//            Ported to Verilog - Sandelin                                --
23//--------------------------------------------------------------------------
24
25module clk_prescaler( 
26   CLK, CLK_EN, div_1, div_2, div_3, MR, pre_0, pre_1, clk_1us);
27   
28   input  CLK;
29   input  CLK_EN;              // enables the divide chain
30   input  div_1;               // divider select bit 1
31   input  div_2;               // divider select bit 2
32   input  div_3;               // divider select bit 3
33   input  MR;
34   input  pre_0;               // prescaler select bit 0
35   input  pre_1;               // prescaler select bit 1
36
37   output clk_1us;             // OD, STD mode fsm clock
38   
39   wire   CLK;
40   wire   MR;
41   wire   pre_0;
42   wire   pre_1;
43   wire   div_1;
44   wire   div_2;
45   wire   div_3;
46   
47   wire   clk_prescaled;      // prescaled clock output
48//   reg    clk_1us;            // 1us timebase for 1-wire STD and OD trans
49   wire    clk_1us;            // 1us timebase for 1-wire STD and OD trans
50   reg    clk_div;            // divided clk for hdrive
51   reg    en_div;             // enable use of divided clk for hdrive
52   reg    clk_prescaled_reg;
53   reg [6:0] div_cnt;
54   reg [2:0] ClkPrescale;
55   
56   parameter [2:0] s0=3'b000, s1=3'b001, s2=3'b010, s3=3'b011, s4=3'b100,
57                   s5=3'b101, s6=3'b110;
58   
59
60  //--------------------------------------------------------------------------
61  //  Clock Prescaler
62  //--------------------------------------------------------------------------
63  wire rst_clk = MR || !CLK_EN;
64
65  always @(posedge rst_clk or posedge CLK)
66    if(rst_clk)
67      ClkPrescale <= s0;
68    else
69      case(ClkPrescale)
70        s0:      ClkPrescale <= s1;
71 
72        s1:      ClkPrescale <= s2;
73
74        s2:      if(pre_0 && !pre_1)
75                   ClkPrescale <= s0;
76                 else
77                   ClkPrescale <= s3;
78
79        s3:      ClkPrescale <= s4;
80
81        s4:      if(!pre_0 && pre_1)
82                   ClkPrescale <= s0;
83                 else
84                   ClkPrescale <= s5;
85
86        s5:      ClkPrescale <= s6;
87 
88        s6:      ClkPrescale <= s0;
89
90        default: ClkPrescale<=s0;
91      endcase
92
93   reg en_clk;
94
95   //
96   // Create prescaled clock
97   //
98   always @(posedge MR or posedge CLK)
99      if (MR)
100         clk_prescaled_reg<=1;
101      else
102         clk_prescaled_reg <= (!ClkPrescale[0] && !ClkPrescale[1] 
103                               && !ClkPrescale[2]); 
104   
105  //assign clk_prescaled = (!pre_0 && !pre_1 && CLK_EN)?CLK:clk_prescaled_reg;
106
107  always @(posedge MR or negedge CLK)
108    if (MR)
109      en_clk <= 1'b1;
110    else
111      en_clk <= CLK_EN && ((!pre_0 && !pre_1) || (ClkPrescale[2:0] == 3'b000));
112
113  assign clk_prescaled = en_clk & CLK;
114 
115  //--------------------------------------------------------------------------
116  //  Clock Divider
117  //  using clk_prescaled as its input, this divide-by-2 chain does the
118  //  other clock division
119  //--------------------------------------------------------------------------
120  always @(posedge MR or posedge CLK)
121    if (MR)
122      div_cnt <= 7'h00;
123    else if (en_clk)
124      div_cnt <= div_cnt + 1;
125
126  reg    clk_1us_en;
127
128  always @(posedge MR or negedge CLK)
129    if (MR) 
130      clk_1us_en <= 1'b1;
131    else
132      case ({div_3, div_2, div_1})
133        3'b000 : clk_1us_en <= CLK_EN;
134        3'b001 : clk_1us_en <= ~div_cnt[0];
135        3'b010 : clk_1us_en <= (div_cnt[1:0] == 2'h1);
136        3'b011 : clk_1us_en <= (div_cnt[2:0] == 3'h3);
137        3'b100 : clk_1us_en <= (div_cnt[3:0] == 4'h7);
138        3'b101 : clk_1us_en <= (div_cnt[4:0] == 5'h0f);
139        3'b110 : clk_1us_en <= (div_cnt[5:0] == 6'h1f);
140        3'b111 : clk_1us_en <= (div_cnt[6:0] == 7'h3f);
141      endcase
142
143  reg clk_1us_en_d1;
144
145//  always @(clk_1us_en or en_clk or CLK)
146//  assign clk_1us_gen <= clk_1us_en && en_clk && CLK;
147
148  //negedge CLK to match clk_1us_en procedure above
149  always @(negedge CLK)
150  if(!en_clk)
151    clk_1us_en_d1 <= 1'b0;
152  else
153    clk_1us_en_d1 <= clk_1us_en;
154 
155
156  //Pulse generator - only stays high 1 CLK cycle
157  assign clk_1us = (!clk_1us_en_d1 && clk_1us_en);
158
159endmodule // clk_prescaler
Note: See TracBrowser for help on using the repository browser.