86 lines
1.8 KiB
Coq
86 lines
1.8 KiB
Coq
|
/* 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
|