source: PlatformSupport/Deprecated/pcores/EEPROM_v1_01_a/hdl/verilog/clk_prescaler.v

Last change on this file was 564, checked in by murphpo, 17 years ago

Updated EEPROM core with synthesis constraints to prevent unnecessary BUFG usage

File size: 5.4 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   reg    clk_div;            // divided clk for hdrive
50   reg    en_div;             // enable use of divided clk for hdrive
51   reg    clk_prescaled_reg;
52   reg [6:0] div_cnt;
53   reg [2:0] ClkPrescale;
54   
55   parameter [2:0] s0=3'b000, s1=3'b001, s2=3'b010, s3=3'b011, s4=3'b100,
56                   s5=3'b101, s6=3'b110;
57   
58
59  //--------------------------------------------------------------------------
60  //  Clock Prescaler
61  //--------------------------------------------------------------------------
62  wire rst_clk = MR || !CLK_EN;
63
64  always @(posedge rst_clk or posedge CLK)
65    if(rst_clk)
66      ClkPrescale <= s0;
67    else
68      case(ClkPrescale)
69        s0:      ClkPrescale <= s1;
70 
71        s1:      ClkPrescale <= s2;
72
73        s2:      if(pre_0 && !pre_1)
74                   ClkPrescale <= s0;
75                 else
76                   ClkPrescale <= s3;
77
78        s3:      ClkPrescale <= s4;
79
80        s4:      if(!pre_0 && pre_1)
81                   ClkPrescale <= s0;
82                 else
83                   ClkPrescale <= s5;
84
85        s5:      ClkPrescale <= s6;
86 
87        s6:      ClkPrescale <= s0;
88
89        default: ClkPrescale<=s0;
90      endcase
91
92   reg en_clk;
93
94   //
95   // Create prescaled clock
96   //
97   always @(posedge MR or posedge CLK)
98      if (MR)
99         clk_prescaled_reg<=1;
100      else
101         clk_prescaled_reg <= (!ClkPrescale[0] && !ClkPrescale[1] 
102                               && !ClkPrescale[2]); 
103   
104  //assign clk_prescaled = (!pre_0 && !pre_1 && CLK_EN)?CLK:clk_prescaled_reg;
105
106  always @(posedge MR or negedge CLK)
107    if (MR)
108      en_clk <= 1'b1;
109    else
110      en_clk <= CLK_EN && ((!pre_0 && !pre_1) || (ClkPrescale[2:0] == 3'b000));
111
112  assign clk_prescaled = en_clk & CLK;
113 
114  //--------------------------------------------------------------------------
115  //  Clock Divider
116  //  using clk_prescaled as its input, this divide-by-2 chain does the
117  //  other clock division
118  //--------------------------------------------------------------------------
119  always @(posedge MR or posedge CLK)
120    if (MR)
121      div_cnt <= 7'h00;
122    else if (en_clk)
123      div_cnt <= div_cnt + 1;
124
125  reg    clk_1us_en;
126
127  always @(posedge MR or negedge CLK)
128    if (MR) 
129      clk_1us_en <= 1'b1;
130    else
131      case ({div_3, div_2, div_1})
132        3'b000 : clk_1us_en <= CLK_EN;
133        3'b001 : clk_1us_en <= ~div_cnt[0];
134        3'b010 : clk_1us_en <= (div_cnt[1:0] == 2'h1);
135        3'b011 : clk_1us_en <= (div_cnt[2:0] == 3'h3);
136        3'b100 : clk_1us_en <= (div_cnt[3:0] == 4'h7);
137        3'b101 : clk_1us_en <= (div_cnt[4:0] == 5'h0f);
138        3'b110 : clk_1us_en <= (div_cnt[5:0] == 6'h1f);
139        3'b111 : clk_1us_en <= (div_cnt[6:0] == 7'h3f);
140      endcase
141
142  always @(clk_1us_en or en_clk or CLK)
143    clk_1us = clk_1us_en & en_clk & CLK;
144
145endmodule // clk_prescaler
Note: See TracBrowser for help on using the repository browser.