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

Subversion Repositories alternascope

[/] [alternascope/] [tags/] [Devel/] [AdcDriver/] [d_Driver_RamBuffer.v] - Blame information for rev 30

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

powered by: WebSVN 2.1.0

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