From 07798ecec317827ac8258633fe8a4472acd86f72 Mon Sep 17 00:00:00 2001 From: Ryan Thompson Date: Sat, 22 Jun 2024 21:19:30 -0500 Subject: [PATCH 1/4] accelerometer_test: added compile script --- demo01_accelerometer_test/compile.do | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 demo01_accelerometer_test/compile.do diff --git a/demo01_accelerometer_test/compile.do b/demo01_accelerometer_test/compile.do new file mode 100644 index 0000000..25d36e9 --- /dev/null +++ b/demo01_accelerometer_test/compile.do @@ -0,0 +1,4 @@ +vlog sequencer.v +vlog spi_master.v +vlog top.v +vlog top_tb.v From 9dc098aa70c8ee6e9fd2fb51bc88dfb8553df51c Mon Sep 17 00:00:00 2001 From: Ryan Thompson Date: Sat, 22 Jun 2024 23:26:07 -0500 Subject: [PATCH 2/4] accelerometer_test: top testbench ports fixed --- demo01_accelerometer_test/top_tb.v | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/demo01_accelerometer_test/top_tb.v b/demo01_accelerometer_test/top_tb.v index 628806c..89a37cc 100644 --- a/demo01_accelerometer_test/top_tb.v +++ b/demo01_accelerometer_test/top_tb.v @@ -28,15 +28,13 @@ spi_master #(.div_coef(32'd100)) DUT2 ( .clk_in(CLK), .nrst(NRESET), - .spi_clk(spi_clk), - .spi_sdo(spi_sdo), - .spi_sdi(spi_sdi), - .spi_cs(spi_cs), - - .data_in(data_in), - .data_out(data_out), - .n_bits(n_bits), // n_bits==0 -> 1 bit transfer - + .spi_sck(spi_clk), + .spi_mosi(spi_sdo), + .spi_miso(spi_sdi), + .spi_csn(spi_cs), + .mosi_data(data_in), + .miso_data(data_out), + .nbits(n_bits), .request(request), .ready(ready) ); From 8eaace0cd4e81b0b0e11c0367aff0d4a3c50245c Mon Sep 17 00:00:00 2001 From: Ryan Thompson Date: Mon, 24 Jun 2024 10:37:16 -0500 Subject: [PATCH 3/4] accelerometer_test: set spi master div_coef to 200 The clock is 10MHz and the default div_coef is 10k. This sets the spi clock to 500Hz (1kHz/spi clk transition). The accelerometer spi read spec is 10MHz, so we have plenty of room to speed up the reads. Setting the div_coef to 200 sets the spi clock to 25kHz. It takes 25 iterations to get the new value, so the new response time is about 1ms. --- demo01_accelerometer_test/top.v | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/demo01_accelerometer_test/top.v b/demo01_accelerometer_test/top.v index 1049a18..1c5b5a3 100644 --- a/demo01_accelerometer_test/top.v +++ b/demo01_accelerometer_test/top.v @@ -33,8 +33,9 @@ sequencer U1 ( .led_out(LED) ); - -spi_master U2 ( + +spi_master #(.div_coef(32'd200)) +U2 ( .clk_in(CLK12M), .nrst(nrst), From de547b440e4322dafa4bccc17b4d8f0a9762be99 Mon Sep 17 00:00:00 2001 From: Ryan Thompson Date: Mon, 24 Jun 2024 11:19:09 -0500 Subject: [PATCH 4/4] accelerometer_test: led assignment made after spi read the led assignment was made at the beginning of the spi read, therefore assigning the last result to the leds. the led wait state was added to the sequencer fsm to wait until the spi read is finished, and then it writes the result to the leds. --- demo01_accelerometer_test/sequencer.v | 41 ++++++++++++++++----------- demo01_accelerometer_test/top.v | 10 +++++-- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/demo01_accelerometer_test/sequencer.v b/demo01_accelerometer_test/sequencer.v index 03faff3..4344a0b 100644 --- a/demo01_accelerometer_test/sequencer.v +++ b/demo01_accelerometer_test/sequencer.v @@ -8,7 +8,8 @@ module sequencer ( output reg spi_request, input wire spi_ready, - + input wire spi_csn, + output reg [7:0] led_out ); @@ -22,9 +23,10 @@ localparam STATE_Init2 = 4'd6, STATE_Init2_Wait = 4'd7, STATE_Read = 4'd8, - STATE_Read_Wait = 4'd9, - STATE_LEDout = 4'd10; - + STATE_LEDout_Wait = 4'd9, + STATE_Read_Wait = 4'd10, + STATE_LEDout = 4'd11; + reg [3:0] state; reg signed [7:0] saved_acc; @@ -108,26 +110,33 @@ always @(posedge clk_in or negedge nrst) end // 5. Read OUT_X_H (Addr 0x29) + STATE_Read_Wait: begin + if (spi_ready) begin + state <= STATE_Read; + end + spi_request <= 1'b0; + end + STATE_Read: begin - state <= STATE_Read_Wait; - + state <= STATE_LEDout_Wait; + spi_request <= 1'b1; spi_nbits <= 6'd23; spi_mosi_data <= 31'b11101000_00000000_00000000; end - - STATE_Read_Wait: begin - if (spi_ready) begin - state <= STATE_LEDout; + + STATE_LEDout_Wait: begin + if (spi_request == 0 && spi_csn == 1) begin + state <= STATE_LEDout; saved_acc <= spi_miso_data[7:0]; - end - spi_request <= 1'b0; - end - + end + spi_request <= 1'b0; + end + // 6. Set LED output according to accelerometer value STATE_LEDout: begin - state <= STATE_Read; - + state <= STATE_Read_Wait; + led_out <= 1 << ((saved_acc + 8'Sb1000_0000) >> 5); end endcase diff --git a/demo01_accelerometer_test/top.v b/demo01_accelerometer_test/top.v index 1c5b5a3..f729b71 100644 --- a/demo01_accelerometer_test/top.v +++ b/demo01_accelerometer_test/top.v @@ -20,6 +20,9 @@ wire [5:0] spi_nbits; wire spi_request; wire spi_ready; +wire spi_csn; +assign SEN_CS = spi_csn; + sequencer U1 ( .clk_in(CLK12M), .nrst(nrst), @@ -30,7 +33,8 @@ sequencer U1 ( .spi_request(spi_request), .spi_ready(spi_ready), - + .spi_csn(spi_csn), + .led_out(LED) ); @@ -42,8 +46,8 @@ U2 ( .spi_sck(SEN_SPC), .spi_mosi(SEN_SDI), .spi_miso(SEN_SDO), - .spi_csn(SEN_CS), - + .spi_csn(spi_csn), + .mosi_data(spi_mosi_data), .miso_data(spi_miso_data), .nbits(spi_nbits),