|
| 1 | +/* note for avalon interface |
| 2 | + bus type: nagtive |
| 3 | + read legacy = 0 (to consistent to FIFO) |
| 4 | +
|
| 5 | +*/ |
| 6 | + |
| 7 | +module adc_fifo( |
| 8 | + // avalon slave port |
| 9 | + input clock, |
| 10 | + input reset_n, |
| 11 | + input addr, |
| 12 | + input read, |
| 13 | + input reg_outdata, |
| 14 | + input write, |
| 15 | + output reg [31:0] readdataout, |
| 16 | + input [31:0] writedatain, |
| 17 | + |
| 18 | + input adc_clk, // max 40mhz |
| 19 | + // adc interface |
| 20 | + output ADC_CONVST_o, |
| 21 | + output ADC_SCK_o, |
| 22 | + output ADC_SDI_o, |
| 23 | + input ADC_SDO_i |
| 24 | +); |
| 25 | + |
| 26 | +parameter ADC = ""; |
| 27 | + |
| 28 | +//////////////////////////////////// |
| 29 | +// avalon slave port |
| 30 | +`define WRITE_REG_START_CH 0 |
| 31 | +`define WRITE_REG_MEASURE_NUM 1 |
| 32 | + |
| 33 | +// write for control |
| 34 | +reg measure_fifo_start; |
| 35 | +reg [11:0] measure_fifo_num; |
| 36 | +reg [2:0] measure_fifo_ch; |
| 37 | +reg auto_ch_select; |
| 38 | + |
| 39 | +always @ ( negedge reset_n or posedge write) |
| 40 | +begin |
| 41 | + if (!reset_n) |
| 42 | + measure_fifo_start <= 1'b0; |
| 43 | + else if (write) begin |
| 44 | + if (addr == `WRITE_REG_START_CH) begin |
| 45 | + measure_fifo_start <= writedatain[0]; |
| 46 | + measure_fifo_ch <= writedatain[6:4]; |
| 47 | + auto_ch_select <= writedatain[8]; |
| 48 | + end |
| 49 | + else if (write && addr == `WRITE_REG_MEASURE_NUM) begin |
| 50 | + {measure_fifo_num} <= writedatain[11:0]; |
| 51 | + end |
| 52 | + end |
| 53 | +end |
| 54 | + |
| 55 | +/////////////////////// |
| 56 | +// read |
| 57 | +`define READ_REG_MEASURE_DONE 0 |
| 58 | +`define READ_REG_ADC_VALUE 1 |
| 59 | +wire slave_read_status; |
| 60 | +wire slave_read_data; |
| 61 | + |
| 62 | +reg post_read; |
| 63 | +//reg reg_outdata;// |
| 64 | + |
| 65 | +always @(posedge clock) begin |
| 66 | + post_read <= read; |
| 67 | +end |
| 68 | +// |
| 69 | +//always @(negedge clock) begin |
| 70 | +// reg_outdata <= (read && post_read) ? 1'b1 : 1'b0; |
| 71 | +//end |
| 72 | +// |
| 73 | +assign slave_read_status = (addr == `READ_REG_MEASURE_DONE) ?1'b1:1'b0; |
| 74 | +assign slave_read_data = (addr == `READ_REG_ADC_VALUE) ?1'b1:1'b0; |
| 75 | + |
| 76 | +reg measure_fifo_done; |
| 77 | +always @ (posedge reg_outdata) |
| 78 | +begin |
| 79 | + if (slave_read_status) |
| 80 | + readdataout <= {4'b0, measure_fifo_num, 9'b0, measure_fifo_ch, 3'b0, measure_fifo_done}; |
| 81 | + else if (slave_read_data) |
| 82 | +// readdataout <= {13'b0, fifo_ch_q, 4'b0, fifo_q}; |
| 83 | + readdataout <= {20'b0, fifo_q}; |
| 84 | +end |
| 85 | + |
| 86 | +reg pre_slave_read_data; |
| 87 | +always @ (posedge clock or negedge reset_n) |
| 88 | +begin |
| 89 | + if (!reset_n) |
| 90 | + pre_slave_read_data <= 1'b0; |
| 91 | + else |
| 92 | + pre_slave_read_data <= slave_read_data; |
| 93 | +end |
| 94 | + |
| 95 | +// read ack for adc data. (note. Slave_read_data is read lency=2, so slave_read_data is assert two clock) |
| 96 | +assign fifo_rdreq = (pre_slave_read_data & slave_read_data)?1'b1:1'b0; |
| 97 | + |
| 98 | +//////////////////////////////////// |
| 99 | +// create triggle message: adc_reset |
| 100 | + |
| 101 | +reg pre_measure_fifo_start; |
| 102 | +always @ (posedge adc_clk) |
| 103 | +begin |
| 104 | + pre_measure_fifo_start <= measure_fifo_start; |
| 105 | +// pre_measure_fifo_start[1] <= pre_measure_fifo_start[0]; |
| 106 | +end |
| 107 | + |
| 108 | +wire adc_reset ; |
| 109 | +assign adc_reset = (!pre_measure_fifo_start & measure_fifo_start)?1'b1:1'b0; |
| 110 | + |
| 111 | +//////////////////////////////////// |
| 112 | +// control measure_start |
| 113 | +reg [11:0] measure_count; |
| 114 | + |
| 115 | +reg config_first; |
| 116 | +reg wait_measure_done; |
| 117 | +reg measure_start; |
| 118 | +wire measure_done; |
| 119 | +wire [11:0] measure_dataread; |
| 120 | +wire [11:0] reading[7:0]; |
| 121 | + |
| 122 | +// auto channel change |
| 123 | +//wire [2:0] adc_ch_sel = (auto_ch_select) ? 3'h7:measure_fifo_ch; |
| 124 | +reg [2:0] adc_ch; |
| 125 | +reg [2:0] adc_ch_dly; |
| 126 | + |
| 127 | +always @ (posedge adc_clk or posedge adc_reset ) |
| 128 | +begin |
| 129 | + if (adc_reset) |
| 130 | + begin |
| 131 | + measure_start <= 1'b0; |
| 132 | + config_first <= 1'b1; |
| 133 | + measure_count <= 0; |
| 134 | + measure_fifo_done <= 1'b0; |
| 135 | + wait_measure_done <= 1'b0; |
| 136 | + adc_ch <= 0; |
| 137 | + end |
| 138 | + else if (!measure_fifo_done & !measure_start & !wait_measure_done) |
| 139 | + begin |
| 140 | + measure_start <= 1'b1; |
| 141 | + wait_measure_done <= 1'b1; |
| 142 | + end |
| 143 | + else if (wait_measure_done) // && measure_start) |
| 144 | + begin |
| 145 | + measure_start <= 1'b0; |
| 146 | + if (measure_done) |
| 147 | + begin |
| 148 | + if (config_first) |
| 149 | + config_first <= 1'b0; |
| 150 | + else |
| 151 | + begin // read data and save into fifo |
| 152 | + if (measure_count < measure_fifo_num) // && !fifo_wrfull) |
| 153 | + begin |
| 154 | + measure_count <= measure_count + 1; |
| 155 | + wait_measure_done <= 1'b0; |
| 156 | + if (pre_measure_fifo_start) |
| 157 | + if (auto_ch_select) |
| 158 | + begin |
| 159 | + adc_ch <= ((adc_ch + 1) & 3'h7); |
| 160 | + adc_ch_dly <= adc_ch; |
| 161 | + end |
| 162 | + else |
| 163 | + begin |
| 164 | + adc_ch <= measure_fifo_ch; |
| 165 | + adc_ch_dly <= adc_ch; |
| 166 | + end |
| 167 | + end |
| 168 | + else |
| 169 | + measure_fifo_done <= 1'b1; |
| 170 | + end |
| 171 | + end |
| 172 | + end |
| 173 | +end |
| 174 | + |
| 175 | +// write data into fifo |
| 176 | + |
| 177 | +reg pre_measure_done; |
| 178 | + |
| 179 | +always @ (posedge adc_clk or posedge adc_reset ) |
| 180 | +begin |
| 181 | + if (adc_reset) |
| 182 | + pre_measure_done <= 1'b0; |
| 183 | + else |
| 184 | + pre_measure_done <= measure_done; |
| 185 | +end |
| 186 | + |
| 187 | +assign fifo_wrreq = (!pre_measure_done & measure_done & !config_first)?1'b1:1'b0; |
| 188 | + |
| 189 | +/////////////////////////////////////// |
| 190 | +// SPI |
| 191 | +/* |
| 192 | +assign measure_dataread = reading[adc_ch]; |
| 193 | +
|
| 194 | +altera_up_adv_adc altera_up_adv_adc_inst |
| 195 | +( |
| 196 | + .clock(adc_clk) , // input clock_sig |
| 197 | + .reset(reset_n) , // input reset_sig |
| 198 | + .go(measure_start) , // input go_sig |
| 199 | + .sclk(ADC_SCK_o) , // output sclk_sig |
| 200 | + .cs_n(ADC_CONVST_o) , // output cs_n_sig |
| 201 | + .din(ADC_SDI_o) , // output din_sig |
| 202 | + .dout(ADC_SDO_i) , // input dout_sig |
| 203 | + .done(measure_done) , // output done_sig |
| 204 | + .reading(reading) // output [11:0] reading_sig |
| 205 | +); |
| 206 | +
|
| 207 | +defparam altera_up_adv_adc_inst.T_SCLK = 'b00000100; |
| 208 | +defparam altera_up_adv_adc_inst.NUM_CH = 'b0111; |
| 209 | +defparam altera_up_adv_adc_inst.BOARD = ADC; |
| 210 | +defparam altera_up_adv_adc_inst.BOARD_REV = "Autodetect"; |
| 211 | +*/ |
| 212 | +adc_ltc2308 adc_ltc2308_inst( |
| 213 | + .clk(adc_clk), // max 40mhz |
| 214 | + |
| 215 | + // start measure |
| 216 | + .measure_start(measure_start), // posedge triggle |
| 217 | + .measure_done(measure_done), |
| 218 | + .measure_ch(adc_ch), |
| 219 | + .measure_dataread(measure_dataread), |
| 220 | + |
| 221 | + |
| 222 | + // adc interface |
| 223 | + .ADC_CONVST(ADC_CONVST_o), |
| 224 | + .ADC_SCK(ADC_SCK_o), |
| 225 | + .ADC_SDI(ADC_SDI_o), |
| 226 | + .ADC_SDO(ADC_SDO_i) |
| 227 | +); |
| 228 | + |
| 229 | + |
| 230 | +/////////////////////////////////////// |
| 231 | +// FIFO |
| 232 | +wire fifo_wrfull; |
| 233 | +wire fifo_rdempty; |
| 234 | +wire fifo_wrreq; |
| 235 | +wire [11:0] fifo_q; |
| 236 | +wire fifo_rdreq; |
| 237 | +wire [2:0] fifo_ch_q; |
| 238 | + |
| 239 | +adc_data_fifo adc_data_fifo_inst( |
| 240 | + .aclr(adc_reset), |
| 241 | + .data({adc_ch_dly, measure_dataread}), |
| 242 | + .rdclk(read), |
| 243 | + .rdreq(fifo_rdreq), |
| 244 | + .wrclk(adc_clk), |
| 245 | + .wrreq(fifo_wrreq), |
| 246 | + .q({fifo_ch_q, fifo_q}), |
| 247 | + .rdempty(fifo_rdempty), |
| 248 | + .wrfull(fifo_wrfull) |
| 249 | +); |
| 250 | + |
| 251 | + |
| 252 | +endmodule |
0 commit comments