From 94a0edd88b172e1c3a240dbce3db434618fb5293 Mon Sep 17 00:00:00 2001 From: rdiverdi Date: Sat, 4 Nov 2017 10:53:11 -0400 Subject: [PATCH 1/5] finished finite state machine and added test bench for it --- finiteStateMachine.v | 109 +++++++++++++++++++++++++++++++++++++++++++ fsmTest.t.v | 71 ++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 finiteStateMachine.v create mode 100644 fsmTest.t.v diff --git a/finiteStateMachine.v b/finiteStateMachine.v new file mode 100644 index 0000000..ff502de --- /dev/null +++ b/finiteStateMachine.v @@ -0,0 +1,109 @@ +`define WAIT 3'd0 +`define READADDRESS 3'd1 +`define WRITE 3'd3 +`define READ 3'd4 +`define READORWRITE 3'd2 + + +module fsm +( + output reg MISObuff, + output reg memWE, + output reg addrWE, + output reg srWE, + + //input posclkedge, + input negclkedge, + input cs, + input rw_select +); + reg [3:0] count; + reg [2:0] state; + + initial count = 4'd0; + initial state = `WAIT; + initial MISObuff = 0; + initial memWE = 0; + initial addrWE = 0; + initial srWE = 0; + + always @(negedge cs) begin + state <= `READADDRESS; + end + always @(posedge cs) begin + state <= `WAIT; + end + + always @(posedge negclkedge) begin + case (state) + `WAIT: begin + MISObuff <= 0; + memWE <= 0; + addrWE <= 0; + srWE <= 0; + end + + `READADDRESS: begin + if (count == 4'd6) begin + state <= `READORWRITE; + addrWE <= 1; + count <= 0; + end + else + count = count + 1; + + end + + `READORWRITE: begin + addrWE <= 0; + if (rw_select == 0) begin + state <= `WRITE; + end + else begin + srWE <= 1; + MISObuff <= 1; + state <= `READ; + end + end + + `WRITE: begin + if (count == 4'd7) begin + count <= 0; + memWE <= 1; + state <= `WAIT; + end + else + count <= count + 1; + + end + + `READ: begin + srWE <= 0; + if (count == 4'd7) begin + MISObuff <= 0; + count <= 0; + state <= `WAIT; + end + else + count <= count + 1; + end + + default: begin end + endcase + end +/* + always @(posedge negclkedge) begin + case (state) + `READORWRITE: begin + if (wr_enable == 1) begin + state <= `READ; + q3 <= 1; + buffer <=1; + end + end + default: begin end + endcase + end +*/ + +endmodule diff --git a/fsmTest.t.v b/fsmTest.t.v new file mode 100644 index 0000000..38d25a8 --- /dev/null +++ b/fsmTest.t.v @@ -0,0 +1,71 @@ +// 32-bit alu testbench + +//`timescale 1 ns / 1 ps +`include "finiteStateMachine.v" + +module testFSM(); + + reg clk; + reg chipSelect; + reg rw_select; + + wire MISObuff, memWE, addrWE, srWE; + + fsm test(MISObuff, memWE, addrWE, srWE, clk, chipSelect, rw_select); + + // generate clock + initial clk = 0; + always #10 clk = !clk; //50 MHz clock + + initial + #1000 $finish; + + initial begin + $dumpfile("fsm.vcd"); + $dumpvars(); + + $display(" chip select | read/write | MISObuff | memWE | addrWE | srWE | state"); + $display(); + $display("Chip Not Selected -------------------------------------------------------------------------------------"); + chipSelect=1; rw_select=0; + #30; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Not Selected -------------------------------------------------------------------------------------"); + chipSelect=1; rw_select=1; + #20; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Selected: 1 clk cycle read -------------------------------------------------------------------------------------"); + chipSelect=0; rw_select=1; + #30; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Selected: 7 clk cycles read -------------------------------------------------------------------------------------"); + #120; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Selected: 9 clk cycles read -------------------------------------------------------------------------------------"); + #40; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Not Selected -------------------------------------------------------------------------------------"); + #130; + chipSelect=1; rw_select=0; + #20; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Selected: 1 clk cycle write -------------------------------------------------------------------------------------"); + chipSelect=0; rw_select=0; + #30; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Selected: 7 clk cycles write -------------------------------------------------------------------------------------"); + #120; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Selected: 9 clk cycles write -------------------------------------------------------------------------------------"); + #40; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Selected: 16 clk cycles write -------------------------------------------------------------------------------------"); + #140; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + $display("Chip Selected: 20 clk cycles write -------------------------------------------------------------------------------------"); + #220; + $display("| %b | %b | %b | %b | %b | %b | %b", chipSelect, rw_select, MISObuff, memWE, addrWE, srWE, test.state); + end + +endmodule + From 7b56e182229ad1d09eb25bbcb196d1a7245f0a36 Mon Sep 17 00:00:00 2001 From: rdiverdi Date: Sat, 4 Nov 2017 15:48:27 -0400 Subject: [PATCH 2/5] added shirtregister and input conditioner from Lisa's repository, and started a testbench for the full SPI memory --- inputconditioner.v | 38 ++++++++---- shiftregister.v | 33 +++++++++-- spimemory.t.v | 144 +++++++++++++++++++++++++++++++++++++++++++++ spimemory.v | 2 +- 4 files changed, 200 insertions(+), 17 deletions(-) create mode 100644 spimemory.t.v diff --git a/inputconditioner.v b/inputconditioner.v index 736a866..1b65a94 100644 --- a/inputconditioner.v +++ b/inputconditioner.v @@ -1,9 +1,11 @@ +// TAKEN FROM LISA'S 2016 REPOSITORY //------------------------------------------------------------------------ // Input Conditioner // 1) Synchronizes input to clock domain // 2) Debounces input // 3) Creates pulses at edge transitions //------------------------------------------------------------------------ +`timescale 1 ns / 1 ps module inputconditioner ( @@ -16,23 +18,35 @@ output reg negativeedge // 1 clk pulse at falling edge of conditioned parameter counterwidth = 3; // Counter size, in bits, >= log2(waittime) parameter waittime = 3; // Debounce delay, in clock cycles - - reg[counterwidth-1:0] counter = 0; + + reg[counterwidth-1:0] counter = 0; //not sure what this syntax is reg synchronizer0 = 0; reg synchronizer1 = 0; - + always @(posedge clk ) begin - if(conditioned == synchronizer1) + if(conditioned == synchronizer1) begin //if conditioned is same as we thought counter <= 0; - else begin - if( counter == waittime) begin - counter <= 0; - conditioned <= synchronizer1; + positiveedge <= 0; //not sure if this should be nonblockingit + negativeedge <= 0; + end + else begin //if conditioned has changed + if( counter == waittime) begin //when debouncing is done + counter <= 0; //reset counter + conditioned <= synchronizer1; //save conditioned in synchronizer1 + positiveedge <= synchronizer1; //set negativeedge opposite + negativeedge <= !synchronizer1; //set positiveedge opposite end - else - counter <= counter+1; + else begin + counter <= counter+1; //wait for debouncing + end + end + if (counter == 0) begin + synchronizer0 <= noisysignal; + synchronizer1 <= synchronizer0; end - synchronizer0 <= noisysignal; - synchronizer1 <= synchronizer0; end + + //max glitch is 6 clock cycles + + endmodule diff --git a/shiftregister.v b/shiftregister.v index b4ec057..d139ff1 100644 --- a/shiftregister.v +++ b/shiftregister.v @@ -1,3 +1,4 @@ +// USING SHIFT REGISTER FROM LISA'S 2016 REPOSITORY //------------------------------------------------------------------------ // Shift Register // Parameterized width (in bits) @@ -5,6 +6,8 @@ // - serial in, parallel out // - parallel in, serial out //------------------------------------------------------------------------ +`timescale 1 ns / 1 ps +`include "inputconditioner.v" module shiftregister #(parameter width = 8) @@ -14,12 +17,34 @@ input peripheralClkEdge, // Edge indicator input parallelLoad, // 1 = Load shift reg with parallelDataIn input [width-1:0] parallelDataIn, // Load shift reg in parallel input serialDataIn, // Load shift reg serially -output [width-1:0] parallelDataOut, // Shift reg data contents -output serialDataOut // Positive edge synchronized +output reg [width-1:0] parallelDataOut, // Shift reg data contents +output reg serialDataOut // Positive edge synchronized ); - reg [width-1:0] shiftregistermem; + reg [width-1:0] shiftregistermem; + //wire conditioned; + //wire positiveedge; + //wire negativeedge; + //inputconditioner inputc(clk, peripheralClkEdge, conditioned, positiveedge, negativeedge); + always @(posedge clk) begin - // Your Code Here + // Parallel load will happen if parallel load is high. + // this takes priority over the serial shift + if (parallelLoad) begin // Parallel + shiftregistermem <= parallelDataIn; + end + //the shift register advances one position: serialDataIn is loaded into the LSB (Least Significant Bit), and the rest of the bits shift up by one + else begin + if (peripheralClkEdge) begin + shiftregistermem <= {{shiftregistermem[width-2:0]}, {serialDataIn}}; + end + end + + + //serialDataOut always presents the Most Significant Bit of the shift register. + serialDataOut <= shiftregistermem[width-1]; + //parallelDataOut always presents the entirety of the contents of the shift register. + parallelDataOut <= shiftregistermem; + end endmodule diff --git a/spimemory.t.v b/spimemory.t.v new file mode 100644 index 0000000..fc79cbe --- /dev/null +++ b/spimemory.t.v @@ -0,0 +1,144 @@ +// Test Bench for full SPI memory + +`include "spimemory.v" + +module testSPImem(); + + // inputs and outputs for function + reg clk; + reg spi_clk; + reg chip_select = 1; + wire miso = 0; + reg mosi = 0; + wire[3:0] leds; + + // registers for testing + reg[6:0] address; + reg rw_select; + reg[7:0] write_data; + reg[7:0] read_data; + wire[7:0] cmd = {address, rw_select}; + reg[3:0] i; + + spiMemory test(clk, spi_clk, chip_select, miso, mosi, leds); + + // generate clock + initial clk = 0; + always #5 clk = !clk; //100 MHz clock + + initial spi_clk = 0; + always #20 spi_clk = !spi_clk; //25 MHz clock + + initial + #10000 $finish; + + initial begin + $dumpfile("spimemory.vcd"); + $dumpvars(); + $display("testing SPI memory"); + $display("TEST 1: write to address 5 and read back"); + // initialize values to write + address = 7'd5; // set address to 5 + write_data = 8'd155; // set write data to 155 + rw_select = 0; // write first + #100; // wait at the beginning for fun + // start with a normal write opperation + chip_select = 0; // select chip + for (i=0; i<7; i=i+1) begin + @(posedge spi_clk); + mosi = address[i]; + end + @(posedge spi_clk); + mosi = rw_select; + for (i=0; i<8; i=i+1) begin + @(posedge spi_clk); + mosi = write_data[i]; + end + + // toggle chip select + chip_select = 1; + #40; + chip_select = 0; + + // read back data + address = 7'd5; // set address to 5 + rw_select = 1; // read + // start with a normal write opperation + for (i=0; i<7; i=i+1) begin + @(posedge spi_clk); + mosi = address[i]; + end + @(posedge spi_clk); + mosi = rw_select; + for (i=0; i<8; i=i+1) begin + @(posedge spi_clk); + read_data[i]=miso; + end + $display("data returned is: %b", read_data); + + $display("TEST 2: write to a second address and read values from both"); + // toggle chip select + chip_select = 1; + #40; + chip_select = 0; + + // initialize values to write + address = 7'd120; // set address to 120 + write_data = 8'd3; // set write data to 3 + rw_select = 0; // write first + // start with a normal write opperation + for (i=0; i<7; i=i+1) begin + @(posedge spi_clk); + mosi = address[i]; + end + @(posedge spi_clk); + mosi = rw_select; + for (i=0; i<8; i=i+1) begin + @(posedge spi_clk); + mosi = write_data[i]; + end + + // toggle chip select + chip_select = 1; + #40; + chip_select = 0; + + // read back data + address = 7'd5; // set address to 5 + rw_select = 1; // read + // start with a normal write opperation + for (i=0; i<7; i=i+1) begin + @(posedge spi_clk); + mosi = address[i]; + end + @(posedge spi_clk); + mosi = rw_select; + for (i=0; i<8; i=i+1) begin + @(posedge spi_clk); + read_data[i]=miso; + end + $display("data returned from first address: %b", read_data); + + // toggle chip select + chip_select = 1; + #40; + chip_select = 0; + + // read back data + address = 7'd120; // set address to 120 + rw_select = 1; // read + // start with a normal write opperation + for (i=0; i<7; i=i+1) begin + @(posedge spi_clk); + mosi = address[i]; + end + @(posedge spi_clk); + mosi = rw_select; + for (i=0; i<8; i=i+1) begin + @(posedge spi_clk); + read_data[i]=miso; + end + $display("data returned from second address: %b", read_data); + end + +endmodule diff --git a/spimemory.v b/spimemory.v index c6ed4f7..2d75810 100644 --- a/spimemory.v +++ b/spimemory.v @@ -10,7 +10,7 @@ module spiMemory output miso_pin, // SPI master in slave out input mosi_pin, // SPI master out slave in output [3:0] leds // LEDs for debugging -) +); endmodule From 3120dadf024139a7f934c750672a5c6f453d57a6 Mon Sep 17 00:00:00 2001 From: rdiverdi Date: Sun, 5 Nov 2017 14:40:08 -0500 Subject: [PATCH 3/5] initial working SPI memory --- finiteStateMachine.v | 26 ++++++++---- inputconditioner.v | 4 ++ shiftregister.v | 16 ++++--- spimemory.t.v | 81 ++++++++++++++++++------------------ spimemory.v | 99 ++++++++++++++++++++++++++++++++++++-------- 5 files changed, 154 insertions(+), 72 deletions(-) diff --git a/finiteStateMachine.v b/finiteStateMachine.v index ff502de..f3f593a 100644 --- a/finiteStateMachine.v +++ b/finiteStateMachine.v @@ -13,8 +13,9 @@ module fsm output reg srWE, //input posclkedge, - input negclkedge, - input cs, + input spi_clk, + input spi_falling, + input cs_falling, input rw_select ); reg [3:0] count; @@ -27,14 +28,14 @@ module fsm initial addrWE = 0; initial srWE = 0; - always @(negedge cs) begin + always @(posedge cs_falling) begin state <= `READADDRESS; end - always @(posedge cs) begin - state <= `WAIT; - end + //always @(posedge cs) begin +// state <= `WAIT; + // end - always @(posedge negclkedge) begin + always @(posedge spi_clk) begin case (state) `WAIT: begin MISObuff <= 0; @@ -48,6 +49,9 @@ module fsm state <= `READORWRITE; addrWE <= 1; count <= 0; + @(posedge spi_falling) begin + addrWE <= 0; + end end else count = count + 1; @@ -55,7 +59,6 @@ module fsm end `READORWRITE: begin - addrWE <= 0; if (rw_select == 0) begin state <= `WRITE; end @@ -63,6 +66,9 @@ module fsm srWE <= 1; MISObuff <= 1; state <= `READ; + @(posedge spi_falling) begin + srWE <= 0; + end end end @@ -71,6 +77,9 @@ module fsm count <= 0; memWE <= 1; state <= `WAIT; + @(posedge spi_falling) begin + memWE <= 0; + end end else count <= count + 1; @@ -80,7 +89,6 @@ module fsm `READ: begin srWE <= 0; if (count == 4'd7) begin - MISObuff <= 0; count <= 0; state <= `WAIT; end diff --git a/inputconditioner.v b/inputconditioner.v index 1b65a94..ea6ec2e 100644 --- a/inputconditioner.v +++ b/inputconditioner.v @@ -16,6 +16,10 @@ output reg positiveedge, // 1 clk pulse at rising edge of conditioned output reg negativeedge // 1 clk pulse at falling edge of conditioned ); + initial positiveedge = 0; + initial negativeedge = 0; + initial conditioned = 0; + parameter counterwidth = 3; // Counter size, in bits, >= log2(waittime) parameter waittime = 3; // Debounce delay, in clock cycles diff --git a/shiftregister.v b/shiftregister.v index d139ff1..164ee47 100644 --- a/shiftregister.v +++ b/shiftregister.v @@ -7,7 +7,7 @@ // - parallel in, serial out //------------------------------------------------------------------------ `timescale 1 ns / 1 ps -`include "inputconditioner.v" +//`include "inputconditioner.v" module shiftregister #(parameter width = 8) @@ -27,18 +27,22 @@ output reg serialDataOut // Positive edge synchronized //wire negativeedge; //inputconditioner inputc(clk, peripheralClkEdge, conditioned, positiveedge, negativeedge); + always @(posedge parallelLoad) begin + shiftregistermem <= parallelDataIn; + end + always @(posedge clk) begin // Parallel load will happen if parallel load is high. // this takes priority over the serial shift - if (parallelLoad) begin // Parallel - shiftregistermem <= parallelDataIn; - end + // if (parallelLoad) begin // Parallel + // shiftregistermem <= parallelDataIn; + //end //the shift register advances one position: serialDataIn is loaded into the LSB (Least Significant Bit), and the rest of the bits shift up by one - else begin + //else begin if (peripheralClkEdge) begin shiftregistermem <= {{shiftregistermem[width-2:0]}, {serialDataIn}}; end - end + //end //serialDataOut always presents the Most Significant Bit of the shift register. diff --git a/spimemory.t.v b/spimemory.t.v index fc79cbe..18ec51f 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -8,7 +8,7 @@ module testSPImem(); reg clk; reg spi_clk; reg chip_select = 1; - wire miso = 0; + wire miso; reg mosi = 0; wire[3:0] leds; @@ -18,19 +18,19 @@ module testSPImem(); reg[7:0] write_data; reg[7:0] read_data; wire[7:0] cmd = {address, rw_select}; - reg[3:0] i; + reg[3:0] i = 0; spiMemory test(clk, spi_clk, chip_select, miso, mosi, leds); // generate clock initial clk = 0; - always #5 clk = !clk; //100 MHz clock + always #1 clk = !clk; //100 MHz clock initial spi_clk = 0; - always #20 spi_clk = !spi_clk; //25 MHz clock + always #100 spi_clk = !spi_clk; //25 MHz clock initial - #10000 $finish; + #20000 $finish; initial begin $dumpfile("spimemory.vcd"); @@ -41,104 +41,105 @@ module testSPImem(); address = 7'd5; // set address to 5 write_data = 8'd155; // set write data to 155 rw_select = 0; // write first - #100; // wait at the beginning for fun + #500; // wait at the beginning for fun + @(negedge spi_clk); //wait for negative clock edge // start with a normal write opperation chip_select = 0; // select chip for (i=0; i<7; i=i+1) begin - @(posedge spi_clk); - mosi = address[i]; + mosi = address[6-i]; + @(negedge spi_clk); end - @(posedge spi_clk); mosi = rw_select; for (i=0; i<8; i=i+1) begin - @(posedge spi_clk); - mosi = write_data[i]; + @(negedge spi_clk); + mosi = write_data[7-i]; end - + // toggle chip select + @(negedge spi_clk); chip_select = 1; - #40; + @(negedge spi_clk); chip_select = 0; // read back data address = 7'd5; // set address to 5 rw_select = 1; // read - // start with a normal write opperation for (i=0; i<7; i=i+1) begin - @(posedge spi_clk); - mosi = address[i]; + mosi = address[6-i]; + @(negedge spi_clk); end - @(posedge spi_clk); mosi = rw_select; + @(negedge spi_clk); for (i=0; i<8; i=i+1) begin @(posedge spi_clk); - read_data[i]=miso; + read_data[7-i]=miso; end - $display("data returned is: %b", read_data); + $display("data returned is: %d", read_data); $display("TEST 2: write to a second address and read values from both"); + // toggle chip select + @(negedge spi_clk); chip_select = 1; - #40; + @(negedge spi_clk); chip_select = 0; // initialize values to write address = 7'd120; // set address to 120 write_data = 8'd3; // set write data to 3 - rw_select = 0; // write first + rw_select = 0; // write // start with a normal write opperation for (i=0; i<7; i=i+1) begin - @(posedge spi_clk); - mosi = address[i]; + mosi = address[6-i]; + @(negedge spi_clk); end - @(posedge spi_clk); mosi = rw_select; for (i=0; i<8; i=i+1) begin - @(posedge spi_clk); - mosi = write_data[i]; + @(negedge spi_clk); + mosi = write_data[7-i]; end // toggle chip select + @(negedge spi_clk); chip_select = 1; - #40; + @(negedge spi_clk); chip_select = 0; // read back data address = 7'd5; // set address to 5 rw_select = 1; // read - // start with a normal write opperation for (i=0; i<7; i=i+1) begin - @(posedge spi_clk); - mosi = address[i]; + mosi = address[6-i]; + @(negedge spi_clk); end - @(posedge spi_clk); mosi = rw_select; + @(negedge spi_clk); for (i=0; i<8; i=i+1) begin @(posedge spi_clk); - read_data[i]=miso; + read_data[7-i]=miso; end - $display("data returned from first address: %b", read_data); + $display("data returned from first address: %d", read_data); // toggle chip select + @(negedge spi_clk); chip_select = 1; - #40; + @(negedge spi_clk); chip_select = 0; // read back data address = 7'd120; // set address to 120 rw_select = 1; // read - // start with a normal write opperation for (i=0; i<7; i=i+1) begin - @(posedge spi_clk); - mosi = address[i]; + mosi = address[6-i]; + @(negedge spi_clk); end - @(posedge spi_clk); mosi = rw_select; + @(negedge spi_clk); for (i=0; i<8; i=i+1) begin @(posedge spi_clk); - read_data[i]=miso; + read_data[7-i]=miso; end - $display("data returned from second address: %b", read_data); + $display("data returned from second address: %d", read_data); end endmodule diff --git a/spimemory.v b/spimemory.v index 2d75810..971db1a 100644 --- a/spimemory.v +++ b/spimemory.v @@ -1,17 +1,82 @@ -//------------------------------------------------------------------------ -// SPI Memory -//------------------------------------------------------------------------ - -module spiMemory -( - input clk, // FPGA clock - input sclk_pin, // SPI clock - input cs_pin, // SPI chip select - output miso_pin, // SPI master in slave out - input mosi_pin, // SPI master out slave in - output [3:0] leds // LEDs for debugging -); - - -endmodule - +`include "inputconditioner.v" +`include "finiteStateMachine.v" +`include "datamemory.v" +`include "shiftregister.v" +`include "testAnd.v" + +module bufferSwitch +( + input buff_in, + input buff_enable, + output buff_out +); + wire buff_out; + and bufenable(buff_out, buff_enable, buff_in); +endmodule + +module dff +( + input d, + //input ce, + input clk, + output reg q +); + always @(posedge clk) begin + //if (ce == 1) begin + q <= d; + //end + end +endmodule + +module dff7Bit +( + input [6:0] d, + //input ce, + input clk, + output reg [6:0] q +); + always @(posedge clk) begin + //if (ce == 1) begin + q <= d; + //end + end +endmodule + + +//------------------------------------------------------------------------ +// SPI Memory +//------------------------------------------------------------------------ +module spiMemory +( + input clk, // FPGA clock + input sclk_pin, // SPI clock + input cs_pin, // SPI chip select + output miso_pin, // SPI master in slave out + input mosi_pin, // SPI master out slave in + output [3:0] leds // LEDs for debugging +); + + wire mosi_rising, mosi_falling, mosi_conditioned; + wire sclk_rising, sclk_falling, sclk_conditioned; + wire cs_rising, cs_falling, cs_conditioned; + wire [7:0] parallelMemToSR, parallelSRtoMem; + wire serialOut, parallelLoad; + wire [6:0] address; + wire MISObuff, memWE, addrWE, srWE; + wire miso_pin_pre_buffer; + + //and buffswitch0(miso_pin, miso_pin_pre_buffer, MISObuff); + + inputconditioner mosiIC(clk, mosi_pin, mosi_conditioned, mosi_rising, mosi_falling); + inputconditioner csIC(clk, cs_pin, cs_conditioned, cs_rising, cs_falling); + inputconditioner sclkIC(clk, sclk_pin, sclk_conditioned, sclk_rising, sclk_falling); + + shiftregister shifreg(clk, sclk_falling, srWE, parallelMemToSR, mosi_conditioned, parallelSRtoMem, serialOut); + + datamemory memory1(clk, parallelMemToSR, address, memWE, parallelSRtoMem); + + dff dff1(serialOut, sclk_falling, miso_pin); + dff7Bit dff2(parallelSRtoMem[6:0], addrWE, address); + + fsm fsm1( MISObuff, memWE, addrWE, srWE, sclk_rising, sclk_falling, cs_falling, mosi_conditioned); +endmodule From 4f9fa2b7fd0b5aa4e16626e361a4139644778179 Mon Sep 17 00:00:00 2001 From: rdiverdi Date: Sun, 5 Nov 2017 16:04:58 -0500 Subject: [PATCH 4/5] adding working code with writeup --- fsmTest.png | Bin 0 -> 51216 bytes fsmTest.t.v | 15 +++++--- shiftregister.v | 13 +++---- spimemory.t.v | 85 +++++++++++++++++++++++++++++++++++++++++----- spimemory.v | 9 +++-- writeRead2.png | Bin 0 -> 43080 bytes writeReadBack.png | Bin 0 -> 41747 bytes writeup.md | 27 +++++++++++++++ 8 files changed, 124 insertions(+), 25 deletions(-) create mode 100644 fsmTest.png create mode 100644 writeRead2.png create mode 100644 writeReadBack.png create mode 100644 writeup.md diff --git a/fsmTest.png b/fsmTest.png new file mode 100644 index 0000000000000000000000000000000000000000..905e43ac0e04adf84d2a8ec567770b582f03313c GIT binary patch literal 51216 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 PzJDVsD^e+^pA24d20 literal 0 HcmV?d00001 diff --git a/fsmTest.t.v b/fsmTest.t.v index 38d25a8..19f1800 100644 --- a/fsmTest.t.v +++ b/fsmTest.t.v @@ -5,20 +5,27 @@ module testFSM(); - reg clk; + reg clk, clk_fall; reg chipSelect; reg rw_select; wire MISObuff, memWE, addrWE, srWE; - fsm test(MISObuff, memWE, addrWE, srWE, clk, chipSelect, rw_select); + wire csFalling; + not(csFalling, chipSelect); + initial chipSelect = 1; + fsm test(MISObuff, memWE, addrWE, srWE, clk, clk_fall, csFalling, rw_select); // generate clock initial clk = 0; - always #10 clk = !clk; //50 MHz clock + always begin + #10; + clk = !clk; //50 MHz clock + clk_fall = !clk; + end initial - #1000 $finish; + #10000 $finish; initial begin $dumpfile("fsm.vcd"); diff --git a/shiftregister.v b/shiftregister.v index 164ee47..760d641 100644 --- a/shiftregister.v +++ b/shiftregister.v @@ -27,22 +27,19 @@ output reg serialDataOut // Positive edge synchronized //wire negativeedge; //inputconditioner inputc(clk, peripheralClkEdge, conditioned, positiveedge, negativeedge); - always @(posedge parallelLoad) begin - shiftregistermem <= parallelDataIn; - end always @(posedge clk) begin // Parallel load will happen if parallel load is high. // this takes priority over the serial shift - // if (parallelLoad) begin // Parallel - // shiftregistermem <= parallelDataIn; - //end + if (parallelLoad) begin // Parallel + shiftregistermem <= parallelDataIn; + end //the shift register advances one position: serialDataIn is loaded into the LSB (Least Significant Bit), and the rest of the bits shift up by one - //else begin + else begin if (peripheralClkEdge) begin shiftregistermem <= {{shiftregistermem[width-2:0]}, {serialDataIn}}; end - //end + end //serialDataOut always presents the Most Significant Bit of the shift register. diff --git a/spimemory.t.v b/spimemory.t.v index 18ec51f..bfdca67 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -19,6 +19,7 @@ module testSPImem(); reg[7:0] read_data; wire[7:0] cmd = {address, rw_select}; reg[3:0] i = 0; + reg success = 1; spiMemory test(clk, spi_clk, chip_select, miso, mosi, leds); @@ -30,13 +31,14 @@ module testSPImem(); always #100 spi_clk = !spi_clk; //25 MHz clock initial - #20000 $finish; + #200000 $finish; initial begin $dumpfile("spimemory.vcd"); $dumpvars(); $display("testing SPI memory"); - $display("TEST 1: write to address 5 and read back"); + +// TEST 1: write data and read it back // initialize values to write address = 7'd5; // set address to 5 write_data = 8'd155; // set write data to 155 @@ -74,16 +76,18 @@ module testSPImem(); @(posedge spi_clk); read_data[7-i]=miso; end - $display("data returned is: %d", read_data); - - $display("TEST 2: write to a second address and read values from both"); + if (read_data != 8'd155) begin + $display("Test1: write data and read it back FAILED:"); + $display("data returned is: %d", read_data); + success = 0; + end // toggle chip select @(negedge spi_clk); chip_select = 1; @(negedge spi_clk); chip_select = 0; - +// TEST 2: write to second address, read back from both // initialize values to write address = 7'd120; // set address to 120 write_data = 8'd3; // set write data to 3 @@ -118,7 +122,13 @@ module testSPImem(); @(posedge spi_clk); read_data[7-i]=miso; end - $display("data returned from first address: %d", read_data); + + if (read_data != 8'd155) begin + $display("Test2: write to second address, read back both FAILED:"); + $display("data returned is: %d", read_data); + $display("original data has changed"); + success = 0; + end // toggle chip select @(negedge spi_clk); @@ -139,7 +149,66 @@ module testSPImem(); @(posedge spi_clk); read_data[7-i]=miso; end - $display("data returned from second address: %d", read_data); + + if (read_data != 8'd3) begin + $display("Test2: write to second address, read back both FAILED:"); + $display("data returned is: %d", read_data); + $display("new address write/read back failed"); + success = 0; + end + + // toggle chip select + @(negedge spi_clk); + chip_select = 1; + @(negedge spi_clk); + chip_select = 1; + +// TEST 3: write new value to original address with cs disabled + // initialize values to write + address = 7'd5; // set address to 5 + write_data = 8'd12; // set write data to 12 + rw_select = 0; // write + // start with a normal write opperation + for (i=0; i<7; i=i+1) begin + mosi = address[6-i]; + @(negedge spi_clk); + end + mosi = rw_select; + for (i=0; i<8; i=i+1) begin + @(negedge spi_clk); + mosi = write_data[7-i]; + end + + // toggle chip select + @(negedge spi_clk); + chip_select = 1; + @(negedge spi_clk); + chip_select = 0; + + // read back data + address = 7'd5; // set address to 5 + rw_select = 1; // read + for (i=0; i<7; i=i+1) begin + mosi = address[6-i]; + @(negedge spi_clk); + end + mosi = rw_select; + @(negedge spi_clk); + for (i=0; i<8; i=i+1) begin + @(posedge spi_clk); + read_data[7-i]=miso; + end + + if (read_data != 8'd155) begin + $display("Test3: write to original addrss with chip disabled FAILED"); + $display("data returned is: %d", read_data); + $display("original data has changed"); + success = 0; + end + + if (success==1) begin + $display("All Tests Passed!"); + end end endmodule diff --git a/spimemory.v b/spimemory.v index 971db1a..2293756 100644 --- a/spimemory.v +++ b/spimemory.v @@ -6,11 +6,10 @@ module bufferSwitch ( + output buff_out, input buff_in, - input buff_enable, - output buff_out + input buff_enable ); - wire buff_out; and bufenable(buff_out, buff_enable, buff_in); endmodule @@ -65,7 +64,7 @@ module spiMemory wire MISObuff, memWE, addrWE, srWE; wire miso_pin_pre_buffer; - //and buffswitch0(miso_pin, miso_pin_pre_buffer, MISObuff); + bufferSwitch buffswitch0(miso_pin, miso_pin_pre_buffer, MISObuff); inputconditioner mosiIC(clk, mosi_pin, mosi_conditioned, mosi_rising, mosi_falling); inputconditioner csIC(clk, cs_pin, cs_conditioned, cs_rising, cs_falling); @@ -75,7 +74,7 @@ module spiMemory datamemory memory1(clk, parallelMemToSR, address, memWE, parallelSRtoMem); - dff dff1(serialOut, sclk_falling, miso_pin); + dff dff1(serialOut, sclk_falling, miso_pin_pre_buffer); dff7Bit dff2(parallelSRtoMem[6:0], addrWE, address); fsm fsm1( MISObuff, memWE, addrWE, srWE, sclk_rising, sclk_falling, cs_falling, mosi_conditioned); diff --git a/writeRead2.png b/writeRead2.png new file mode 100644 index 0000000000000000000000000000000000000000..8649f0b53848c46c9e6ec6e799c5d594e35b3af1 GIT binary patch literal 43080 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%0D%1SMt3}?2}3@8N#)R`LlfH*TaN=v zQ-)qqdP?oZK!Ek0>l1AAYhpCZtwz6yYdYfnUX?LQY5napm^y=$) z^J!zcSS@UBss(fcfSvX3x2x5vFj&8iyfA+4NpWjOrm~cG004-klcm5M(@y}bIpA%F z>W~veJN!4fp$4SuKPiIsC2-~l?n+6phmZo0G&Kf(0aA}tF`0)I5P5ds0_;K`MAA3v4Mfl>hRHj^ONx;DjT)c-5@N4=)=HgQ z-<&PYGh}7YOO_f#v^qA{YRAL4@)d=582-xD_QC>_TusZQQ|V`c9Y4*Y=w6lM_=A^m z#tQ%B#%?J@>BnPaz2e*RghJn2)0yiBg`Sl6T~Q$;`m|;L`AqWSXe`86(X{## zu4+lu0QGdPZv|8C*94#L&jXi+k2#9%elJEi;5O+Z!tN9Evf#czd@BJkKiwW&ERTha5SLfL7fNC{L)qcXdp}>2?fbkBB$GtDop8t#d02m3jx?Z>seg0|Eu^70_OrfQ9J_kM z7&(wn;PF({6>>v!ivdLGSx#oH5Kzssf_y3*qr z<=N}z(@KlH3!(z1n0r_APHjO>I{_lJ=j)=Oz1_CrO=Vp~l!UHq{hXV*YxCyh-w){= zKJ>W%U;*|UROOSdR?e(WtkfS$j3I-lEoY)7yRt*A^at`|@vJ3Q@EBv$WT-ep zGAD%tzD^7tlZVJICy-ns+O01z6nfDC1IjscSm4(ufdg7ur(8$;DGiU)6H3sQL#98_ z1$H4S%Oml@%VBfLMBt83$7ms9+X23Rh7TmNi-At{Wp_9cb*4gWysIpfbGIaKOPBkw zl-Xh2_geIA3f)S(%VF1i>ALX4()}eJIS23dZk8|KK#KOK?~}|VKPjw>`Em_S*p?5ZMKBY%>>4)6e>gdu+9-P<9$wS|pudx;@`3z7Il8$tArz3WFvbAv>k&)_i(++n7q*X{kUCVW>>0 zQ@f_yYDw&>^pnnFZUB)ef&1C^9gouUsjR}MkA7fwzJ(|k$X59}lrpUj!+6&Trhw5T zlM=h%;!?uPw+GZQnC;E`(_-{y{L6D+)0s-L@0NXi&OdP$_-4d}tL$Jzs)m!d1LC;LgssAi;PhbOX10Rn%18{^&{s7xF17%j6#@A&(kp^`iPU=5po zy5G;N#HMlF6E3*8y-{G=aGn1>=q&xk_o>BHw3Wnj`#E#&9QF(z+}HhbEwgb5980#``&MXunBI7sC6scCaTJ1>-Ft67NHfW+Pkm$G_y!k=T(gP#NPw#!(8y9cJ-{Y0=*?`rC*hk*pRtx(`Fq@ha-a64L_oCEJeZ+E{5J94fztwL?fh3c)We2a(1%6 z)i$soePnn^)6h2zHpZlQac+Hu}icM1*_4C6sAn zrD2JLN0_jHz9(N!B#5>9>OS_(|3t0mD{@^^qkDdhVO-->Tx)SY+cV>{55d(Qxvx@> zpJk`y0w|1t__0x0m}-K_CEai*wO?s|81FDLI}4%}e0pxY=viu7RB9a6&nmQjk`bN#V)r(7g$S_u zS}%A)A9*=zl8R>_P@>FT;5^h9fZkeC?!r^aQrKOwVeArnj^|cV$v!1{OaXgN^C|)c zIlFBvjtBDi(zC$VLz0zB0yHOosb@2!H+o%^(USlM*-tlhSC7`nfe9A}tUfDK$pUX4 zKL!>Voo5<6_S+h-Ba&@2E)NJH{f2p6>{YU(?PpaT!5FjGFSq2nEtmqSi5IWFpj}XcvvU zk5INjHNo9_dk6000DuIzdm2p_B@Morz#w@B--jrHzVWlkKzFj<;|UpKEo;Vy7FA@@;A>+#~hJ&UFm)>oK4fu zM9>y%+~Qg@WOj5&&N9u6O_Z7iF8c6!FTCY2B|<Sq+UJp9_WYz8*dnU%sR}B{33Cg? zF;WS{3C?gTxtRXh6Svp%Qeu5HuC8-RbO~QB^nBFq7QTsCeA3n|*z&eeES4#y9;L!W zjE$|F5b%;GAq|z~dqM>Os33a+`ei4cy+kyYnKXe>X~R8QPx-zV4K!p@*q`;@Zk=mP z3Qb0R`0MH$M|H%Z!p_4Zd$_wQN7aJ#MvM*FzhCp4RqTHxf{UhYm-q!6nNn*A<=11- z;nWV58;yH=InZPB9&#sqi`!}aT&a_4cd_3{OVGg;RGm8(c&5&??dUvF&G032DDgg& zsS(FziZ2(h_FnATp#AP_XODo3j5p1>>kq!WeCqSW zG9AxCIg2#Z+znOTYs4!r*~(yTxy0Lu8<}t?<#TJfRC?}d9oxh@KFVZil>rM{umdX6 zA&d;7TWa%aLbiHmU#dMEv1MSr`fC%G1H!nMbq%7Ch!FI&@AjZ{0AO zNN4%7)kyOQpmWn6P6b`i+H1=mn`tAGD2znt22QoIs6T5gO+kcA%sg9ya`mR^xcfI& z0-6Y!BwCSrooh;9V%l^Q5SO`J=m=bfU{TXb+G{-KAd6IF`rLZlECQ!w+8Pln;S zt5RJ6E|=;XJIC(?ccf>xzRrjoQArF=>#gHWmS6)a@?0u3l1~iwo%h%uu#*h1q^NU5 z(fVj#8;aEk#76eM=rtkk)Z^j&{g~ZY+DrhHa^&)E3p4+bzcdkhGld4_DC{ zn81U|uD#NH2at8VJa<>7YIK)#+Ud-qDzcnk;!5|BOOQzSq!DT>biPcH#U6pZ*5Hs4 zB?VmSwC8Qh4Y#!P*>%r1Anw$3^-2E3?vQr>JGTxqk~%- zlXkPtIqVaN$=wr|IPk4-9V5e`;0*9cFouFQ>;$_^zkr?&$m21%ILF&ONQ)`DK%R<0 za!lG_OIgK+p;2gY`Ij_Rsv=RW5I7PLfn!9I^Qj5`waQw5pYW8Pj98FP@%6<&p(3YPN_q8pC7lDnWaGO;*Vo@H=6SYn7?kM8HY$bLFXrrVY3R z6kvH#+HR_OI}Ed=voqac>)U)=b1CfI?>lAYb< zM_u30B_C6jBCt6z?Ic}ZwTwpt3h`!&Mx>3sRYy<5V7|n}14G{cWcPpt(>Oc7NqXE=skM`V^{QtR}QLX^6^nhZb`-aQ*p`AURlC1_FM z#Uq>~t5u7U- zxi_m_#hB&EOm)1TU6GMV-c-|DXFI(%hv3~YmoVy%gF8NGFj#yIWF>JWUJx=9sg8zK{8Pt_`2#-h`;bwHZIG;_!>xly>vU3|zUn`}@**i5^>d>dEzdT*T z444?Ze=d((Z7~rL&Z+e39IPmYQ1Qk}<-1RmXA#UK`C?pz7N_-k=501%JKi&3NRvP) zIPN*as?bw^fy+AXaO-ApNK7b*fi(t`$-~JFx-b}{jDe!`P|DLRP}wO|AI#%<61>;h z?&07~GGW)Uk(8`XZ;^PhS}%Y{xODbtlh)Nd>ZzeSBea#_w=iF4+a_BHk366b-ze(O zm~hEy<~3Sz$zq3Tv6A7~)CiuMmz^5cA8@4m5UKksl7qQ&r2?$UPs*uzl0%Rt%|HGR z44M6#t|syLDqvS>db0;s@MQ&4v;|7w1FVh*=V2GK#q|0|B?sPqepo40s-CK}G_#oU z`I{qkA0v-4bP*_FqR-7vr_HvjOBl4t^Za?SA~_1BDqmsOKXiVJBa5HqN!TgJ0^xwV zNG*3sa#}?TrmA(2rUlRS+ROLKEBGAo;1neWW@C#H-F+9;&~fVV zi3KL0VJI+{!H}PWN?sdXza`1|~xt0)MEzSIh zn;;cU&CYu{VvPm_5E)@Z4;-pEe9xIV4!xb1a4SvQ1=ym8r|f+xZ}PZD_z%9j=e4?}A>~ zFQ9#9xlW(*)Su637dJSIDk7@r#D%9;I%`_XjfX55XDMC9@(#-$aSswHRw$aajNUe8 z(X_!%)n;a~)VgggtJ939ql_sr+9K6^Q`jU_dE>Z&8kI}GSqk!tH=~C1PtVU78|S{% zb9Y}%ou-V!=-*`+kLs@}lPin}w*{XZQNoM7;Lf~bs86V$!qvQOM);=h{TjcBk5faE zwuSKL$?mU_?K!?w$0fqT&t~XUZY4UrC&7||-vYJpgQfOqL0ft-7gmX@TF8}G)7qR^q8CFho}{HxVa`5U;oaNhy!s7v*-%r&0PmE*ss~e z|6%m6M}E^ir9vZ_AOB$8|8j)3T3mG`e|yBgL&^Vt;J>>g=5JHHkSqKgD`L3lT?WYi zPS-qDMgRX@R&XRr6J4QMXDppHxdJWxFaBqD!|C=qg#$3@^{i_b(@NRq2V+5pZ67Nc zc}xpr@l!QekO_G-zmv=2WBseNVMe87qPpE|Vof%kga2knncwsFJ66Fhl7-3RTy|2$ zvUABKJkj)HgE{ZU5alDx1v|Yj+v~!0n4qy9zUb3-4G4*vzTWgi?`nA+cH)aRghsuq zM!KGnxbvME27!Q&PnMl6w-BW=*(nfoPPWm@()5#FVlJGzMAOk?VV}DW+%8eee4csM(*j44ri)L>aJrY zhp8`10%vF!7OugSkO7pY8r-j3J)_c?N`fH$z_==EmU6F~SJ}~)=#Mc3Xt`$PeW}GJ zJc)RIH*Hr3lCFBoABEn;9PXF|k^hWiB4l3k0RYtN9mZ>>1!uJ}b*@GbfZkk3vENpN z`F)@NdsLHSl^#jxfNKx$(v*~E|7U8uj`&}wZ==)lo}QlS+5@qk`*pfg7F)HX+X?UR z>0(#_V8Kcg`BOPR1R${NGsfWcX8HC~5sr?UL|2%ji`Z5?3R3hB82RI4udj3q=UtxZ z{(4?#)k*O05$}vmNBNQiQ=1OdM!f*>Nw5G1NmplF_zpN?j?4@*_4u>jopq|y#D}}O zn}iR5Z+$J8KA=O5>L~ve)VUv%0X;4Ev=!E1i4*P?_2>J6c0^K$HPor6R7@CXPCD5L zTbx$;d``THah6y(`7eH0$}R-7bl+VvnHx@a`XNKX*xVd*jX{NYLNtq4FPv6#2@BMN zH#zt)k?oCngm%33=8uionG~(ebb+vdDj=QD-tr2szPF8E2Oin>!C2{>HE)s`bdc*P z{#S|H80UCpiPJUJj%R14>2H41A?w_?ix9$YFaIsQVGqNp$&e!;$g-?Aov&DJaXHE2 zyi4EM*eE$0Ug>Eycp8#zVI@67RAjkfuuH4Kf#f%sSi}!;=x&CY!&!-KGZ-)QO{zcU zy*w~S0fASV&p7jUG$s9ik~cip?nUrF3f?LNYL#%^os}RVbg;@i=<5@514@z3SaxCw zY;oq|KvsRjgqR+|^3BVYhl`&OI2i9OI&$y6ZZAI#)AgCOdY11YuU>2DehVbH%@}ID zyH}i1S-CaQo*y+d0BB|3@<|DpGsLzK>z^m&J|CfYDcA_Z5=~X zZb-=#Le;HwVGx!51F@`=Oi`-6z|_x6d~UOFylUdhOQRNt)s~g{iMX5D(`}5*xE0`5 z?StqtPq!`%AhMgWA@gbp?#h{rP%ACY>}kT=DhAe4 zPO~GA>^_V0^k}yWQuMyIm~!uoS8tBJtPD-XV5(dTsuUZpqQ&XIrm;xaa!?2-s(*A; zCZOy5^xC36YUE?*69xZ+&%ov$%E>~5^Hs84#reU-@sT{4yJJ0lNB^awlq?3=G(r=t zZ)4KFG8#oj4lm`0^;^~|FQ)H(i27bgHsR`2?eL?>(4ut+ON~ucNqca9+35hP(N4)t8(byzkcl&3K zc>K@~PNrNX=M1;(oJoRG#G;C(rX<-AW2Yd~9Ex0~JZmiAV6eh#LJs8t7Cx-`qy;(I z>0l^7lXEyg`(g0ivi!+Q_j!8ieDHU`rNSVYL=}eo?nK|x@XObCU*#cl?J;*J4_p(Rq}k;F<4u3NNrFo<>r0D@g(j#KW~* zq$~`Cvmz58?(eBpXo3wyg}-w(R=Kza)gL*}uR#;iy<8NkF;7scECzpr!b+u8?q_1* zMo3VAC)%~k;`I%fwCE+x({dXe8%Xl5KRvv0f76?2!*umn??~r-;WL{KW{`iilM!(< z9tkG=Vu^#?(pHz>R7AACJYTtHm8hhpr8HVo))-T%1T@uDv;MS)gez~1t-W*1aCwlm zPrYp(f_%E{aynv%XloJ5?tWzKeOn ztF}aaxv|L-bDR0XuyaX0s2%NLps@g)5g=9ewC9_@N_91yI9+ddKDw-IcwIfHPL`;3rJ7c3G96Ja3}0n=b?HQ*o7*LFHe>{#5D6FB zq9_r*({m1XDuHbresn~3^A;FIc21egS6-KDT_=+Gl)t?}xncwEosJJ%ES8g2e`@wN>LcJI z07NzyAYlWx`cqb>I7 zSx(^a7Ax<(i9bUzumvwNnZv-z=FxS=r){$ZIPBRRTq3jAm|g!fw;lh7-lwdp&2^-f z)|TLXlLo$8sPX5|rEEoA4le7}cpYwFP-bDM@9)AitO*mWp9r%*Wck|AEUBc5*EZBt zRDN?deG)m;n6|8Td$?DU!gqNJ5^L3OnS1ngeeq7Qy3xqUf(HC@Z#W`&9Jq|4-dOEO zY(WJ0UBTb^$u7UY)y;BiP}b_Va{z>}m-1={+UZ9kcIf--Zk%?Puw_SASNYl(+P@2M zZbX|CCK}Vx?P^i>9Yqbe08!TgDD2Fc6KoKexry610e{2b-eb&}?+K_;;>v1jhn3S| z-9a3o>c-rTasIk7{%u0MFL?sOEgt;AH#>k9@iq^d-^;|`E{w(N(%kb5vL2Lq3}i4(+6I-$1JR4{~h zHlFUqRW@zMB0Z#^js={x*{=_Pqd6b*^#DQZ7w|-HQ433q^+I!v4&b{=d-)?jGlg1! zX36frMJri2;)qD5rkrG)ie*%fZE3TGPzcvcg|3Ls-F}4X5YCo|c%_^?b6w1x!y2x` z+geOanMS+8Sfgj=e6Rr1#h*Z}4By7AE^QxL+v%35%`K{rkt~M$5fg`MmCF}TTQ($q z-ECqqRkjye%4(MdzRH>NG4e9&65w&AO^>a!_50+dK~-?#)>G^2CL&c>k;F`z{Lf z%gQ}?M~z(7=Nq@v8{0<}vAp4OHoDH@bC)?(^aWi1WasZR&AO{DnsSF!vb=Ra?8H-} zAgTCz&_e_T%i>#T9Vb}OS2C(BZA~?JIqA#N(y`~pWf4ku zO@r$lr@Ko)sRk!2b$@lMS`FNUO;^8XEc=f}Gu0Dx{27Vysj2Dl&)ZELI2owNrd`dH zZPlkvdU|qtr(uccOGj0vX_?L2Ex2-D;1a%!9+k8={c=8f?9Vp4a&UB%f8nUcS5v+! zs_a6Vb;!xXXNX=dUc*Dzg zZji4z^SapAbn{4&{wEW~ZCiJm&awo@xzP@x$e0-?O5A8Fi_;KeOso5?EbRJ91ao_>_CU@u37UO62uhyrIgctoiTV-Jg|-nsh_M@MuAPOodX zY~l6%WkyEjdQZ=TD--nX0DoSYcv-DSL9cd;FYKzaV+d17YRdEqBU5$+p*J(;t!Fw| zJllJc7jE-xA!#N39?!L#?(O*R7Dninrz5_{XW(% z)NMbeb@l3PG&Zd|@J&};eGF+3@x9#rh0-F|cVzkWIeN+aUNFcPdFBIPFd*2so|pY) z<)C&?uEG<9A%Mz`Pb2wz(tV+uiB+illPqm#Vaibexic zq#*XL5>T{d5p=QJ{Dc)UCO1`m#(Fzq%@ODyEI?x~>Z#(gY=EjG|EyC$s7Wz4m;}%> z>@L?&4bsZCt+K4hOA~Ct(rs)sh4JMDPvkaFLujzi$BuNUSq7>);?F9u>nv1BKytLc z9*iq}45fZ?3ez}xKfY^cm3duK1U#1Z?XXHUvso?9cQR!p)ol+`p?SNtc1*_ix*^`S z#D1{o{^OPw-}Crnt$e@Bs-f|$z*^*cF5c|@t9v~Q&-JdKABcYJp!%2r!S9-eTgR_9 z=4>Rro{7s=q`p62tm*TCAadTF;3DCx$BA!_YKW@iSNkHcKuYZ8o2u&SdjHTv3G-DzSz(Zi`LY`f>+(r=q;%L+pA z<%2Q#B|6WI^5fG9{hr08R_k~`V$|#yUe1<0f4`FW^7T2E>f(N${ zLU0T23GM_BZVB%0jk^SQcX!v|?$EfqH{R&i?0xpW=RIfN`_-R3t65pyRW(=Dm}8DP zYYy8w`&s7B1myD@8UF#jc*jMd#^nL8y}kW5KPNLR8#0{9y#{a^R!9b%#`|{^TpH#b zq7)3*SGzDL#5a?znQqnCn9Ey~P!K6x*Wery6|7p@Rb#^}Dxi97_ReocR5|q8au#Mq zndLamwcmVk0n?K=cn(SGvoyPL?$ z($yJp(e1-yd*?^L))t!MbZ3^nq-X=v&?_;YWJU%go~o+L7F$}2Nl=Qej`U`hzIDgM z%57x4$39MazCt|ZUTBzkLW@wcB|{`H^z-BPScqegAKGt!qDS0+r{OwgP?AI-JGI^z z@UGpxweS0l$#+)vNmfHRjny8yIsH^ngX>Be-#gED<*s)tb+ismU9z zULJQ%t`6MGqfjzPXjQuheai`Lr#a{}?>Xoqn{n=Advr1bcpPSG*IYvNo37}suyt1r z4`%SSb{Y`#BdD>EsFd~98R*#f}5+2RDXT}jVgBug2FT<;#(sG93&^S=kr*hNF^YJ4d9?eyB;Tl`lcl?eVyXk==0Wlp?lDYB zhToih%ym5;x+5xUj%I*N;f&|7=l3Lq!d6ArveOOhVH=nV!ZBE=_3gKepVM~1Az*2> zr?D+jLt99*?bl_lwTZ{0lj!FV>;>&7nN78qP6|f#&j}35=^&|`g-IkM# zsWpI}Un-|4C=tM)*)lgp<%OWAWf)V{yrXngpcI70dWWU@ld6UK{S-8HzcMtm@VAPp z_zdqV#a9Y(W^dwV;@EOsbIp@-jH5rDk`TQUn+#3fVS9AvzsWv699WktepTH1(SB^fwLQz6M@f(wcSPe)WE< z&HT_vHl|)h_UXezz{NgE@pMv3JAX>URc0F}{-%8Pvz;I#`u4(OwQaMO@nC6xYlU;C z@3OHAe|uz-%f=G;A|&6y-}yYXpP#dQ`EjRlC4GsuwbHCJ@3DEK8ZeHnrNMhb^C+uA z*BZv68df$$atQ_3cgksRv^cnm`U9!t(iGLLjwV#H2(_#iZq~ z<#}jg6FU5zdbImf^WFf(rIuLW^!LaK_jnnxFsyyCk!8=wWEr}HeHj*f;f;x(3#;fBp0LAQFuHVHS@1WS$jl7u&=lvujW|FoEt7-=B1QmLiwO00;ck2DN)5BM0 z0ApnnZD3Ku2sH&ZcXgW5`3J-l=|>)^s7k%VxjKm9|4uW@IMJU;3ECUMb*MQ6QezN+DukI zacq;#7;Ei-^sUv6#j-a80>ak7=U^J@s;Sh%WvO>bbavc(Y58E4X)sbQ7)Y*3YiS1{){@}1{T_G{XsLBbHu3Hm}Q+;MYt<7d%$?T!?DLQ>Qqu#IMZ$}0pO17nB2U< zcvDhuDwHlrnz=5AmCbyylo>G98{eIWr;Y)S68-1jU;_roD~)^Oy1lx#qUKoiCDl$l zn5ur5hq*XJ9JA|41%#5!61AxpKqhSRk^t}sN?)Ovh5oB^P-OGK#*}T;w&c5&OuJYK zHF=4hHjeSg^wiYD!u*MJ@>P@m%iFY>F?jr zVS;~!b@=zwbl@3>5dXeHCLpJyud*kyTeBfTAT=(e`bt_lL#?zeL1Ac^to$ZHSXE68 z45`+WB_Df8o06J{{%*2Kk+l4Q6=EuzBuB5W267C`zPbyTB)py1rOojl_(jzFpBE(# z4sWG2`B)dHew_>zexo$ge653qEj-`!QW@%x)`8HVNA%YP6n>q*T~CupajkK#r>e>5 zHp^zP{cmYUjGx_XQYO|SX=)~JQVXzZWS^+TRiqT7$`T4bYBI@*H|b?X+4TsK?*|(f zODtS#65wIR=Ft4ZO?llcPr>#nLx>sLw4^cClC;ZA#;Ac3Sy2Tase}If$GA&k;Y>68 z-#;mjb;B^=^g>JAD|HxwaeK|9wG}=btOoe@RL`+wyC&;=nIcr&@R|Fg&IA8vHSfQN zU(r-dmITIhUGxz*z0Bp-zWjt=-If`}s~k`#KR-B;wD?!QJw*_zQ@&Ypv_)cmT5Q7j z>th{&RZo+<{O&`olaso(3bFRM(46Ulm#C7g)rW=296=<1(c8vzCkyGt_Ns%Z>4xHo zT5|STWK(o5UB@VSK<2sc4AF9D76t0@e5tLISb&OhDosJllcu^AOH*ovA4&SI`hBpy z{b2nvFLz75)%is$*DEmF>HX6{${Y8}zq@hyn>Jrle(6E)&Hx-bN0?ah&F%WoICc9vvMtjw?>@fN3wvo_ zvLUs%nuRJk6rDZf-Sq0bH|qEJGNN&k(FDXmewHXyT58pHKWO+uHeBopIrECuHKo6# zI-0E8GPs{MKb1?9C0idZvEJ2oFs(QdgB~YR3XM8xvY_#_i3{;A%3og)hG@Wf zj5*YLIDHks@M&wi&vM_^c78Y^$3_4_eSA0~`T4!zE;#C4$jAq*B14PN{c-!pbsteZ z|CJXt@4*dPg;6 zB@K%T{6*f2mCc?3f~+D&VF@+xH6nj5Psh-u=+W1nvw`BSUrf7mcr#e_CW*)K|F7FN z_5c6w_&*;c9c+v(p{DU;nJ&R^$o{==PHrA#Z&xlZvUpcGu>oFun;|uKF>?Yxn6F~{ z2-kX%_Z+U(D&t{ydig!wr2z}3_)hQs1r|^PRXMns$tZK|3$qTmz=0@|-5bcWp)6D!ft%-n-Ji7@`kqEmw$B5Y`rT@QdCI8xFd^{+_fzRR2OEA;%ATPxjmtZpf84H{L z^+>!|1+v|zGVP-n#UA03jN_Asb>G^tAHW8HN>~+PLs$=B`}z~=4xP*&g7mu*Ld!qi zvFv=lLGj~=$Hb?3gM^8rJ5G4l)jK=rYPN|GDDk;5O8NU9zZHIWnh?31cwP?+Uk0lL z+bFNGVXPTKh?2j_cOz9jf+(9}a=w8O8a)sp$b=BO z6itD{8Rddz{{8ijF0>i6>yHpKM8kyO85(hbLsn>64yy!y(6y&>;JgzmArunJ%1iHh zEf;R1M5?zb!jWGrP=e`qn@*epj>mKaXn!MQXpsZ2er1|Ns921H5n$B79?`eyTz~X* zFj?(~FEG6!&FeJdw!p(~+eb9N8C~(SGCJus0W(&Cga$CNZ_|G9SI!4tBP7|->vfPD zMUNVz@cy&`xM!lAHZp=-YCckxt)`pYopv{ClGNpoHCriRdJ*y zBwp^3hZFC;d1LHLTo;F=pJ5s|GSvl$yvN(S+Y3=6&?Mmn9=za#YY(zo zT3Tuj`RQ=i6r62ok@Rc?S0aEWKb;{J4Z-t{5wv^9zpEOenjDkJnV5232e7c+dC zf@{4jE{FCP=JhX&P(*5ep9=dHNpEr$bWn_Xw<3aCol=+4Q0H{Zoi7mIlefK_ul?*i zap4h@cOXmK{+v2WML#Ug!?t(~#3PGererlmq6PlyO!ttcr%3V!)b%)nt@l%e><|)N z8#C0dx5pMZY7-gdjnGi_`$1J92LBI=?UP(GXsp z{EmK##QP4JZ55B$8~($E9GhI(ttNOl!{bAg{%exfi~i=a=v#||AqZ{F*fDhfZaDOAsdDWy1D`# zR{q}Il*aTUl!QH4HI8eseoN(LY(xS&2p;JE%20Y>>#6Gzk$Fls<4rGiS};7EFuU(` z)k^4YnLW#B$T@_m>}ZD+lEzbGSUN~EP~UzTx>CbzQ4lM5i=hmPpGcpIK_-Bp@o zOIqv9k9=wJydF{9dufFE;jIxq(__op(vmk>^HhyFx+{By-1^th%q7tX#nzu1tE)vg9 z^ZBaN8P_WozsayiN$@|e!G|qSDenVd-!1+w3}&-FWwY)}%=RIXwTW9%<6|t@+`^1X za;Iu1z6i683^-9?aWTOe+2qVM6Ry}GbE%H0h1oKxZ`YOI# zX>`&yDUf8$@?Qvkv#~e0D<9)iOhYa{AcsGtf)~0!XLF0xQq3RyhKPd`VAi^GKlp1$ zW0|}Zw?bJem3t&h;s9bM%JREIBcTIsa{eo$R#znWd&@O$AZ%;tE**u@eWwsYsS=KIhO7WAB0_SkXQi=KSUYB86QU=Ip*em%F_( z$TG%bb;;O@D2#VNPkqine0yx5)u>DZa5}N^Qva1Nw;%j@T0ep8Ajt6;t?hPaoAWmp z$+fYFxKCdo;&BVtdle3wtmkwjpyn?{H0hw*uU@ZxstfX`N(cE`4Q5hhAm!?GSE^;w z5ydFsRU8e&O1f(-`gEkGxZufPVCKHZU@heQP8cSJr`}X8Fkk>7ru#o{f1XDQVLke|0H>V4dYdEE-niE6b zO>Sd3UGt~%1(A#O&DVW554KLCy`JJk&h|43T_~C#o6d7r_erMmv^^^59ya2l@kH#n z7dAo&Zr)v`Uqt~*ZG~%dIZ>xDNMfhmGIK{m+9_^M=Hwqw{lOuqKUt5_#ky5U605UI zy;dzPgM~gsik)LRPNxi)*^gKIOEp3K=HT_dnGivZ~8^P%m zG;3o(ew!=j9VD8ob~`qXY3X72`?CCFdicPV#Wp=wG)@He*3oIc6cxy5+k6u0Fp<|l z_Y1`Kq7oo$kzedI*hcc^bKQW=tQ#oa11bfvm^*t@}H1uOY{mQRo424q}+x?ae8)aRu z+fG!4#S3%y<&R8Op$Su?M2}=G5?g}$WjtasjgAJJb8)P@vQwYYCS!8=C_!NeRy8c2 z$ek=sA488m%mdQjl_s?Dw|bXJ@HJ1-1_hClGa?_8X%R8uaqi_Rw4yNXoifoP72IR? zbxKSwf({^qup&~rK5Ap5CK?g4rr>*gzcfubQwXVW<%_oKFtrnLOl7xOMVNG*{2-!p zvhAy8XejT!i!*X?*hA_|ZiII-Qd-Kc z_O@Pks}r2^s@}El=R21aP`c?d=CbqNl|3!(C&pNAbBR&_@HToJ!!EZ7`m{VO1~fFn z*J6t)ARVS{Pj5XmK5>}dmUu~<)RV=ht>z7G8;ZE9Jga}nrd2jceSNfK3-55mm-g*s zLy9Uyg6=shh`6eH(}#x_(voYEG;BXNkH+e-+ij~j1B_AmWnWr3q*MYjVVlV7noE*S zS@@i#rm+N~meTzAfaDuniuBdipT6}2sr6-!(#GTfX%a@K73ai#rP;ryK_lqn#nA&}D*Fvn+eZki%A}{oo&UXMJkvXs zY@yDKeMd1}n!A_1{BB_ZAC~k&-y}D`H{kVcW3z9I3XAKQ_rcI7y0V<`R0DCT|JfZ& zzLrPw76lPmwj%$JZB-?(IJVqrg}2qqnRZmCz-R*pBXJjJ`h+9N<bH`>*gH3o&BThs~Za4f}E}h#WZj)mpdbbWLlxau;o!~)8m^R2u`JH#r_9rZodIw8?Ze+%* z(Ng+h>_!}U${siQ3Daq(Z!Ik@{mS5A&YNT+9C%v5Q86nLlYV6lP3-v>ZJo5h zj&H!FMZ8a|x3Z|E=j#)i;$O)=xQ{f$JsBG~qCkD~(e=?Hb5+FTTJh)Z$Oys9{tP<~ z65uszs7@*J-g+2Z$>3qA?H&O7NV3egOQqhz8s0^68{^^O4dm~>=KMtg*ZA%*=*F~x zr$?_^%`=qe4{ItCM%hhe_@V zS>u3QN4U4rlHS+tVE~Pvo|N{6tySQ)J+UDiY!MO(RT47(d%F+aRFu?{G!%S`2>=%S zP}S?RJw(;^LLay9DV{j1CrP%q<(FLW-)rDYupo$|Iw$I{&4gM1b9(=HbDfBk#gx|L zqKgdzX?Q0Nh5b)n397OSmc+2l7a)W#_2%ge&0FMAOuugI|kU-b)U zF(UgsttqO8D)N^W04@Bv|5VmP?QWt1lGBF=*w5+z7V-NU!JJ@C3S9uyshy0g>~y7N zovK0}9O?ngi=TE4O;{KeW(|Aj#uLuR;cBW36#P=&ro~y$Jdzgqj`z`lFbU;uZL`i= zJ)9@&xI>qHpRXkLZi1|^5!f62w$@e>7KYKQ|Bd;i&M+L)9&00R;j%2-G_-%BkiGjx z0>Lk|BrYxQHk^ZTD??5i`8s!d#gY=rpv5+kZafxxZ&8-P&W$%?bwn^=TKPx-y#XM2 zoqoc~Stgn-Q-%tlHSAI}=Ip?m4-VYtmFLs0cob=qD5hhO-~;TfVTt=aahw+y^UvFz z=QVthqnG4=-t=c4RCf23b$33&<+7ibj5@_8F7l8-eg`O4W|wuoCSGmb+GV&| zjW!;v9&>A@A2qx!hHE?etRbr)&S1V2yL=V2i=spwrasA^qj_1`Crh$npLkcao6EqK zGC~u-yjpJ)k<+Knz?Qvh>I9X<;YZgR#}F$4aY46EdbQ}|gp2#c` zYbhh+^#P{A#bOEoX`(Y9FO7nm$wMnDg}J*Cm`80t>?bB$BLFKs)mgvN<;u5Q%FXGl z+I6_o6EfGYnIH>25>4U7Hg@k1zGcht#*1BcB%84j6qBcRfX%sO3CokbmOInDmix*x zYo?g;2ZpBFPFwZMW(ui>S5mUr|BAKEJCCL0>4kjhu~FHj{|uK>X=P;5u=h;)v=?ez4Rr}KZK<+v`1^HDbJrC}9Z8eswZ+)q#pFhiwwMN$&9fT`#5u@zmR-Fkr z=w4s3cEVQz2JI@16!YM@vVh*t`I_|#={4Hz`1CW7sqQLQ1k{F zWCfAw50=iXak`$0L6Yr2sWZplJx;rKRN7DOHW=$plL0@5Al0xnwCryB_8d-7WO&*{ zyC0BZ{em$7Y3%RE{m?qE4;US~+BrWrwoqC)7wG4QAx<6~?>>P11MUwgY%XV*595DZ z5X~;rjB;`gvYSnWbw1cK`+Bj?{Q6{Za5QZ&bDXu{Dx(!uWm|y+*jtgFE$QlcX zMVRZ&Z`xNKT@-60*^>K0DEwqw%F5dyl`TRd(z8?>E?JAHB!9W))IC$V*qoD>`x` zzqug%=w-f$kXTGv`Z349(ayOEcG=Gz=&ZiH|3pdmLYQlDvWb7AsLkG&d{%^23&j5y zS!wPjzBxhs7pG0rEtKB-<1f0Gc-Tfj@aI0Q;hVdv-kcp{6&8){*)K4Egz5C9c1+P+ zF=B%`hBmpNQbXN7sE_;vT|K{IC$Ly>=zax6n)bW)*VXs}385a*aXU4zB&&QN`o%xMZ4dECkNm4_APKl;Dt;QTIQ4-^p1-*Ym2Anmi5dW^h(D+m7-6D zV-s>*wRR_szuzAVr&90J)2S?mrI=me(rO+Icc-h9lBRXx_jw_x5$y~5m(T|`5#5p< zQ>M0JoNSrdh7t;?84M{dXO?gA}MOZ56DvGDl*sCBOsA#HMA*ef%8B6l3JV8B{ z-XL;?IICE0_m;*+)a$vC0T;hP9~i(BorVE+vo~ugY8+c!^e4}#P<6t&xK|u~ibap@ z99v%bXpO%nVqk$|BfMN78Mg7>pN>-e8IZ`I))pP*X1f@ea+Td@=5Az^rtptU>cSUi zk*3H^;vEHM-pw_Foj6P;u_Bb?=!Q$t<7V{}=_ zW(?Low?7LO!YdD-dc)xM@Jn=rSI}f01I$l51lt>7KI*qDpu;Ef7lFPG*9cQF&$pwg;r>cJ64nK!UKaz?f=FbW=nYR?%;@z`CY)V*<;rvH#oKQ zZ6|E*hbHdWA!xf@oTuoxYyTEjO8Y{8%MeR29lC1Q34XH;T9;n(d)h`s^uzMCg4K4L zIi9ZC-c1VkSV>=Dmd{S(bZn))I$b5UMCCVxyHCa)e-0Ch`N&Gt(ixRNg zGyC_S+G<$LZ_Dm6j8EpBOTx1ANk*7C##9AqnhBDJ&AA!7!JwkalmO$P2niEDxoKz6 z&DIK$deQSTBLI|HlE(`ZbbCOSJL(jgE7cr%NK9=;uz&q!smAiV&Q&~3ihi4EE2)+zU{E7G197HZ#9~({yziuX%S0m+dQyryrfs&(?ics9rUK5a>|I$>fE?3EY z6TXpzn3gq5d~3h_;kC`~2I`MtVCz%yNX*E;;*++l94!5~q^V<2mTnGtmB03xYQ$!E zOe}!#Lyg7tVHp*ciB2cpX&2Y=Ubddm+O_DMn(^$_GS5jOd)wyAUY8TZR9PsxT6zKE znM@hp;qy&Z@jPw?gC09!VPRlkyy45lm5TQZZeIE zs=$F1tk;Ho&L9B0$kXLv%Qe^OfkxQ&){YRBq}ZIdnR%00mVGb#=5JP4TE65GU2nhv^bkl)&mw5G~g2#CAWgq2`? zk3FH~@Na*#-UDq1Fc-@f%+9-{=azrpR$dS}5h%+{n-}hr%-pPHzI15u*W>Fd`SeOB z39>Kv9Xrh){%vlqbwrm7c#!w>E$vO20+6IF;a5CKd+ylCPiFln6Z@QZ!YsABjI95} zQ7ixeO*}xF{;9&Q;A+$;>f9e&`6LA9w|0BM4^t$l$!B93%M>b?HznCv)-8**>)XBL zaYhKFLWwR{=;#in>p!;C>sjSyMm`TtT1p6r)-^a%k%Qb!ZihNk7U#EPR8|qqEys)w zPf5_$NXEAntbvHUOZ$gTMeLf{Qf@{oDHob?9@9SM7q9K7`!e@4Q28tf>bLvJVnO6V z>#_Dqh$UZsH0XXygXK^AuzEZ5bAA(sORYTI(?29OfAwX20*~@Hx9@61`b<%UAp4|! zpIaQKG(yMs5Bl6I#9gxEOCXH5E?;rbxwMR43H`mC{T%2+NfZASV@yRqHj_AFz0N)T zBYcy%gCV$GsTc`Ji4;P^v*>`ZRV^m`)R^!{Roi@HIAog?k+4FxeertHa;vyz;XG^W zA^=4zlE*rGheB!V3B3MmPa%^3si}Zn76Kw-w`*k{X#eG1Gl`cHRA|%%gi1&p+KO* z+@vX3{*O@kiN#URlmdwWp&+(aKmBl9n~0OnWdYp)wL2@I?jz})@|xNmr2yn8#mE2cFeV`n%Gckx72(Zlv^G>D%# z%lv}VrNpGO$&0R54bSe)B{{-z>YR~3t$#wP9b2v?Kuse1w_C01> zR%>&f1+xI;DhY?s6)s#IOZafeW%|S#mzL{LI8mjwiBRnm(pW(%5$r{P?8x<6NCDh$ z&W)}vYmx&n8N1bR+>n0Vv|5+VA=C4>rH4KmK6Z^Xv^dcSJSIcK?mYzAO2XHp8#6v# zH~(@P1qwb{ro^>p)>qN6M3xokcMTa$WrGiTR*}PTjQu;0J*$ z1k#y!HX+tVnb^8A9~6x;SkjMltmKqAwQ5TCFbyK6_kA|7wiN|M#uI;NjNNy4kA_1bn&#X$ z&fDeaL~(%%Y`C?FNsYieOLw*<7Dl{dWLP@n1UMoF#xPcVID7)eU~__xDDY0$keBxD z_$TCyz;7I)v}H;4e+rIKPav)i*3Tt96K8y!mw5?cGzuR%?6~~fg$il?*%uBOVaYIe zx=%m)@Xf2_JO&9G*E%YH>)H9#NH|z=j91Prdg*HumA~AIO^^@Qn$E=CCxpDOA@e`l zS9@;bi_z_pc&@)Bh@Jz(9P!np%kc`C-{zX$bi8L(DM`-XF@hE;beHF1eDj}TsQ*VM zwZlvBMx_MyFK_Tm7evnZ*9DZ(9R4K4Z?x-F7{(QsvTFUJX<{++t=$~=Z`n07DL31J z69FB>;f3g~;#zZi+x|2nh*EoKiTmA#hKx~(*;79wZ4)*Rpdy^SPMILQ6evx`Dy0RH z<ExM;!HpU zu@>){9Kh0t-DxH+Mf>)^yTPkD>b!b%bh}$fb}6xl?b7>hW62qmhUa(jA&K?0Dduq^ z?WXuy^Fupdd1^jHtKxK{VV^%-Xa8zk6m(irmj>hY<-HYBIA7Y8<#15wo6dhyrTBd% zfr8Rxw1I*u(8dM9c#1O)8DkE*Cg)#TZc?m4M(20rlt%-3aZ6#9vNfQuCJovx?R^F? zG`)L!X8Wp?LMZuW>Pz`G$y0-gR0JDor)M7e)YuRLX;M~k^6CM>*61e4jXPY+^=nok zZP_T;6m(YCR>sqo5mW)JfsIh~2Oj1HF4j;Lt^%1Z(vYq$&Q0gdzx{x^0clHG(vjfK zTAw3|kA!7y1NA*3FEuzUbrcN0HV1|DxoU)Srj2?U%k;%{X|JU|$|>%341o0ySyxs3 zS$1b1si6o$T<$iA96HYCmru;NqVhiZ8qrV(X49lg%Au5%#e5_eHO8qod#NH)P!x_s z1`p-wg5ihG0F?k+ox+y+kFJD(*!;4+zF`QLJ3#vb__TNpDIck52mh+HTt2SFu-suM z=sBv}7!_sgt^LP?OLt6dwInt-pnDL@%@NOR@5EHZjxhr1fBQ5l^H7(NHzw8b!bEQB z7kv69>N$oJ%OQ)&cH&a7nq?WwuCCffc2scR_U7q8D|emZbF=Q#hM=mn>njYK7%Fn&(iWQM(v3;yp6!xO7?2-HUfu4dDWnvF#W(@8AcOe> znW!Mb1f*{C-O2WzWR!sMI=`T73wXlMr8$5B%5%93Qs1FNYp;P5Xeq{h*nj`g3MkQma{Iytog?J4-T zX^vXTkM9`%JCAgWheG5538iBaslWHNgf@x3_hopovVrv5=DS{IW*Q7GadZ4a7@;kp)`z*Pv3j! z3X}z-NsFtQd~J*?xS;PfYuj9|Z{-fh&|%a9?oWgVuxm#tKQ1`C)VLl^aDOfpvAJ3+ zJYVS&Of^^k3I%oV6$x3jq;br@(CK9`)ta(rxw=+l$n5=Ju z>v8!Ip;7)`HXns%luxWECMq)B!>ooO1g+ENlnWvy4?%PWgVgVqG}xFw6`m8P-_0I& zU!kC`S5sx@Q*o{wFPzzIVo0(;e0r(YyFi5ITAdDOl%J>(X}_+Lx%vZo5S>8BWt;)e z5-R9*qDG5QhQVmTI8O`R6`jR5!N}5Jm}zdgtFT}M(iqpR5|zPgi&oV~R-dM`$gKGc zXaNd=6z{ALtu`Cg$b`cXwf$Q;rM?hIU%&98>q0ua(?Oe$Y!u_ygOz5^{pwsb=fktc z@KeknU*e+PTtOU_tB1!oi9qVd+qmzIvuiHy93!Gqr;+Di?_>6JB{g$rxpS}}e7P7k z0_lGP{)#}aE0?ooDd*o*4p*}@eg|)im&(H830+zVPvjqglMUpLf(ybVt`C=_TJeSD zE?RebUGptA^N;Q{H)1X=S9;7ovOmiya@pgg=eC}d+#GhodJbkV+nN+a5GZuE@=U?G zxi-#ad*%aGK>k)`lS31jy{>aSE=Mbw;Zavs)JvrmEnYCv!0^SsYT|~%=BYb}@u8s4 z7zP9&VE(Z`o&I6yOu9vd6YDj&?d#Ei6_3niK7M}o`q|cd7DqQR1k!FMv+K6n4JtD3 z6KsSfU-QLA;=dVT6hPlaqAz$K!5q8wl*4 zDyUVbfU|iSiEqR{K$5#3ccCgU@$Xd5ywj6w9f!nLlZ@p`KWnGNcE<7Zt;g6L-}f*S z8%Pn6Jv4QbW~^Q=b5jt6Y6Dn=aa2%{R8?J-R3C8Uq}wZ${Gg<=1~?hJ4?CiZ-;9>w z5;t{e4-6081es=2FReH|XP?KG<(cNHX7_U!5 z8+5%)^qv^A_?_JcDJ#pYm!@`12wGonKur(JvgCbPu|&P9ovzl-+!;=Jsx#TkKexG# zHQtwv&46M4kjAvTQwN&n<29F!&0R_9DoG3%tf#LIPdQ1gGp@;`LP=44_!x{P?~W)N zb8G?wH7*wT2XtY8_=-@BnE#L%Ra8_x#;WGe6GwpSrQ~in{wKT@jr%WnJ1xr#ZKQnR z4&@>Q<$327jsumEmbv-bXp0h(Sce``ykq`nMwHLJjex$euI|Q%w@LaJT#W9Oas(m} zp8f@yL9*@`KK+3A3Aod=T4Qwn>VVrk2Z;$3Z`Rfy%}sbuGdeQ4=H)}D{=3ND;>2>L zG382L^e;&6iOcT;|P}a&yz>7c--~XPs1rht}_ZD0A z{GIRs#bTDQ{pznrd-|7>YF46rq2MWvi2NghK_2&uQoTl7WAOKn>ja`;2qw&FFFn-7 zyEK+E5O6R#iS+p`*xKRsNAkeDuE|lsX>Hfh98!*d<8Z4W>FBm^@8C|v+pa9rm#Br7 z*|e{ZudUhBY~`N%5d*iwluEX&{`pJP!j!fDqE8w4mlojrqDnIp?cacwjQuLbLL4?Kl4<*$B?88IsM;c?Q8$HtX-s)A*qt*&du%U ztFp3)@=mJuj)QeB0_oDPo6TA^RV^7A3ymy4djG@NkQxla`@MFq(h{S$kug>c{Az?bkQqv`2?Q9{2}HB9N3LHqYNsP`F6$ zUc5#9;HzUf)AQb^q^NlNpRs3qi{f+i?0lymKk&1q5Kb3?jBqNgfq17I~u1UONd`}H^}Nd&6q zb`LRA-CF{FoEtoPf z(%)L|x^q;}AhCerj00Y}QZPei7HAUg%2FK)v&EbjP5fq&N28A{MFDUGZqJ@{w zu&ekhcYWjik zf|&0xm6mVxAW5SlU9|ahG0U3l4s``nH#g)_&uwqoteU|FoLZDQG$FUDl zmBlBT%kYM)zVeW|+l^jc;YY*PEp1a`VfCa7Mmmt3xbW2*d#wlFM#sLm0|5K5wi{)! zam1GoZFhma(UK#%@1B$Ak9wfJ!ea#2DnRIETEDdjA$afA*l}xmq~^!_)95U$shfP2 zX)J^e>}g}yyw>>3>l0z0fYK%KT~B=;$!OVlD@MlphD*IoeDFYsD3ZJVhB)+9WOogdFd&Rp*R&oCQdw> z042rhmzx7-(xHD)Cz>0veRFhyidNC4&!vlwRiKBVSg!o7SVOCKPhSHMZTXa=Gh*swF`4ZYiA@?xwf4>+X zFGIiAblPSPWme&1bK7}1G!g84V*Mm_Iikw;k~sa%A?}d?dgo46P?O1qqJo;n-Il7B zY+t$0`N{R^iNBO|SK+8fyF9>p`SWKY`3A%1QwiL&Rm(4j6$TkZBcnX${ zb8N%1<=PG6?X;M5|4wt2Eh?|!1UI}jxt|S-w0+TZqjpebayrZ?`UvT1QB{DbZ2z4! z(N@>StCm{_U`iJtw-}+`xcteS7ZOeuT@Q(Fsv^#Pmz@q*jG?qjjPi#AOjdN@%7hCA zwW%971=m35A7+wRwYv+S>sv4xVHp&wGD>IiU$Av5?K_Es2FZ<5NKQO+~u+A;l< zv`N#}9;2cb<#ZbohS*uT*_Dd8?&R;!#gDNZV-%QocD{ny=)XzuskO#h#Q{i>#;sV$ zVj=$g%VDCAnBP4R`17DRExv8eimhD30kAsA8%1o{Iv0wlT`O0%%+DQ97mKz0O#c8x z#B|74^7stVPoo4Oz4`bWakZ9<<+zm}3D3%&_X{$5Cc*^92GiM)JEmpp{peTg$?*Ce z!{Iw)V_B8DvREk&Yy1utH33S2z`$RV1Vf+9Y@Vt4xG#G3t_~2jm#N5nk7srtwK0Q# zke_F%)9};_x4ULRJ+l1EMo9kHB|b^9vhs!NR^OCj$>Pmh*MC|2WVSe3`x!X}dz0Pm zd~A`SW^s3ScW1WAF?}Z-m889&>H&}*cIWC5pBF-uqTc3yG+Y%vdN){|+(ul@4+2yN zAjMP8t!Pr1J>?#t$USITVGTk-yMQ-0MRi+sEOBB-0B zzUWb&QWdZ(E>%Owe6?xa^+ZEfC@sil27y+JHpO4rDjP+JUFGflpO zO2|4Jb~RU1dQ5pdyj{~qB=z0XKpgip4yG?7#ICBkrvCY`u%5YB@EiMuA*z6W3kTKl zJrn|<-5@!wnDrV7x0fby>Ji|8jU9e1kn?f74Q!uTBacCd+%_kl4>nPd_T{iYk-E$R zI(y*`kl}4#c?r#s+#0PGFNfRe5cinb-bnF6&Ddf4c5B(iNaN)Lo6^&4zSMO2!CN=<;Epn!!Sy@P=CUJMXQP(WrxKn0|OfOHX& zCN)YQN)o!X05X6OAP6ZyAh{;T&}E zWQ8cUW)}z{m%;9QbWlb2g9)zcQ99 zO%imu{>lUkHc|VkNU9L0VfX0q#2O&WikSic$K6z+*?V_3f3{5_^PEn#S*wb^HesDG zEEopBQp3hi`-8Y+xqf*IfY9x~+@BX@;Qf>lEBK=A4p>y`>kDC|2EE2x;joD!H*bm~ zFA&Vohyo$tes@}8*JE!mPj3*I14thz0{x`p-BRQ46wP@jZbUeT3D}(PKNiJ)^#h+} zM_-)Q{|DEBEI|LVd+N(ggHK)?G2fAJR$RwqiLdSfEvCh%zkAfc1-h*4`G`Ye>1rDb zpyvQl$!laMd;b{9Z_f3`PL zz@-u%clrqT%1T5bb8w6B|KZ90V)AY!WX*bLi=*Ny>AN!#*~~VAhI* zT52FOqs!@hI8*tJ4GX>pfhm+A`dwJK%*5$kc|HmQY7x9@%Bz5EFIP5^P)g80)fqFP zB$}8#@UsfL94fKF7%C*IepZ}4V;f;6Qi48^4U1$m*`UPp(9Mk+=}-i1{uJO4S>RIGw@H^-PPNk?mN*FxHH~a{b z_0ED%J$inj_0;$7v6k23?EjuiV6PxYFVRIm77NPDqfd^_$8O^f&DHbBG-4C0zy zErmY)#Le}gDCTb>onUBDrJBu%()N7rXXw)OT*umBo;B61N5Eo*dw6_%?LZarkF_z? ziMr#}aD4N7dwu~TdxU||Sf!G{$rYZJw9Z%cJn58|2eok~oF~|i9$nSBWzh3fyO?RO ziBA&MosWY5wg|moVD4>z)wnHDtX=|!BD!Op(}bXkyp+uA_l@}Lm7$fMO~3Tb!T2~c zZW_PJ_P}$iF!S?G~NwEESsbD0WuswdC-w~jjBc3{Bia?NVucq2g}xE#c$P5D!(-Q& z;P_ou<3I8plWxnmJvN*=@fWAee@t>TZx)poP0M_>`a~ge*%gEpadb7`!=n;&g~eG~ zutqoZ1IT9Tx2l~`R-%i;O987RR@etjJ8VNzC8kZ)so3L(LT8UYx??q|f^@QW9UlR4 zXBmxB4pbUrZLs0wvv;HVrAOfC_5IV*XC>QNy%UVYiLpmiUKLa7j$p58ZF?YoiDVcwYl;_=c^x`agQ?z?m@KiS|RWC)fc<{k2UVdS^Y(di}qY zk{(m}6+*?F5gOT8@l*7*`eSsI&|bJa@ap?O3$T_d->;rMddPJBi+@9_nWIJeo0@D> zBjO*KO11Y`+2&U|3cdGpJp7ce+px4eJXIean?V>5Y_Ia4plHqNVe6%KC3;T-z#-J} zV`k)4!v>(_V3DqbpV1BP|xiV<{JNq1O6LTY@Xh1PUoNGau!yEb5YD@V@xhc z0DG7?Ks?BGti$TT*MZ&8zY96E$oh7s4)#o+T4%SSLgi#`+;bwFubx_E&75w#x+41N zD7L7?7aaxo19s=AkOCk~mLVdWpm{K*)5?38-OAgTTR+_3eD^a4rLc4}VD>s^h!kLU zRP)>~*j(KwOdUFM!&t7czUn=yGqHl}u*|GmlF-V%;?z^NwVUrm-kug~nlVQ2o$D}Y zpS{gpVdA{}aCgYO=xID>FVy(8`bK{(I{8`GnAd$&h$h1c^Ih6aNB7vTJ9d|8#=qbU ztbyOmWZ@g@%L^_b;q_QY8D)L>j54yCo_-ofL4BHr=lSNHhPPhBa^sk zAC2J|bG6j%WxKh0jCa7`LsNbnqH_#xVTqXUW(#)f>s;NqUM1zzC#2xMxg0e(zS)ef zUINe+2y{ameBa;gW!w}j#>(RO`4ouKK3L&)nN;uWQp<72H3c*&5j zIkg&+DnTQU8Kn1H$M3wFF4c50H9b|Hwt(YEKu)&CryW1q<@BzPDN*tOvs`pE+_|Jc zv8+$F$rYDg;FvN+cK7n|u%XyF+`*lw8$!v0aw>f>%dnWKeTV?AIGswRvU?7sWP`O8 zEqFp1r^Mpt7x~YB3uR`rl!vEDrwG$L*OxF#3gw9I4_}0kM|`#)PDxz?%A`P`*~QNZ za%C?&r=7HVOH-$(r_=cNa_E!{SagmD4H#=i2Na&u)wQ+DdwWYWJ}Ir^l8n9`T&%NS zFKM`d(GeQTW7$%_)w<*TeWLl*@B8*lS}E(&rJ9O9<{VUR+0venKqb(kXi#a_0SU1wDt(YlA2{pvTtWFW56fQ zrIzBtIn7qQQKW+3ssgpD7P)|*L;PVgiz-T;lGF{J8V6uQXAr2%8*P*kL8fhMrBUh$ zHG$*RkrRO=VJLhCdwBvYgM^Np%jsI&S|z#jC?c;-WX(t_d)JW~m2qAJrU?|u1s=bq z$up?+1p26=*ESh>ykXOI?z~C4!|#)}C?8A}1+!`BFI*Kk%gl+SljO`cnh5J3SPb3Q z=O_IA=JZ5`C)}O!0%mnCO%YJfCXNJ`<0iCRU)qA9MWPcWmT@cZxAMHuT76L!DDY}~ zo?##fQyH|vqlF8anpHrpx)jBYfDOm#>z|SIaVliI`_z0E{5z86Vv$KW;vm|>-JgOzO&P!c94a1GS}9is>j zAs35k?K^&_nBD*r`)A9PiE=3d0bXm}qyXd+TZVjpkLzICVHXB-Xbn|ZH=9W!fdlt)}1qDY6s(5>6;0!^L z67KG%3*LF!;_=?Wg)#`99BD)VcYTzJBXKYL{_{U*4e+wXnJT3T-O5qp9kv92iCZmDrtPNssiJc?3; zT&y7U1O&UkoLhAsl7vXHG4v9$oZ|(L{jJTd-o;^{a6s9AXss6I)19negho=;X-k(y zZ4vZe*aC@dD0kzDtTWE;V}Zl2$W0b5Vw?^F=QFNEsdrx`3z*}8e?_sOrYj}4$Srw~ zp0nV*NS|s;jAY(?8b=0_O9F%YI69rmcHS}2$Rvldzh=XIaXPtL{HEy4RzL;~qjN(v zV}tw)pfTC8)s;b0m`6-FUYXXSt{nV;-c!4(lo7b1l#$wm#^02z-}r!WMHoYs@pq|w zHSoSMYzh#!Qwz3dftO`qQiFbR8FJ?8b!wN^$UKAtFvcH~Y{ zcCX8}?JM#-CnoGIT{=S>B?NeVS}zJPG^5?;F@#%RzW-1`DdaE@@0dJfLG>~Ra4jhX zpkl1>Rgt|t!+z`c_W$II0CC8T&F}GveaQt2n}WM_E$R&_rY29p*j@wy_Pybe`$4Aw z%3`pR+8Q^BEFqHP5@3hNF31$mPGu}g*q>KyVVl6}pJnA&44nFSuh#{ZzS26H5da5l zeCV_~jr;TFktX}Qj~Sz;Yq;lt(#;yh*W}ZDonR;wH!pZwkOUA3jRiFX*+^M-HA(i( zviy4+Ua&)McUd-mr!J{I_bZkf*4xQNJDJk4!wz}(>#G;yA|}j`<=X`C8F-?1@B;^M0h^w_%0tgZraW(>X;qk1`B zh1%tj6%2ELbuH8Zr`g`BHM$9W1C8g3#rGMv{=IWRWTeG}u^{*?t6z|czLabJ*Xifa z+5ElJiG9iXJi~VSq#yvu#%L?a`9EHW|I0>TwD^`02*lic{puAx5a@>;1O2ewKjtfd zE%(O+|HBx7{+}2F2IgKS9*4cC^1UKzJ1S)wVNl{Ilaj{I8V_HDILZoZ`K5gGlQ7xC z9T+ozokVnzQuLpmjsFeUUaw3_N`ie|cS$Y8U(4@}FY9r*#SiJ9*S_u8J$pC1$GaoN zcn71bsTB>l^z*b?=+1Xk=a(Q|hN4Z12j}nKHVCq>LnIQV z%A~l|Tp=Yk*51yKaXaPaWngfnvwc#M@!Q2C#RY>scxQ%MCf~qvt9(C9u}DctF_Q_S zwZ0g=A{narXIX#}ENGi4GT~hD0A4*oy$o#HtSEiaY6l?w;Uvu+xw*+Hsg!3?B9JWa zN8BtlL^myv5XBb03y>0NB^jBZuKTHFhG?A|TJG*z*?F`5z;=M3kXyiYiVeyJT=)ZK z3XqjKhja7tItyUeANKV)@zc2(qMiguxfq`zE*whF*W%{*cH&XIWIAc8Ht<;fmL;R} N`Zd_q*D7}&{15-?jobhL literal 0 HcmV?d00001 diff --git a/writeReadBack.png b/writeReadBack.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1bd8a4da5f7054088491d6b974be107f228621 GIT binary patch literal 41747 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 Date: Sun, 5 Nov 2017 16:16:54 -0500 Subject: [PATCH 5/5] added more to the writeup --- writeup.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/writeup.md b/writeup.md index 47f8735..b0f7418 100644 --- a/writeup.md +++ b/writeup.md @@ -25,3 +25,8 @@ The waveform from the SPI test for writing to the second memory address, then re ![waveform of SPI memory](writeRead2.png) The top trace is the spi clock, followed by the value in the shift register, the state (from the state machine), the memory address from the memory block, dataOut of the memory block, chip select, MOSI, and MISO. The first action is a write action, where the value 3 is written to address 78. Next, we read the value from address 5 (value is 9B), and finally, we read back the value from address 78. + +### Analysis and Reflection +Aside from logistical problems, I think this is a good lab, The SPI memory appears to work, and I think we have a good understanding of all of the parts of the system. We spent a lot of time before the midpoint deliverable understanding how the shift register worked and what all of the inputs meant, so I think we had a good idea of how the overall memory should work based on that. The only other part that was difficult from an understanding perspective was the timing of the actual SPI protocol. The picture in the lab description was very useful, and we pretty much used that as a reference to compare with GTKwave outputs. + +I think that the only thing we underestimated on our work plan was how long we would need to debug small problems in verilog relating to timing and overdriven variables. There were a few hours of just looking at GTKwave and finding timing bugs or unexpected outputs which we didn't account for.