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

Subversion Repositories alternascope

[/] [alternascope/] [trunk/] [AdcDriver/] [d_Driver_RamBuffer.v] - Blame information for rev 32

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 smpickett
//==================================================================
2
// File:    d_Driver_RamBuffer.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 ADCDataBuffer(
14
    CLK_64MHZ, MASTER_RST,
15
    CLK180_64MHZ,
16
    TIME_BASE,
17
    RAM_ADDR, RAM_DATA, RAM_CLK,
18
    ADC_DATA, ADC_CLK,
19
    TRIG_ADDR,
20
    VGA_WRITE_DONE,
21 17 smpickett
    TRIGGER_LEVEL,
22
    sm_trig
23 2 smpickett
    );
24
 
25
//==================================================================//
26
// PARAMETER DEFINITIONS                                            //
27
//==================================================================//
28
parameter ss_wait_for_trig  = 2'b00;
29
parameter ss_fill_mem_half  = 2'b01;
30
parameter ss_write_buffer   = 2'b11;
31
parameter ss_invalid        = 2'b10;
32
parameter P_trigger_level   = 8'h80;
33
 
34
 
35
 
36
 
37
//==================================================================//
38
// VARIABLE DEFINITIONS                                             //
39
//==================================================================//
40
 
41
//----------------------//
42
// INPUTS / OUTPUTS     //
43
//----------------------//
44
input        CLK_64MHZ;
45
input        CLK180_64MHZ;
46
input        MASTER_RST;         // Global Asyncronous Reset
47
input[5:0]   TIME_BASE;          // The selected V/Div
48
input[10:0]  RAM_ADDR;
49
output[7:0]  RAM_DATA;
50
input        RAM_CLK;
51
input[7:0]   ADC_DATA;
52
output       ADC_CLK;
53
output[10:0] TRIG_ADDR;
54
input        VGA_WRITE_DONE;
55
input[8:0]   TRIGGER_LEVEL;
56
 
57 17 smpickett
output[1:0] sm_trig;
58
 
59
 
60 2 smpickett
//----------------------//
61
// WIRES / NODES        //
62
//----------------------//
63
wire CLK_64MHZ, MASTER_RST, CLK180_64MHZ;
64
wire[5:0]  TIME_BASE;
65
wire[10:0] RAM_ADDR;
66
wire[7:0]  RAM_DATA;
67
wire       RAM_CLK;
68
wire[7:0]  ADC_DATA;
69
wire       ADC_CLK;
70
reg[10:0]  TRIG_ADDR;
71
wire       VGA_WRITE_DONE;
72
wire[8:0]  TRIGGER_LEVEL;
73
 
74
//----------------------//
75
// VARIABLES            //
76
//----------------------//
77
 
78
 
79
 
80
//==================================================================//
81
// 'SUB-ROUTINES'                                                   //
82
//==================================================================//
83
//------------------------------------------------------------------//
84
// Instanstiate the ADC                                             //
85
//------------------------------------------------------------------//
86
wire[7:0] DATA_FROM_ADC;
87
Driver_ADC ADC(
88
    .CLK_64MHZ(CLK_64MHZ),
89
    .MASTER_RST(MASTER_RST),
90
    .TIME_BASE(TIME_BASE),
91
    .ADC_CLK(ADC_CLK),
92
    .ADC_DATA(ADC_DATA),
93
    .DATA_OUT(DATA_FROM_ADC)
94
    );
95
 
96
//------------------------------------------------------------------//
97
// Initialize the RAMs WE WILL NEED MORE!                           //
98
//   RAM is structured as follows:                                  //
99
//     Dual-Access RAM                                              //
100
//     18kBits -> 2048Bytes + 1Parity/Byte                          //
101
//     Access A: 8bit + 1parity (ADC_Write)                         //
102
//     Access B: 8bit + 1parity (Read)                              //
103
//------------------------------------------------------------------//
104 17 smpickett
reg[10:0] ADDRA;
105 2 smpickett
wire VCC, GND;
106
assign VCC = 1'b1;
107
assign GND = 1'b0;
108
 
109
RAMB16_S9_S9 ADC_QuasiFifo_Buffer(
110
    .DOA(),                 .DOB(RAM_DATA),
111
    .DOPA(),                .DOPB(),
112
    .ADDRA(ADDRA),          .ADDRB(RAM_ADDR),
113
    .CLKA(CLK180_64MHZ),    .CLKB(RAM_CLK),
114
    .DIA(DATA_FROM_ADC),    .DIB(8'b0),
115
    .DIPA(GND),             .DIPB(GND),
116
    .ENA(VCC),              .ENB(VCC),
117
    .WEA(VCC),              .WEB(GND),
118
    .SSRA(GND),             .SSRB(GND)
119
    );
120
 
121
//==================================================================//
122
// FUNCTIONAL DEFINITIONS                                           //
123
//==================================================================//
124
 
125
reg[1:0] sm_trig;
126
reg trigger_detected;
127
reg[9:0] cnt_1024bytes;
128
reg mem_half_full;
129
 
130
/* THE RAM WRITING TRIGGERING STATE MACHINE */
131
always @ (posedge CLK_64MHZ or posedge MASTER_RST) begin
132
    if(MASTER_RST == 1'b1)
133
        sm_trig <= ss_wait_for_trig;
134
    else if(sm_trig == ss_wait_for_trig && trigger_detected == 1'b1)
135
        sm_trig <= ss_fill_mem_half;
136
    else if(sm_trig == ss_fill_mem_half && mem_half_full == 1'b1)
137
        sm_trig <= ss_write_buffer;
138 17 smpickett
    else if(sm_trig == ss_write_buffer && /*trigger_detected == 1'b0 &&*/ VGA_WRITE_DONE == 1'b1)
139 2 smpickett
        sm_trig <= ss_wait_for_trig;
140
    else if(sm_trig == ss_invalid)
141
        sm_trig <= ss_wait_for_trig;
142
    else
143
        sm_trig <= sm_trig;
144
end
145
 
146
 
147
/* THIS PART DEALS WITH THE ADDRESS OF THE ADC BUFFER   */
148
/* Write in a Circular Buffer soft of way               */
149
always @ (posedge ADC_CLK or posedge MASTER_RST) begin
150
    if(MASTER_RST == 1'b1) begin
151
        ADDRA <= 11'b0;
152
    end else if(sm_trig == ss_wait_for_trig || sm_trig == ss_fill_mem_half)
153
        ADDRA <= ADDRA + 1;
154
    else
155
        ADDRA <= ADDRA;
156 17 smpickett
//        ADDRA <= ADDRA + 1;
157 2 smpickett
end
158
 
159
/* LATCHING THE TRIGGER  */
160
always @ (ADC_DATA) begin
161
    if(ADC_DATA >= TRIGGER_LEVEL)
162
        trigger_detected = 1'b1;
163
    else
164
        trigger_detected = 1'b0;
165
end
166
 
167
/* GATHERING 1024 MORE BYTES OF MEMORY */
168
always @ (posedge ADC_CLK or posedge MASTER_RST) begin
169
    if(MASTER_RST == 1'b1)
170
        cnt_1024bytes <= 10'b0;
171
    else if(sm_trig == ss_fill_mem_half)
172
        cnt_1024bytes <= cnt_1024bytes + 1;
173
    else
174 17 smpickett
        cnt_1024bytes <= 10'b0;
175
//        cnt_1024bytes <= cnt_1024bytes;
176 2 smpickett
end
177
 
178
always @ (cnt_1024bytes) begin
179
    if(cnt_1024bytes == 10'h3FF)
180
        mem_half_full = 1'b1;
181
    else
182
        mem_half_full = 1'b0;
183
end
184
 
185
/* STORING THE TRIGGER ADDRESS */
186
always @ (posedge trigger_detected or posedge MASTER_RST) begin
187
    if(MASTER_RST == 1'b1)
188
        TRIG_ADDR <= 11'd0;
189
    else
190
        TRIG_ADDR <= ADDRA;
191
end
192
 
193
 
194
 
195
 
196
 
197
 
198
 
199
 
200
 
201
 
202
 
203
 
204
 
205
 
206
 
207
 
208
 
209
 
210
 
211
endmodule

powered by: WebSVN 2.1.0

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