forked from tanchou/Verilog
Sa a l'air de fonctionner
This commit is contained in:
@@ -38,7 +38,7 @@ module top_uart_ultrason_command (
|
||||
reg start = 0;
|
||||
wire ultrasonic_busy;
|
||||
wire [15:0] distance;
|
||||
wire done;
|
||||
wire ultrason_done;
|
||||
|
||||
ultrasonic_fpga #(
|
||||
.CLK_FREQ(27_000_000)
|
||||
@@ -48,139 +48,130 @@ module top_uart_ultrason_command (
|
||||
.sig(ultrason_sig),
|
||||
.distance(distance),
|
||||
.busy(ultrasonic_busy),
|
||||
.done(done)
|
||||
.done(ultrason_done)
|
||||
);
|
||||
|
||||
// === FSM ===
|
||||
localparam IDLE = 0, READ = 1, DECODE = 2;
|
||||
localparam STOP = 3, ONE = 1, CONTINUOUS = 2;
|
||||
localparam IDLE = 0, ONESTART = 1, ONESTOP = 2, CONTINUOUSSTART = 3, CONTINUOUSSTOP = 4, WAIT = 5, NEXT_FIFO = 6;
|
||||
|
||||
reg [1:0] rx_state = IDLE;
|
||||
reg [1:0] command = 0;
|
||||
|
||||
reg [8:0] delay_counter = 0;
|
||||
reg [31:0] delay_counter = 0;
|
||||
|
||||
localparam MESURE = 1, SEND_LOW = 2, SEND_HIGH = 3, WAIT = 4;
|
||||
reg [1:0] tx_state = MESURE;
|
||||
reg [1:0] mesure = STOP;
|
||||
localparam US_STATE_WIDTH = $clog2(NEXT_FIFO)+1;
|
||||
reg [US_STATE_WIDTH-1:0] mesure_state = IDLE;
|
||||
|
||||
always @(posedge clk) begin
|
||||
|
||||
leds [4] <= data_available;
|
||||
if (data_available) begin
|
||||
command <= rd_data[1:0];
|
||||
leds <= rd_data[7:2];
|
||||
end
|
||||
end
|
||||
|
||||
case (rx_state)
|
||||
always @(posedge clk) begin // Mesure state machine
|
||||
case (mesure_state)
|
||||
IDLE: begin
|
||||
leds [5] <= 0;
|
||||
wr_en <= 0;
|
||||
rd_en <= 0;
|
||||
|
||||
if (data_available && !tx_fifo_full) begin
|
||||
rd_en <= 1'b1;
|
||||
rx_state <= READ;
|
||||
if (command == 2'd1 && data_available) begin
|
||||
mesure_state <= ONESTART;
|
||||
rd_en <= 1;
|
||||
end else if (command == 2'd2 && data_available) begin
|
||||
mesure_state <= CONTINUOUSSTART;
|
||||
rd_en <= 1;
|
||||
end else begin
|
||||
rx_state <= IDLE;
|
||||
mesure_state <= IDLE;
|
||||
rd_en <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
READ: begin
|
||||
leds [5] <= 1;
|
||||
rd_en <= 1'b1;
|
||||
rx_state <= DECODE;
|
||||
ONESTART: begin
|
||||
start <= 1;
|
||||
mesure_state <= ONESTOP;
|
||||
rd_en <= 0;
|
||||
end
|
||||
|
||||
DECODE: begin
|
||||
case (rd_data)
|
||||
8'h01: begin // Start mesure one mesure
|
||||
start <= 1;
|
||||
mesure <= ONE;
|
||||
rx_state <= IDLE;
|
||||
end
|
||||
ONESTOP: begin
|
||||
start <= 0;
|
||||
mesure_state <= IDLE;
|
||||
end
|
||||
|
||||
8'h02: begin // Start mesure continuous mesure
|
||||
start <= 1;
|
||||
mesure <= CONTINUOUS;
|
||||
rx_state <= IDLE;
|
||||
end
|
||||
CONTINUOUSSTART: begin
|
||||
if (command == 3) begin
|
||||
mesure_state <= NEXT_FIFO;
|
||||
rd_en <= 1;
|
||||
end else begin
|
||||
mesure_state <= CONTINUOUSSTOP;
|
||||
start <= 1;
|
||||
rd_en <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
8'h03: begin // Stop mesure
|
||||
start <= 0;
|
||||
mesure <= STOP;
|
||||
rx_state <= IDLE;
|
||||
end
|
||||
CONTINUOUSSTOP: begin
|
||||
start <= 0;
|
||||
mesure_state <= WAIT;
|
||||
end
|
||||
|
||||
default: begin
|
||||
mesure <= STOP;
|
||||
rx_state <= IDLE;
|
||||
end
|
||||
endcase
|
||||
WAIT: begin // Compteur 0.5s
|
||||
if (delay_counter > 1) begin
|
||||
delay_counter <= delay_counter - 1;
|
||||
end else begin
|
||||
mesure_state <= CONTINUOUSSTART;
|
||||
delay_counter <= 13500000;
|
||||
end
|
||||
end
|
||||
|
||||
NEXT_FIFO: begin
|
||||
rd_en <= 1;
|
||||
mesure_state <= IDLE;
|
||||
end
|
||||
|
||||
endcase
|
||||
end
|
||||
|
||||
// Mesure block
|
||||
always @(posedge clk) begin
|
||||
leds <= mesure[1:0];
|
||||
localparam BUSY = 1, SEND_LOW = 2, SEND_HIGH = 3, DONE = 4;
|
||||
reg [1:0] saver_state = IDLE;
|
||||
always @(posedge clk) begin // FSM Pour enregistrer la distance
|
||||
case (saver_state)
|
||||
IDLE: begin
|
||||
wr_en <= 0;
|
||||
if (ultrasonic_busy) begin
|
||||
saver_state <= BUSY;
|
||||
end else begin
|
||||
saver_state <= IDLE;
|
||||
end
|
||||
end
|
||||
|
||||
case (tx_state)
|
||||
|
||||
MESURE: begin
|
||||
case (mesure)
|
||||
STOP: begin // Stop mesure
|
||||
start <= 0;
|
||||
end
|
||||
|
||||
ONE: begin // One mesure
|
||||
start <= 1;
|
||||
if (done) begin
|
||||
tx_state <= SEND_LOW;
|
||||
wr_en <= 1;
|
||||
mesure <= STOP;
|
||||
end else begin
|
||||
tx_state <= MESURE;
|
||||
mesure <= ONE;
|
||||
end
|
||||
end
|
||||
|
||||
CONTINUOUS: begin // Continuous mesure
|
||||
start <= 1;
|
||||
if (done) begin
|
||||
tx_state <= SEND_LOW;
|
||||
wr_en <= 1;
|
||||
end else begin
|
||||
tx_state <= IDLE;
|
||||
end
|
||||
end
|
||||
|
||||
default:
|
||||
start <= 0;
|
||||
endcase
|
||||
end
|
||||
BUSY: begin
|
||||
if (ultrason_done) begin
|
||||
saver_state <= SEND_LOW;
|
||||
wr_en <= 1;
|
||||
wr_data <= distance[7:0];
|
||||
end else if(ultrasonic_busy) begin
|
||||
saver_state <= BUSY;
|
||||
end else begin
|
||||
saver_state <= IDLE;
|
||||
end
|
||||
end
|
||||
|
||||
SEND_LOW: begin
|
||||
wr_en <= 1;
|
||||
wr_data <= distance[7:0]; // Octet LSB
|
||||
tx_state <= WAIT;
|
||||
wr_data <= distance[15:8];
|
||||
saver_state <= SEND_HIGH;
|
||||
|
||||
end
|
||||
|
||||
SEND_HIGH: begin
|
||||
wr_data <= distance[15:8]; // Octet MSB
|
||||
tx_state <= WAIT;
|
||||
end
|
||||
|
||||
WAIT: begin // Code non testé
|
||||
if (delay_counter < 1000000) begin
|
||||
delay_counter <= delay_counter + 1;
|
||||
end else begin
|
||||
tx_state <= MESURE;
|
||||
delay_counter <= 0;
|
||||
end
|
||||
wr_en <= 0;
|
||||
saver_state <= DONE;
|
||||
end
|
||||
|
||||
DONE: begin
|
||||
wr_data <= 0;
|
||||
wr_en <= 0;
|
||||
saver_state <= IDLE;
|
||||
end
|
||||
|
||||
default:
|
||||
tx_state <= MESURE;
|
||||
endcase
|
||||
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
Reference in New Issue
Block a user