1 |
2 |
smpickett |
//==================================================================
|
2 |
|
|
// File: d_Driver_ADC.v
|
3 |
|
|
// Version: 0.01
|
4 |
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
5 |
|
|
// Copyright Stephen Pickett
|
6 |
|
|
// April 28, 2005
|
7 |
|
|
//------------------------------------------------------------------
|
8 |
|
|
// Revisions:
|
9 |
|
|
// Ver 0.01 Apr 28, 2005 Initial Release
|
10 |
|
|
//
|
11 |
|
|
//==================================================================
|
12 |
|
|
|
13 |
|
|
module Driver_ADC(
|
14 |
|
|
CLK_64MHZ, MASTER_RST,
|
15 |
|
|
TIME_BASE,
|
16 |
|
|
ADC_CLK, ADC_DATA,
|
17 |
|
|
DATA_OUT
|
18 |
|
|
);
|
19 |
|
|
|
20 |
|
|
//==================================================================//
|
21 |
|
|
// DEFINITIONS //
|
22 |
|
|
//==================================================================//
|
23 |
|
|
parameter US1 = 5'd0;
|
24 |
|
|
parameter US2 = 5'd1;
|
25 |
|
|
parameter US4 = 5'd2;
|
26 |
|
|
parameter US8 = 5'd3;
|
27 |
|
|
parameter US16 = 5'd4;
|
28 |
|
|
parameter US32 = 5'd5;
|
29 |
|
|
parameter US64 = 5'd6;
|
30 |
|
|
parameter US128 = 5'd7;
|
31 |
|
|
parameter US512 = 5'd8;
|
32 |
|
|
parameter US1024 = 5'd9;
|
33 |
|
|
parameter US2048 = 5'd10;
|
34 |
|
|
parameter US4096 = 5'd11;
|
35 |
|
|
parameter US8192 = 5'd12;
|
36 |
|
|
parameter US16384 = 5'd13;
|
37 |
|
|
parameter US32768 = 5'd14;
|
38 |
|
|
parameter US65536 = 5'd15;
|
39 |
|
|
parameter US131072 = 5'd16;
|
40 |
|
|
parameter US262144 = 5'd17;
|
41 |
|
|
parameter US524288 = 5'd18;
|
42 |
|
|
parameter US1048576 = 5'd19;
|
43 |
|
|
parameter US2097152 = 5'd20;
|
44 |
|
|
parameter US4194304 = 5'd21;
|
45 |
|
|
parameter US8388608 = 5'd22;
|
46 |
|
|
|
47 |
|
|
|
48 |
|
|
//==================================================================//
|
49 |
|
|
// VARIABLE DEFINITIONS //
|
50 |
|
|
//==================================================================//
|
51 |
|
|
|
52 |
|
|
//----------------------//
|
53 |
|
|
// INPUTS / OUTPUTS //
|
54 |
|
|
//----------------------//
|
55 |
|
|
input CLK_64MHZ; // Global System Clock
|
56 |
|
|
input MASTER_RST; // Global Asyncronous Reset
|
57 |
|
|
input[5:0] TIME_BASE; // The selected V/Div
|
58 |
|
|
input[7:0] ADC_DATA; // Data recieved from ADC
|
59 |
|
|
output ADC_CLK; // Clock out to the ADC
|
60 |
|
|
output[7:0] DATA_OUT; // Data output (essentially buffered from ADC by one clk)
|
61 |
|
|
|
62 |
|
|
//----------------------//
|
63 |
|
|
// WIRES / NODES //
|
64 |
|
|
//----------------------//
|
65 |
|
|
wire CLK_64MHZ, MASTER_RST;
|
66 |
|
|
wire[5:0] TIME_BASE;
|
67 |
|
|
wire[7:0] ADC_DATA;
|
68 |
|
|
reg ADC_CLK;
|
69 |
|
|
wire [7:0] DATA_OUT;
|
70 |
|
|
|
71 |
|
|
//----------------------//
|
72 |
|
|
// VARIABLES //
|
73 |
|
|
//----------------------//
|
74 |
|
|
|
75 |
|
|
|
76 |
|
|
|
77 |
|
|
|
78 |
|
|
//==================================================================//
|
79 |
|
|
// FUNCTIONAL DEFINITIONS //
|
80 |
|
|
//==================================================================//
|
81 |
|
|
|
82 |
|
|
|
83 |
|
|
|
84 |
|
|
//------------------------------------------------------------------//
|
85 |
|
|
// CLOCK GENERATION AND SELECTION //
|
86 |
|
|
//------------------------------------------------------------------//
|
87 |
|
|
reg[15:0] Counter_CLK;
|
88 |
|
|
wire CLK_32MHZ, CLK_16MHZ, CLK_8MHZ, CLK_4MHZ, CLK_2MHZ, CLK_1MHZ, CLK_500KHZ, CLK_250KHZ, CLK_125KHZ,
|
89 |
|
|
CLK_62KHZ, CLK_31KHZ, CLK_16KHZ, CLK_8KHZ, CLK_4KHZ, CLK_2KHZ, CLK_1KHZ;
|
90 |
|
|
|
91 |
|
|
always @ (posedge CLK_64MHZ or posedge MASTER_RST) begin
|
92 |
|
|
if(MASTER_RST == 1'b1) begin
|
93 |
|
|
Counter_CLK <= 16'b0;
|
94 |
|
|
end else begin
|
95 |
|
|
Counter_CLK <= Counter_CLK + 1;
|
96 |
|
|
end
|
97 |
|
|
end
|
98 |
|
|
|
99 |
|
|
assign CLK_32MHZ = Counter_CLK[0];
|
100 |
|
|
assign CLK_16MHZ = Counter_CLK[1];
|
101 |
|
|
assign CLK_8MHZ = Counter_CLK[2];
|
102 |
|
|
assign CLK_4MHZ = Counter_CLK[3];
|
103 |
|
|
assign CLK_2MHZ = Counter_CLK[4];
|
104 |
|
|
assign CLK_1MHZ = Counter_CLK[5];
|
105 |
|
|
assign CLK_500KHZ = Counter_CLK[6];
|
106 |
|
|
assign CLK_250KHZ = Counter_CLK[7];
|
107 |
|
|
assign CLK_125KHZ = Counter_CLK[8];
|
108 |
|
|
assign CLK_62KHZ = Counter_CLK[9];
|
109 |
|
|
assign CLK_31KHZ = Counter_CLK[10];
|
110 |
|
|
assign CLK_16KHZ = Counter_CLK[11];
|
111 |
|
|
assign CLK_8KHZ = Counter_CLK[12];
|
112 |
|
|
assign CLK_4KHZ = Counter_CLK[13];
|
113 |
|
|
assign CLK_2KHZ = Counter_CLK[14];
|
114 |
|
|
assign CLK_1KHZ = Counter_CLK[15];
|
115 |
|
|
//assign CLK_500HZ = Counter_CLK[16];
|
116 |
|
|
|
117 |
|
|
|
118 |
|
|
always @ (TIME_BASE or MASTER_RST or CLK_64MHZ or CLK_32MHZ or CLK_16MHZ or
|
119 |
|
|
CLK_8MHZ or CLK_4MHZ or CLK_2MHZ or CLK_1MHZ or CLK_500KHZ or CLK_250KHZ or
|
120 |
|
|
CLK_125KHZ or CLK_62KHZ or CLK_31KHZ or CLK_16KHZ or CLK_8KHZ or CLK_4KHZ or
|
121 |
|
|
CLK_2KHZ or CLK_1KHZ) begin
|
122 |
|
|
if(MASTER_RST == 1'b1) begin
|
123 |
|
|
ADC_CLK = 1'b0;
|
124 |
|
|
end else if(TIME_BASE == 6'd0) begin // 1us/Div, 1samp/pxl
|
125 |
|
|
ADC_CLK = CLK_64MHZ;
|
126 |
|
|
end else if(TIME_BASE == 6'd1) begin // 2us/Div, 2samp/pxl
|
127 |
|
|
ADC_CLK = CLK_64MHZ;
|
128 |
|
|
end else if(TIME_BASE == 6'd2) begin // 4us/Div, 2samp/pxl
|
129 |
|
|
ADC_CLK = CLK_32MHZ;
|
130 |
|
|
end else if(TIME_BASE == 6'd3) begin // 8us/Div, 2samp/pxl
|
131 |
|
|
ADC_CLK = CLK_16MHZ;
|
132 |
|
|
end else if(TIME_BASE == 6'd4) begin // 16us/Div, 2samp/pxl
|
133 |
|
|
ADC_CLK = CLK_8MHZ;
|
134 |
|
|
end else if(TIME_BASE == 6'd5) begin // 32us/Div, 2samp/pxl
|
135 |
|
|
ADC_CLK = CLK_4MHZ;
|
136 |
|
|
end else if(TIME_BASE == 6'd6) begin // 64us/Div, 2samp/pxl
|
137 |
|
|
ADC_CLK = CLK_2MHZ;
|
138 |
|
|
end else if(TIME_BASE == 6'd7) begin // 128us/Div, 2samp/pxl
|
139 |
|
|
ADC_CLK = CLK_1MHZ;
|
140 |
|
|
end else if(TIME_BASE == 6'd8) begin // 256us/Div, 2samp/pxl
|
141 |
|
|
ADC_CLK = CLK_500KHZ;
|
142 |
|
|
end else if(TIME_BASE == 6'd9) begin // 512us/Div, 2samp/pxl
|
143 |
|
|
ADC_CLK = CLK_250KHZ;
|
144 |
|
|
end else if(TIME_BASE == 6'd10) begin // ...
|
145 |
|
|
ADC_CLK = CLK_125KHZ;
|
146 |
|
|
end else if(TIME_BASE == 6'd11) begin
|
147 |
|
|
ADC_CLK = CLK_62KHZ;
|
148 |
|
|
end else if(TIME_BASE == 6'd12) begin
|
149 |
|
|
ADC_CLK = CLK_31KHZ;
|
150 |
|
|
end else if(TIME_BASE == 6'd13) begin
|
151 |
|
|
ADC_CLK = CLK_16KHZ;
|
152 |
|
|
end else if(TIME_BASE == 6'd14) begin
|
153 |
|
|
ADC_CLK = CLK_8KHZ;
|
154 |
|
|
end else if(TIME_BASE == 6'd15) begin
|
155 |
|
|
ADC_CLK = CLK_4KHZ;
|
156 |
|
|
end else if(TIME_BASE == 6'd16) begin
|
157 |
|
|
ADC_CLK = CLK_2KHZ;
|
158 |
|
|
end else if(TIME_BASE == 6'd17) begin
|
159 |
|
|
ADC_CLK = CLK_1KHZ;
|
160 |
|
|
// end else if(TIME_BASE == 6'd18) begin
|
161 |
|
|
// ADC_CLK = CLK_500HZ;
|
162 |
|
|
/*
|
163 |
|
|
end else if(TIME_BASE == 6'd19) begin
|
164 |
|
|
ADC_CLK = CLK_US524288;
|
165 |
|
|
end else if(TIME_BASE == 6'd20) begin
|
166 |
|
|
ADC_CLK = CLK_US1048576;
|
167 |
|
|
end else if(TIME_BASE == 6'd21) begin
|
168 |
|
|
ADC_CLK = CLK_US2097152;
|
169 |
|
|
end else if(TIME_BASE == 6'd22) begin
|
170 |
|
|
ADC_CLK = CLK_US4194304;
|
171 |
|
|
end else if(TIME_BASE == 6'd23) begin
|
172 |
|
|
ADC_CLK = CLK_US8388608;
|
173 |
|
|
*/
|
174 |
|
|
end else begin
|
175 |
|
|
ADC_CLK = 1'b0;
|
176 |
|
|
end
|
177 |
|
|
end
|
178 |
|
|
|
179 |
|
|
//------------------------------------------------------------------//
|
180 |
|
|
// ADC DATA READING //
|
181 |
|
|
//------------------------------------------------------------------//
|
182 |
|
|
/*
|
183 |
|
|
always @ (negedge ADC_CLK or posedge MASTER_RST) begin
|
184 |
|
|
if(MASTER_RST == 1'b1) begin
|
185 |
|
|
DATA_OUT <= 8'b0;
|
186 |
|
|
end else begin
|
187 |
|
|
DATA_OUT <= ADC_DATA;
|
188 |
|
|
end
|
189 |
|
|
end
|
190 |
|
|
*/
|
191 |
|
|
|
192 |
|
|
assign DATA_OUT = ADC_DATA;
|
193 |
|
|
|
194 |
|
|
endmodule
|
195 |
|
|
|
196 |
|
|
|
197 |
|
|
|