autoapproach draft #1
This commit is contained in:
parent
96e9a3d043
commit
6604e35b89
|
@ -0,0 +1,85 @@
|
||||||
|
/* Autoapproach module. This module applies a waveform located in memory
|
||||||
|
* (and copied into Block RAM). This waveform is arbitrary but of fixed
|
||||||
|
* length.
|
||||||
|
*/
|
||||||
|
module autoapproach #(
|
||||||
|
parameter DAC_WID = 24
|
||||||
|
) (
|
||||||
|
input clk,
|
||||||
|
input arm,
|
||||||
|
output stopped,
|
||||||
|
output detected,
|
||||||
|
|
||||||
|
input polarity,
|
||||||
|
input [`ADC_WID-1:0] setpoint,
|
||||||
|
|
||||||
|
/* BRAM memory interface. Each pulse returns the next value in
|
||||||
|
* the sequence, and also informs the module if the sequence
|
||||||
|
* is completed. The kernel interacts primarily with this interface.
|
||||||
|
*/
|
||||||
|
input [`DAC_DATA_WID-1:0] word,
|
||||||
|
output word_next,
|
||||||
|
input word_last,
|
||||||
|
input word_ok,
|
||||||
|
output word_rst,
|
||||||
|
|
||||||
|
/* DAC wires. */
|
||||||
|
input dac_finished,
|
||||||
|
output dac_arm,
|
||||||
|
input [`DAC_WID-1:0] dac_in,
|
||||||
|
output [`DAC_WID-1:0] dac_out,
|
||||||
|
|
||||||
|
input adc_finished,
|
||||||
|
output adc_arm,
|
||||||
|
input [`ADC_WID-1:0] measurement
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
localparam WAIT_ON_ARM = 0;
|
||||||
|
localparam RECV_WORD = 1;
|
||||||
|
localparam WAIT_ON_DAC = 2;
|
||||||
|
localparam WAIT_ON_DETECTION = 3;
|
||||||
|
localparam DETECTED = 4;
|
||||||
|
reg [2:0] state = WAIT_ON_ARM;
|
||||||
|
reg save_word_last = 0;
|
||||||
|
|
||||||
|
always @ (posedge clk) case (state)
|
||||||
|
WAIT_ON_ARM: if (arm) begin
|
||||||
|
state <= RECV_WORD;
|
||||||
|
word_next <= 1;
|
||||||
|
stopped <= 0;
|
||||||
|
end else begin
|
||||||
|
stopped <= 1;
|
||||||
|
word_rst <= 1;
|
||||||
|
end
|
||||||
|
RECV_WORD: if (word_ok) begin
|
||||||
|
dac_out <= {4'b0001, word};
|
||||||
|
dac_arm <= 1;
|
||||||
|
save_word_last <= word_last;
|
||||||
|
word_next <= 0;
|
||||||
|
state <= WAIT_ON_DAC;
|
||||||
|
end
|
||||||
|
WAIT_ON_DAC: if (dac_finished) begin
|
||||||
|
dac_arm <= 0;
|
||||||
|
if (save_word_last) begin
|
||||||
|
state <= WAIT_ON_DETECTION;
|
||||||
|
adc_arm <= 0;
|
||||||
|
end else begin
|
||||||
|
state <= WAIT_ON_ARM;
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
WAIT_ON_DETECTION: if (adc_finished) begin
|
||||||
|
if (polarity && measurement >= setpt) begin
|
||||||
|
state <= DETECTED;
|
||||||
|
detected <= 1;
|
||||||
|
end else if (measurement <= setpt) begin
|
||||||
|
state <= WAIT_ON_ARM;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
DETECTED: if (!arm) begin
|
||||||
|
state <= WAIT_ON_ARM;
|
||||||
|
detected <= 0;
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
|
||||||
|
endmodule
|
Loading…
Reference in New Issue