Skip to content

Commit dcacaab

Browse files
Merge pull request #87 from the-snowwhite/DE0_Nano_SoC_Cramps
De0 nano soc cramps
2 parents 72a2968 + 7754d9c commit dcacaab

File tree

83 files changed

+8816
-3945
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+8816
-3945
lines changed

HW/QuartusProjects/.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
*.sopc_builder
5353
*example*
5454
*~
55-
*.sdc
5655
*.tar.gz
5756
*.pin
5857
*.mif
Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
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

Comments
 (0)