From 46dc551e454aa34418872217ff40313984bc8370 Mon Sep 17 00:00:00 2001 From: Henry Rachootin Date: Mon, 23 Oct 2017 14:14:52 -0400 Subject: [PATCH 01/20] did the input conditioner, no test bench --- inputconditioner.t.v | 8 ++++++-- inputconditioner.v | 18 ++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/inputconditioner.t.v b/inputconditioner.t.v index 2814163..6dd1686 100644 --- a/inputconditioner.t.v +++ b/inputconditioner.t.v @@ -9,7 +9,7 @@ module testConditioner(); wire conditioned; wire rising; wire falling; - + inputconditioner dut(.clk(clk), .noisysignal(pin), .conditioned(conditioned), @@ -20,10 +20,14 @@ module testConditioner(); // Generate clock (50MHz) initial clk=0; always #10 clk=!clk; // 50MHz Clock - + initial begin // Your Test Code // Be sure to test each of the three conditioner functions: // Synchronization, Debouncing, Edge Detection + + + end + endmodule diff --git a/inputconditioner.v b/inputconditioner.v index 736a866..60c80d8 100644 --- a/inputconditioner.v +++ b/inputconditioner.v @@ -16,22 +16,32 @@ 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 synchronizer0 = 0; reg synchronizer1 = 0; - + always @(posedge clk ) begin if(conditioned == synchronizer1) counter <= 0; else begin if( counter == waittime) begin counter <= 0; - conditioned <= synchronizer1; + conditioned <= synchronizer1; + positiveedge <= (~conditioned) & synchronizer1; + negativeedge <= (~synchronizer1) & conditioned; end - else + else counter <= counter+1; end + + if(positiveedge) begin + positiveedge <= 0; + end + if(negativeedge) begin + negativeedge <= 0; + end + synchronizer0 <= noisysignal; synchronizer1 <= synchronizer0; end From 49773d45a69aee9f4e990b8b4e3082d1bb38ccf3 Mon Sep 17 00:00:00 2001 From: Henry Rachootin Date: Mon, 23 Oct 2017 16:40:11 -0400 Subject: [PATCH 02/20] made test cases for the input conditioner --- input | 269 ++++++++++++++++++++++++++++++++++++ inputconditioner.t.v | 86 ++++++++++-- inputconditioner.vcd | 316 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 663 insertions(+), 8 deletions(-) create mode 100755 input create mode 100644 inputconditioner.vcd diff --git a/input b/input new file mode 100755 index 0000000..b481dd3 --- /dev/null +++ b/input @@ -0,0 +1,269 @@ +#! /usr/local/bin/vvp +:ivl_version "0.10.0 (devel)" "(s20150513)"; +:ivl_delay_selection "TYPICAL"; +:vpi_time_precision + 0; +:vpi_module "system"; +:vpi_module "vhdl_sys"; +:vpi_module "v2005_math"; +:vpi_module "va_math"; +S_0x17656b0 .scope module, "testConditioner" "testConditioner" 2 6; + .timescale 0 0; +v0x178a580_0 .var "clk", 0 0; +v0x178a670_0 .net "conditioned", 0 0, v0x1789f20_0; 1 drivers +v0x178a740_0 .var "dutpassed", 0 0; +v0x178a810_0 .net "falling", 0 0, v0x178a0d0_0; 1 drivers +v0x178a8e0_0 .var "i", 31 0; +v0x178a9d0_0 .var "pin", 0 0; +v0x178aa70_0 .net "rising", 0 0, v0x178a2a0_0; 1 drivers +v0x178ab40_0 .var "shouldChange", 0 0; +E_0x176a070 .event negedge, v0x1789f20_0; +E_0x176a4f0 .event posedge, v0x1789f20_0; +E_0x176a330 .event edge, v0x1789f20_0; +S_0x1765830 .scope module, "dut" "inputconditioner" 2 17, 3 8 0, S_0x17656b0; + .timescale 0 0; + .port_info 0 /INPUT 1 "clk" + .port_info 1 /INPUT 1 "noisysignal" + .port_info 2 /OUTPUT 1 "conditioned" + .port_info 3 /OUTPUT 1 "positiveedge" + .port_info 4 /OUTPUT 1 "negativeedge" +P_0x1766600 .param/l "counterwidth" 0 3 17, +C4<00000000000000000000000000000011>; +P_0x1766640 .param/l "waittime" 0 3 18, +C4<00000000000000000000000000000011>; +v0x1769930_0 .net "clk", 0 0, v0x178a580_0; 1 drivers +v0x1789f20_0 .var "conditioned", 0 0; +v0x1789fe0_0 .var "counter", 2 0; +v0x178a0d0_0 .var "negativeedge", 0 0; +v0x178a190_0 .net "noisysignal", 0 0, v0x178a9d0_0; 1 drivers +v0x178a2a0_0 .var "positiveedge", 0 0; +v0x178a360_0 .var "synchronizer0", 0 0; +v0x178a420_0 .var "synchronizer1", 0 0; +E_0x1769f70 .event posedge, v0x1769930_0; + .scope S_0x1765830; +T_0 ; + %pushi/vec4 0, 0, 3; + %store/vec4 v0x1789fe0_0, 0, 3; + %end; + .thread T_0; + .scope S_0x1765830; +T_1 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a360_0, 0, 1; + %end; + .thread T_1; + .scope S_0x1765830; +T_2 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a420_0, 0, 1; + %end; + .thread T_2; + .scope S_0x1765830; +T_3 ; + %wait E_0x1769f70; + %load/vec4 v0x1789f20_0; + %load/vec4 v0x178a420_0; + %cmp/e; + %jmp/0xz T_3.0, 4; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x1789fe0_0, 0; + %jmp T_3.1; +T_3.0 ; + %load/vec4 v0x1789fe0_0; + %pad/u 32; + %cmpi/e 3, 0, 32; + %jmp/0xz T_3.2, 4; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x1789fe0_0, 0; + %load/vec4 v0x178a420_0; + %assign/vec4 v0x1789f20_0, 0; + %load/vec4 v0x1789f20_0; + %inv; + %load/vec4 v0x178a420_0; + %and; + %assign/vec4 v0x178a2a0_0, 0; + %load/vec4 v0x178a420_0; + %inv; + %load/vec4 v0x1789f20_0; + %and; + %assign/vec4 v0x178a0d0_0, 0; + %jmp T_3.3; +T_3.2 ; + %load/vec4 v0x1789fe0_0; + %addi 1, 0, 3; + %assign/vec4 v0x1789fe0_0, 0; +T_3.3 ; +T_3.1 ; + %load/vec4 v0x178a2a0_0; + %flag_set/vec4 8; + %jmp/0xz T_3.4, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x178a2a0_0, 0; +T_3.4 ; + %load/vec4 v0x178a0d0_0; + %flag_set/vec4 8; + %jmp/0xz T_3.6, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x178a0d0_0, 0; +T_3.6 ; + %load/vec4 v0x178a190_0; + %assign/vec4 v0x178a360_0, 0; + %load/vec4 v0x178a360_0; + %assign/vec4 v0x178a420_0, 0; + %jmp T_3; + .thread T_3; + .scope S_0x17656b0; +T_4 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a580_0, 0, 1; + %end; + .thread T_4; + .scope S_0x17656b0; +T_5 ; + %delay 10, 0; + %load/vec4 v0x178a580_0; + %nor/r; + %store/vec4 v0x178a580_0, 0, 1; + %jmp T_5; + .thread T_5; + .scope S_0x17656b0; +T_6 ; + %wait E_0x176a330; + %vpi_func 2 28 "$time" 64 {0 0 0}; + %pushi/vec4 20, 0, 64; + %mod; + %cmpi/ne 10, 0, 64; + %jmp/0xz T_6.0, 4; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a740_0, 0, 1; + %vpi_call 2 31 "$display", "synchronization failed %d", $time {0 0 0}; +T_6.0 ; + %load/vec4 v0x178ab40_0; + %nor/r; + %flag_set/vec4 8; + %jmp/0xz T_6.2, 8; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a740_0, 0, 1; + %vpi_call 2 35 "$display", "output changed too early on debounce test" {0 0 0}; +T_6.2 ; + %jmp T_6; + .thread T_6, $push; + .scope S_0x17656b0; +T_7 ; + %wait E_0x176a4f0; + %delay 1, 0; + %load/vec4 v0x178aa70_0; + %nor/r; + %flag_set/vec4 8; + %jmp/0xz T_7.0, 8; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a740_0, 0, 1; + %vpi_call 2 44 "$display", "positive edge missed" {0 0 0}; +T_7.0 ; + %delay 20, 0; + %load/vec4 v0x178aa70_0; + %flag_set/vec4 8; + %jmp/0xz T_7.2, 8; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a740_0, 0, 1; + %vpi_call 2 49 "$display", "positive edge pulsed too long" {0 0 0}; +T_7.2 ; + %jmp T_7; + .thread T_7; + .scope S_0x17656b0; +T_8 ; + %wait E_0x176a070; + %delay 1, 0; + %load/vec4 v0x178a810_0; + %nor/r; + %flag_set/vec4 8; + %jmp/0xz T_8.0, 8; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a740_0, 0, 1; + %vpi_call 2 57 "$display", "negative edge missed" {0 0 0}; +T_8.0 ; + %delay 20, 0; + %load/vec4 v0x178aa70_0; + %flag_set/vec4 8; + %jmp/0xz T_8.2, 8; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a740_0, 0, 1; + %vpi_call 2 62 "$display", "negative edge pulsed too long" {0 0 0}; +T_8.2 ; + %jmp T_8; + .thread T_8; + .scope S_0x17656b0; +T_9 ; + %vpi_call 2 67 "$dumpfile", "inputconditioner.vcd" {0 0 0}; + %vpi_call 2 68 "$dumpvars", 32'sb00000000000000000000000000000000, S_0x17656b0 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x178a740_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x178ab40_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a9d0_0, 0, 1; + %delay 200, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a9d0_0, 0, 1; + %delay 5, 0; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x178a9d0_0, 0, 1; + %delay 200, 0; + %load/vec4 v0x178a670_0; + %pad/u 32; + %cmpi/ne 1, 0, 32; + %jmp/0xz T_9.0, 4; + %vpi_call 2 76 "$display", "output did not change on on synchronization test" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a740_0, 0, 1; +T_9.0 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a9d0_0, 0, 1; + %delay 200, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178ab40_0, 0, 1; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x178a8e0_0, 0, 32; +T_9.2 ; + %load/vec4 v0x178a8e0_0; + %cmpi/u 4, 0, 32; + %jmp/0xz T_9.3, 5; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x178a9d0_0, 0, 1; + %delay 7, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a9d0_0, 0, 1; + %delay 3, 0; + %load/vec4 v0x178a8e0_0; + %addi 1, 0, 32; + %store/vec4 v0x178a8e0_0, 0, 32; + %jmp T_9.2; +T_9.3 ; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x178ab40_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x178a9d0_0, 0, 1; + %delay 300, 0; + %load/vec4 v0x178a670_0; + %pad/u 32; + %cmpi/ne 1, 0, 32; + %jmp/0xz T_9.4, 4; + %vpi_call 2 89 "$display", "output did not change on on debounce test" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x178a740_0, 0, 1; +T_9.4 ; + %load/vec4 v0x178a740_0; + %flag_set/vec4 8; + %jmp/0xz T_9.6, 8; + %vpi_call 2 94 "$display", "DUT passed" {0 0 0}; + %jmp T_9.7; +T_9.6 ; + %vpi_call 2 97 "$display", "DUT failed" {0 0 0}; +T_9.7 ; + %delay 100, 0; + %vpi_call 2 101 "$finish" {0 0 0}; + %end; + .thread T_9; +# The file index is used to find the file name in the following table. +:file_names 4; + "N/A"; + ""; + "inputconditioner.t.v"; + "./inputconditioner.v"; diff --git a/inputconditioner.t.v b/inputconditioner.t.v index 6dd1686..e0879ba 100644 --- a/inputconditioner.t.v +++ b/inputconditioner.t.v @@ -1,6 +1,7 @@ //------------------------------------------------------------------------ // Input Conditioner test bench //------------------------------------------------------------------------ +`include "inputconditioner.v" module testConditioner(); @@ -9,25 +10,94 @@ module testConditioner(); wire conditioned; wire rising; wire falling; + reg dutpassed; + reg shouldChange; + reg[31:0] i; inputconditioner dut(.clk(clk), .noisysignal(pin), .conditioned(conditioned), .positiveedge(rising), - .negativeedge(falling)) - + .negativeedge(falling)); // Generate clock (50MHz) - initial clk=0; + initial clk = 0; always #10 clk=!clk; // 50MHz Clock - initial begin - // Your Test Code - // Be sure to test each of the three conditioner functions: - // Synchronization, Debouncing, Edge Detection - + always @ (conditioned) begin + if($time%20 != 10) begin + //synchronization test + dutpassed = 0; + $display("synchronization failed %d",$time); + end + if(!shouldChange) begin + dutpassed = 0; + $display("output changed too early on debounce test"); + end + end + //edge detection + always @(posedge conditioned) begin + #1; + if(!rising) begin + dutpassed = 0; + $display("positive edge missed"); + end + #20; + if(rising) begin + dutpassed = 0; + $display("positive edge pulsed too long"); + end + end + + always @(negedge conditioned) begin + #1; + if(!falling) begin + dutpassed = 0; + $display("negative edge missed"); + end + #20; + if(rising) begin + dutpassed = 0; + $display("negative edge pulsed too long"); + end + end + initial begin + $dumpfile("inputconditioner.vcd"); + $dumpvars(0, testConditioner); + dutpassed = 1; + shouldChange = 1; + pin = 0; #200; + // Synchronization: + pin = 0; #5; + pin = 1; #200; + if(conditioned != 1) begin + $display("output did not change on on synchronization test"); + dutpassed = 0; + end + pin = 0; #200; + //Debounces + shouldChange = 0; + for(i = 0; i<4; i = i + 1) begin + pin = 1; #7; + pin = 0; #3; + end + shouldChange = 1; + pin = 1; #300; + if(conditioned != 1) begin + $display("output did not change on on debounce test"); + dutpassed = 0; end + if(dutpassed) begin + $display("DUT passed"); + end + else begin + $display("DUT failed"); + end + + #100; + $finish(); + end endmodule diff --git a/inputconditioner.vcd b/inputconditioner.vcd new file mode 100644 index 0000000..a3d1f32 --- /dev/null +++ b/inputconditioner.vcd @@ -0,0 +1,316 @@ +$date + Mon Oct 23 16:35:11 2017 +$end +$version + Icarus Verilog +$end +$timescale + 1s +$end +$scope module testConditioner $end +$var wire 1 ! rising $end +$var wire 1 " falling $end +$var wire 1 # conditioned $end +$var reg 1 $ clk $end +$var reg 1 % dutpassed $end +$var reg 32 & i [31:0] $end +$var reg 1 ' pin $end +$var reg 1 ( shouldChange $end +$scope module dut $end +$var wire 1 $ clk $end +$var wire 1 ' noisysignal $end +$var reg 1 # conditioned $end +$var reg 3 ) counter [2:0] $end +$var reg 1 " negativeedge $end +$var reg 1 ! positiveedge $end +$var reg 1 * synchronizer0 $end +$var reg 1 + synchronizer1 $end +$upscope $end +$upscope $end +$enddefinitions $end +#0 +$dumpvars +0+ +0* +b0 ) +1( +0' +bx & +1% +0$ +x# +x" +x! +$end +#10 +b1 ) +1$ +#20 +0$ +#30 +b10 ) +1$ +#40 +0$ +#50 +b11 ) +1$ +#60 +0$ +#70 +0! +0# +b0 ) +1$ +#80 +0$ +#90 +1$ +#100 +0$ +#110 +1$ +#120 +0$ +#130 +1$ +#140 +0$ +#150 +1$ +#160 +0$ +#170 +1$ +#180 +0$ +#190 +1$ +#200 +0$ +#205 +1' +#210 +1* +1$ +#220 +0$ +#230 +1+ +1$ +#240 +0$ +#250 +b1 ) +1$ +#260 +0$ +#270 +b10 ) +1$ +#280 +0$ +#290 +b11 ) +1$ +#300 +0$ +#310 +0" +1! +1# +b0 ) +1$ +#320 +0$ +#330 +0! +1$ +#340 +0$ +#350 +1$ +#360 +0$ +#370 +1$ +#380 +0$ +#390 +1$ +#400 +0$ +#405 +0' +#410 +0* +1$ +#420 +0$ +#430 +0+ +1$ +#440 +0$ +#450 +b1 ) +1$ +#460 +0$ +#470 +b10 ) +1$ +#480 +0$ +#490 +b11 ) +1$ +#500 +0$ +#510 +1" +0# +b0 ) +1$ +#520 +0$ +#530 +0" +1$ +#540 +0$ +#550 +1$ +#560 +0$ +#570 +1$ +#580 +0$ +#590 +1$ +#600 +0$ +#605 +1' +b0 & +0( +#610 +1* +1$ +#612 +0' +#615 +1' +b1 & +#620 +0$ +#622 +0' +#625 +1' +b10 & +#630 +1+ +1$ +#632 +0' +#635 +1' +b11 & +#640 +0$ +#642 +0' +#645 +1' +1( +b100 & +#650 +b1 ) +1$ +#660 +0$ +#670 +b10 ) +1$ +#680 +0$ +#690 +b11 ) +1$ +#700 +0$ +#710 +1! +1# +b0 ) +1$ +#720 +0$ +#730 +0! +1$ +#740 +0$ +#750 +1$ +#760 +0$ +#770 +1$ +#780 +0$ +#790 +1$ +#800 +0$ +#810 +1$ +#820 +0$ +#830 +1$ +#840 +0$ +#850 +1$ +#860 +0$ +#870 +1$ +#880 +0$ +#890 +1$ +#900 +0$ +#910 +1$ +#920 +0$ +#930 +1$ +#940 +0$ +#950 +1$ +#960 +0$ +#970 +1$ +#980 +0$ +#990 +1$ +#1000 +0$ +#1010 +1$ +#1020 +0$ +#1030 +1$ +#1040 +0$ +#1045 From a372e69dc6923d0bfab9eac0e58e27464b6a4295 Mon Sep 17 00:00:00 2001 From: TShapinsky Date: Mon, 23 Oct 2017 19:52:18 -0400 Subject: [PATCH 03/20] Create work_plan.txt --- work_plan.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 work_plan.txt diff --git a/work_plan.txt b/work_plan.txt new file mode 100644 index 0000000..98de84b --- /dev/null +++ b/work_plan.txt @@ -0,0 +1,6 @@ +Input Conditioner (10/23) (1.5 hrs) +Shift Register (10/24) (2 hrs) +FPGA (10/24) (3 hrs) +Midpoint Checkin (10/25) +SPI Memory Integration (10/31) (5 hrs) +Writeup (11/1) (4 - 5 hrs) From 10d7dbbbd01fa5d7b7882416ba1117df0abbd49f Mon Sep 17 00:00:00 2001 From: Tobias Shapinsky Date: Tue, 24 Oct 2017 11:04:59 -0400 Subject: [PATCH 04/20] defined shift-register --- shiftregister.v | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/shiftregister.v b/shiftregister.v index b4ec057..43b956d 100644 --- a/shiftregister.v +++ b/shiftregister.v @@ -14,12 +14,19 @@ 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; always @(posedge clk) begin - // Your Code Here + if(parallelLoad) + shiftregistermem <= parallelDataIn; + else begin + shiftregistermem <= {shiftregistermem[width-2:0],serialDataIn}; + end + serialDataOut <= shiftregistermem[width-1]; + parallelDataOut <= shiftregistermem; + end endmodule From 9af0dc680cba04ee05450d8d444859765eb64619 Mon Sep 17 00:00:00 2001 From: Henry Rachootin Date: Tue, 24 Oct 2017 11:33:55 -0400 Subject: [PATCH 05/20] made a test bench, fixed the shift resgister --- shift | 274 ++++++++++++++++++++++++++++++++++++++++++++++ shift.vcd | 141 ++++++++++++++++++++++++ shiftregister.t.v | 97 ++++++++++++++-- shiftregister.v | 20 ++-- 4 files changed, 511 insertions(+), 21 deletions(-) create mode 100755 shift create mode 100644 shift.vcd diff --git a/shift b/shift new file mode 100755 index 0000000..d9d494b --- /dev/null +++ b/shift @@ -0,0 +1,274 @@ +#! /usr/local/bin/vvp +:ivl_version "0.10.0 (devel)" "(s20150513)"; +:ivl_delay_selection "TYPICAL"; +:vpi_time_precision + 0; +:vpi_module "system"; +:vpi_module "vhdl_sys"; +:vpi_module "v2005_math"; +:vpi_module "va_math"; +S_0x267cc60 .scope module, "testshiftregister" "testshiftregister" 2 6; + .timescale 0 0; +v0x26c4b20_0 .var "clk", 0 0; +v0x26c4be0_0 .var "dutpassed", 0 0; +v0x26c4c80_0 .var "parallelDataIn", 7 0; +v0x26c4d80_0 .net "parallelDataOut", 7 0, L_0x26c51b0; 1 drivers +v0x26c4e50_0 .var "parallelLoad", 0 0; +v0x26c4f40_0 .var "peripheralClkEdge", 0 0; +v0x26c5010_0 .var "serialDataIn", 0 0; +v0x26c50e0_0 .net "serialDataOut", 0 0, L_0x26c5270; 1 drivers +S_0x26a1540 .scope module, "dut" "shiftregister" 2 17, 3 9 0, S_0x267cc60; + .timescale 0 0; + .port_info 0 /INPUT 1 "clk" + .port_info 1 /INPUT 1 "peripheralClkEdge" + .port_info 2 /INPUT 1 "parallelLoad" + .port_info 3 /INPUT 8 "parallelDataIn" + .port_info 4 /INPUT 1 "serialDataIn" + .port_info 5 /OUTPUT 8 "parallelDataOut" + .port_info 6 /OUTPUT 1 "serialDataOut" +P_0x26a1710 .param/l "width" 0 3 10, +C4<00000000000000000000000000001000>; +L_0x26c51b0 .functor BUFZ 8, v0x26c4920_0, C4<00000000>, C4<00000000>, C4<00000000>; +v0x26a17b0_0 .net "clk", 0 0, v0x26c4b20_0; 1 drivers +v0x26c4400_0 .net "parallelDataIn", 7 0, v0x26c4c80_0; 1 drivers +v0x26c44e0_0 .net "parallelDataOut", 7 0, L_0x26c51b0; alias, 1 drivers +v0x26c45d0_0 .net "parallelLoad", 0 0, v0x26c4e50_0; 1 drivers +v0x26c4690_0 .net "peripheralClkEdge", 0 0, v0x26c4f40_0; 1 drivers +v0x26c47a0_0 .net "serialDataIn", 0 0, v0x26c5010_0; 1 drivers +v0x26c4860_0 .net "serialDataOut", 0 0, L_0x26c5270; alias, 1 drivers +v0x26c4920_0 .var "shiftregistermem", 7 0; +E_0x26a2b70 .event posedge, v0x26a17b0_0; +L_0x26c5270 .part v0x26c4920_0, 7, 1; + .scope S_0x26a1540; +T_0 ; + %wait E_0x26a2b70; + %load/vec4 v0x26c45d0_0; + %flag_set/vec4 8; + %jmp/0xz T_0.0, 8; + %load/vec4 v0x26c4400_0; + %assign/vec4 v0x26c4920_0, 0; + %jmp T_0.1; +T_0.0 ; + %load/vec4 v0x26c4920_0; + %parti/s 7, 0, 2; + %load/vec4 v0x26c47a0_0; + %concat/vec4; draw_concat_vec4 + %assign/vec4 v0x26c4920_0, 0; +T_0.1 ; + %jmp T_0; + .thread T_0; + .scope S_0x267cc60; +T_1 ; + %vpi_call 2 27 "$dumpfile", "shift.vcd" {0 0 0}; + %vpi_call 2 28 "$dumpvars", 32'sb00000000000000000000000000000000, S_0x267cc60 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4be0_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 8; + %store/vec4 v0x26c4c80_0, 0, 8; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4e50_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %load/vec4 v0x26c4d80_0; + %cmpi/ne 0, 0, 8; + %flag_mov 8, 4; + %load/vec4 v0x26c4d80_0; + %xor/r; + %cmpi/e 1, 1, 1; + %flag_or 6, 8; + %jmp/0xz T_1.0, 6; + %vpi_call 2 37 "$display", "initialization failed, parallel" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4be0_0, 0, 1; +T_1.0 ; + %load/vec4 v0x26c50e0_0; + %pad/u 32; + %cmpi/ne 0, 0, 32; + %flag_mov 8, 4; + %load/vec4 v0x26c50e0_0; + %cmpi/e 1, 1, 1; + %flag_or 6, 8; + %jmp/0xz T_1.2, 6; + %vpi_call 2 41 "$display", "initialization failed, serial" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4be0_0, 0, 1; +T_1.2 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4e50_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c5010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c5010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c5010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c5010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c5010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c5010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c5010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c5010_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %load/vec4 v0x26c4d80_0; + %cmpi/ne 202, 0, 8; + %flag_mov 8, 4; + %load/vec4 v0x26c4d80_0; + %xor/r; + %cmpi/e 1, 1, 1; + %flag_or 6, 8; + %jmp/0xz T_1.4, 6; + %vpi_call 2 64 "$display", "Serial in failed, parallel" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4be0_0, 0, 1; +T_1.4 ; + %load/vec4 v0x26c50e0_0; + %pad/u 32; + %cmpi/ne 1, 0, 32; + %flag_mov 8, 4; + %load/vec4 v0x26c50e0_0; + %cmpi/e 1, 1, 1; + %flag_or 6, 8; + %jmp/0xz T_1.6, 6; + %vpi_call 2 68 "$display", "Serial in failed, serial" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4be0_0, 0, 1; +T_1.6 ; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4e50_0, 0, 1; + %pushi/vec4 83, 0, 8; + %store/vec4 v0x26c4c80_0, 0, 8; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %load/vec4 v0x26c4d80_0; + %cmpi/ne 83, 0, 8; + %flag_mov 8, 4; + %load/vec4 v0x26c4d80_0; + %xor/r; + %cmpi/e 1, 1, 1; + %flag_or 6, 8; + %jmp/0xz T_1.8, 6; + %vpi_call 2 77 "$display", "Parallel in failed, parallel" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4be0_0, 0, 1; +T_1.8 ; + %load/vec4 v0x26c50e0_0; + %pad/u 32; + %cmpi/ne 0, 0, 32; + %flag_mov 8, 4; + %load/vec4 v0x26c50e0_0; + %cmpi/e 1, 1, 1; + %flag_or 6, 8; + %jmp/0xz T_1.10, 6; + %vpi_call 2 81 "$display", "Parallel in failed, serial" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4be0_0, 0, 1; +T_1.10 ; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4e50_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c5010_0, 0, 1; + %pushi/vec4 255, 0, 8; + %store/vec4 v0x26c4c80_0, 0, 8; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4b20_0, 0, 1; + %delay 5, 0; + %load/vec4 v0x26c4d80_0; + %cmpi/ne 255, 0, 8; + %flag_mov 8, 4; + %load/vec4 v0x26c4d80_0; + %xor/r; + %cmpi/e 1, 1, 1; + %flag_or 6, 8; + %jmp/0xz T_1.12, 6; + %vpi_call 2 91 "$display", "Same time in failed, parallel" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4be0_0, 0, 1; +T_1.12 ; + %load/vec4 v0x26c50e0_0; + %pad/u 32; + %cmpi/ne 1, 0, 32; + %flag_mov 8, 4; + %load/vec4 v0x26c50e0_0; + %cmpi/e 1, 1, 1; + %flag_or 6, 8; + %jmp/0xz T_1.14, 6; + %vpi_call 2 95 "$display", "Same time in failed, serial" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x26c4be0_0, 0, 1; +T_1.14 ; + %load/vec4 v0x26c4be0_0; + %flag_set/vec4 8; + %jmp/0xz T_1.16, 8; + %vpi_call 2 100 "$display", "DUT passed!" {0 0 0}; +T_1.16 ; + %vpi_call 2 102 "$finish" {0 0 0}; + %end; + .thread T_1; +# The file index is used to find the file name in the following table. +:file_names 4; + "N/A"; + ""; + "shiftregister.t.v"; + "./shiftregister.v"; diff --git a/shift.vcd b/shift.vcd new file mode 100644 index 0000000..03adba6 --- /dev/null +++ b/shift.vcd @@ -0,0 +1,141 @@ +$date + Tue Oct 24 11:28:11 2017 +$end +$version + Icarus Verilog +$end +$timescale + 1s +$end +$scope module testshiftregister $end +$var wire 1 ! serialDataOut $end +$var wire 8 " parallelDataOut [7:0] $end +$var reg 1 # clk $end +$var reg 1 $ dutpassed $end +$var reg 8 % parallelDataIn [7:0] $end +$var reg 1 & parallelLoad $end +$var reg 1 ' peripheralClkEdge $end +$var reg 1 ( serialDataIn $end +$scope module dut $end +$var wire 1 # clk $end +$var wire 8 ) parallelDataIn [7:0] $end +$var wire 8 * parallelDataOut [7:0] $end +$var wire 1 & parallelLoad $end +$var wire 1 ' peripheralClkEdge $end +$var wire 1 ( serialDataIn $end +$var wire 1 ! serialDataOut $end +$var reg 8 + shiftregistermem [7:0] $end +$upscope $end +$upscope $end +$enddefinitions $end +#0 +$dumpvars +bx + +bx * +bx ) +x( +x' +x& +bx % +1$ +0# +bx " +x! +$end +#5 +0! +b0 " +b0 * +b0 + +1# +1& +b0 % +b0 ) +#10 +0# +#15 +b1 " +b1 * +b1 + +1# +1( +0& +#20 +0# +#25 +b11 " +b11 * +b11 + +1# +#30 +0# +#35 +b110 " +b110 * +b110 + +1# +0( +#40 +0# +#45 +b1100 " +b1100 * +b1100 + +1# +#50 +0# +#55 +b11001 " +b11001 * +b11001 + +1# +1( +#60 +0# +#65 +b110010 " +b110010 * +b110010 + +1# +0( +#70 +0# +#75 +b1100101 " +b1100101 * +b1100101 + +1# +1( +#80 +0# +#85 +1! +b11001010 " +b11001010 * +b11001010 + +1# +0( +#90 +0# +#95 +0! +b1010011 " +b1010011 * +b1010011 + +1# +b1010011 % +b1010011 ) +1& +#100 +0# +#105 +1! +b11111111 " +b11111111 * +b11111111 + +1# +b11111111 % +b11111111 ) +#110 +0# +#115 diff --git a/shiftregister.t.v b/shiftregister.t.v index abe5b48..b639aa8 100644 --- a/shiftregister.t.v +++ b/shiftregister.t.v @@ -1,3 +1,4 @@ +`include "shiftregister.v" //------------------------------------------------------------------------ // Shift Register test bench //------------------------------------------------------------------------ @@ -10,20 +11,94 @@ module testshiftregister(); wire[7:0] parallelDataOut; wire serialDataOut; reg[7:0] parallelDataIn; - reg serialDataIn; - + reg serialDataIn; + // Instantiate with parameter width = 8 - shiftregister #(8) dut(.clk(clk), + shiftregister #(8) dut(.clk(clk), .peripheralClkEdge(peripheralClkEdge), - .parallelLoad(parallelLoad), - .parallelDataIn(parallelDataIn), - .serialDataIn(serialDataIn), - .parallelDataOut(parallelDataOut), + .parallelLoad(parallelLoad), + .parallelDataIn(parallelDataIn), + .serialDataIn(serialDataIn), + .parallelDataOut(parallelDataOut), .serialDataOut(serialDataOut)); - + reg dutpassed; + initial begin - // Your Test Code - end + $dumpfile("shift.vcd"); + $dumpvars(0, testshiftregister); + //initialize + dutpassed = 1; + clk = 0; #5; + parallelDataIn = 8'd0; + parallelLoad = 1; + clk = 1; #5; + clk = 0; #5; + if(parallelDataOut != 8'd0 || ^parallelDataOut === 1'bx) begin + $display("initialization failed, parallel"); + dutpassed = 0; + end + if(serialDataOut != 0 || serialDataOut === 1'bx) begin + $display("initialization failed, serial"); + dutpassed = 0; + end -endmodule + //serialLoad some bits + parallelLoad = 0; + serialDataIn = 1; + clk = 1; #5; clk = 0; #5; + serialDataIn = 1; + clk = 1; #5; clk = 0; #5; + serialDataIn = 0; + clk = 1; #5; clk = 0; #5; + serialDataIn = 0; + clk = 1; #5; clk = 0; #5; + serialDataIn = 1; + clk = 1; #5; clk = 0; #5; + serialDataIn = 0; + clk = 1; #5; clk = 0; #5; + serialDataIn = 1; + clk = 1; #5; clk = 0; #5; + serialDataIn = 0; + clk = 1; #5; clk = 0; #5; + if(parallelDataOut != 8'b11001010 || ^parallelDataOut === 1'bx) begin + $display("Serial in failed, parallel"); + dutpassed = 0; + end + if(serialDataOut != 1 || serialDataOut === 1'bx) begin + $display("Serial in failed, serial"); + dutpassed = 0; + end + //parallelLoad some bits + parallelLoad = 1; + parallelDataIn = 8'b01010011; + clk = 1; #5; clk = 0; #5; + if(parallelDataOut != 8'b01010011 || ^parallelDataOut === 1'bx) begin + $display("Parallel in failed, parallel"); + dutpassed = 0; + end + if(serialDataOut != 0 || serialDataOut === 1'bx) begin + $display("Parallel in failed, serial"); + dutpassed = 0; + end + + //parallel and serial at the same time + parallelLoad = 1; + serialDataIn = 0; + parallelDataIn = 8'b11111111; + clk = 1; #5; clk = 0; #5; + if(parallelDataOut != 8'b11111111 || ^parallelDataOut === 1'bx) begin + $display("Same time in failed, parallel"); + dutpassed = 0; + end + if(serialDataOut != 1 || serialDataOut === 1'bx) begin + $display("Same time in failed, serial"); + dutpassed = 0; + end + + if(dutpassed) begin + $display("DUT passed!"); + end + $finish(); + end +endmodule diff --git a/shiftregister.v b/shiftregister.v index 43b956d..1b234ab 100644 --- a/shiftregister.v +++ b/shiftregister.v @@ -14,19 +14,19 @@ 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 reg [width-1:0] parallelDataOut, // Shift reg data contents -output reg serialDataOut // Positive edge synchronized +output [width-1:0] parallelDataOut, // Shift reg data contents +output serialDataOut // Positive edge synchronized ); reg [width-1:0] shiftregistermem; always @(posedge clk) begin - if(parallelLoad) - shiftregistermem <= parallelDataIn; - else begin - shiftregistermem <= {shiftregistermem[width-2:0],serialDataIn}; - end - serialDataOut <= shiftregistermem[width-1]; - parallelDataOut <= shiftregistermem; - + if(parallelLoad) + shiftregistermem <= parallelDataIn; + else begin + shiftregistermem <= {shiftregistermem[width-2:0],serialDataIn}; + end end + + assign parallelDataOut = shiftregistermem; + assign serialDataOut = shiftregistermem[width-1]; endmodule From 6e3b7d70a9c1dba525344664ee877f7d851b267c Mon Sep 17 00:00:00 2001 From: Henry Rachootin Date: Tue, 24 Oct 2017 11:38:26 -0400 Subject: [PATCH 06/20] made the peripheral clock edge do something --- shift | 226 ++++++++++++++++++++++++---------------------- shift.vcd | 4 +- shiftregister.t.v | 1 + shiftregister.v | 12 ++- 4 files changed, 126 insertions(+), 117 deletions(-) diff --git a/shift b/shift index d9d494b..4c84dca 100755 --- a/shift +++ b/shift @@ -6,17 +6,17 @@ :vpi_module "vhdl_sys"; :vpi_module "v2005_math"; :vpi_module "va_math"; -S_0x267cc60 .scope module, "testshiftregister" "testshiftregister" 2 6; +S_0xbe9c60 .scope module, "testshiftregister" "testshiftregister" 2 6; .timescale 0 0; -v0x26c4b20_0 .var "clk", 0 0; -v0x26c4be0_0 .var "dutpassed", 0 0; -v0x26c4c80_0 .var "parallelDataIn", 7 0; -v0x26c4d80_0 .net "parallelDataOut", 7 0, L_0x26c51b0; 1 drivers -v0x26c4e50_0 .var "parallelLoad", 0 0; -v0x26c4f40_0 .var "peripheralClkEdge", 0 0; -v0x26c5010_0 .var "serialDataIn", 0 0; -v0x26c50e0_0 .net "serialDataOut", 0 0, L_0x26c5270; 1 drivers -S_0x26a1540 .scope module, "dut" "shiftregister" 2 17, 3 9 0, S_0x267cc60; +v0xc321e0_0 .var "clk", 0 0; +v0xc322a0_0 .var "dutpassed", 0 0; +v0xc32340_0 .var "parallelDataIn", 7 0; +v0xc32440_0 .net "parallelDataOut", 7 0, L_0xc32870; 1 drivers +v0xc32510_0 .var "parallelLoad", 0 0; +v0xc32600_0 .var "peripheralClkEdge", 0 0; +v0xc326d0_0 .var "serialDataIn", 0 0; +v0xc327a0_0 .net "serialDataOut", 0 0, L_0xc32930; 1 drivers +S_0xc0e880 .scope module, "dut" "shiftregister" 2 17, 3 9 0, S_0xbe9c60; .timescale 0 0; .port_info 0 /INPUT 1 "clk" .port_info 1 /INPUT 1 "peripheralClkEdge" @@ -25,245 +25,251 @@ S_0x26a1540 .scope module, "dut" "shiftregister" 2 17, 3 9 0, S_0x267cc60; .port_info 4 /INPUT 1 "serialDataIn" .port_info 5 /OUTPUT 8 "parallelDataOut" .port_info 6 /OUTPUT 1 "serialDataOut" -P_0x26a1710 .param/l "width" 0 3 10, +C4<00000000000000000000000000001000>; -L_0x26c51b0 .functor BUFZ 8, v0x26c4920_0, C4<00000000>, C4<00000000>, C4<00000000>; -v0x26a17b0_0 .net "clk", 0 0, v0x26c4b20_0; 1 drivers -v0x26c4400_0 .net "parallelDataIn", 7 0, v0x26c4c80_0; 1 drivers -v0x26c44e0_0 .net "parallelDataOut", 7 0, L_0x26c51b0; alias, 1 drivers -v0x26c45d0_0 .net "parallelLoad", 0 0, v0x26c4e50_0; 1 drivers -v0x26c4690_0 .net "peripheralClkEdge", 0 0, v0x26c4f40_0; 1 drivers -v0x26c47a0_0 .net "serialDataIn", 0 0, v0x26c5010_0; 1 drivers -v0x26c4860_0 .net "serialDataOut", 0 0, L_0x26c5270; alias, 1 drivers -v0x26c4920_0 .var "shiftregistermem", 7 0; -E_0x26a2b70 .event posedge, v0x26a17b0_0; -L_0x26c5270 .part v0x26c4920_0, 7, 1; - .scope S_0x26a1540; +P_0xc0ea50 .param/l "width" 0 3 10, +C4<00000000000000000000000000001000>; +L_0xc32870 .functor BUFZ 8, v0xc31fe0_0, C4<00000000>, C4<00000000>, C4<00000000>; +v0xc0eaf0_0 .net "clk", 0 0, v0xc321e0_0; 1 drivers +v0xc31ac0_0 .net "parallelDataIn", 7 0, v0xc32340_0; 1 drivers +v0xc31ba0_0 .net "parallelDataOut", 7 0, L_0xc32870; alias, 1 drivers +v0xc31c90_0 .net "parallelLoad", 0 0, v0xc32510_0; 1 drivers +v0xc31d50_0 .net "peripheralClkEdge", 0 0, v0xc32600_0; 1 drivers +v0xc31e60_0 .net "serialDataIn", 0 0, v0xc326d0_0; 1 drivers +v0xc31f20_0 .net "serialDataOut", 0 0, L_0xc32930; alias, 1 drivers +v0xc31fe0_0 .var "shiftregistermem", 7 0; +E_0xc0feb0 .event posedge, v0xc0eaf0_0; +L_0xc32930 .part v0xc31fe0_0, 7, 1; + .scope S_0xc0e880; T_0 ; - %wait E_0x26a2b70; - %load/vec4 v0x26c45d0_0; + %wait E_0xc0feb0; + %load/vec4 v0xc31d50_0; %flag_set/vec4 8; %jmp/0xz T_0.0, 8; - %load/vec4 v0x26c4400_0; - %assign/vec4 v0x26c4920_0, 0; - %jmp T_0.1; -T_0.0 ; - %load/vec4 v0x26c4920_0; + %load/vec4 v0xc31c90_0; + %flag_set/vec4 8; + %jmp/0xz T_0.2, 8; + %load/vec4 v0xc31ac0_0; + %assign/vec4 v0xc31fe0_0, 0; + %jmp T_0.3; +T_0.2 ; + %load/vec4 v0xc31fe0_0; %parti/s 7, 0, 2; - %load/vec4 v0x26c47a0_0; + %load/vec4 v0xc31e60_0; %concat/vec4; draw_concat_vec4 - %assign/vec4 v0x26c4920_0, 0; -T_0.1 ; + %assign/vec4 v0xc31fe0_0, 0; +T_0.3 ; +T_0.0 ; %jmp T_0; .thread T_0; - .scope S_0x267cc60; + .scope S_0xbe9c60; T_1 ; %vpi_call 2 27 "$dumpfile", "shift.vcd" {0 0 0}; - %vpi_call 2 28 "$dumpvars", 32'sb00000000000000000000000000000000, S_0x267cc60 {0 0 0}; + %vpi_call 2 28 "$dumpvars", 32'sb00000000000000000000000000000000, S_0xbe9c60 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0xc322a0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4be0_0, 0, 1; + %store/vec4 v0xc32600_0, 0, 1; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 8; - %store/vec4 v0x26c4c80_0, 0, 8; + %store/vec4 v0xc32340_0, 0, 8; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4e50_0, 0, 1; + %store/vec4 v0xc32510_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; - %load/vec4 v0x26c4d80_0; + %load/vec4 v0xc32440_0; %cmpi/ne 0, 0, 8; %flag_mov 8, 4; - %load/vec4 v0x26c4d80_0; + %load/vec4 v0xc32440_0; %xor/r; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.0, 6; - %vpi_call 2 37 "$display", "initialization failed, parallel" {0 0 0}; + %vpi_call 2 38 "$display", "initialization failed, parallel" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4be0_0, 0, 1; + %store/vec4 v0xc322a0_0, 0, 1; T_1.0 ; - %load/vec4 v0x26c50e0_0; + %load/vec4 v0xc327a0_0; %pad/u 32; %cmpi/ne 0, 0, 32; %flag_mov 8, 4; - %load/vec4 v0x26c50e0_0; + %load/vec4 v0xc327a0_0; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.2, 6; - %vpi_call 2 41 "$display", "initialization failed, serial" {0 0 0}; + %vpi_call 2 42 "$display", "initialization failed, serial" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4be0_0, 0, 1; + %store/vec4 v0xc322a0_0, 0, 1; T_1.2 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4e50_0, 0, 1; + %store/vec4 v0xc32510_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c5010_0, 0, 1; + %store/vec4 v0xc326d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c5010_0, 0, 1; + %store/vec4 v0xc326d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c5010_0, 0, 1; + %store/vec4 v0xc326d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c5010_0, 0, 1; + %store/vec4 v0xc326d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c5010_0, 0, 1; + %store/vec4 v0xc326d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c5010_0, 0, 1; + %store/vec4 v0xc326d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c5010_0, 0, 1; + %store/vec4 v0xc326d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c5010_0, 0, 1; + %store/vec4 v0xc326d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; - %load/vec4 v0x26c4d80_0; + %load/vec4 v0xc32440_0; %cmpi/ne 202, 0, 8; %flag_mov 8, 4; - %load/vec4 v0x26c4d80_0; + %load/vec4 v0xc32440_0; %xor/r; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.4, 6; - %vpi_call 2 64 "$display", "Serial in failed, parallel" {0 0 0}; + %vpi_call 2 65 "$display", "Serial in failed, parallel" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4be0_0, 0, 1; + %store/vec4 v0xc322a0_0, 0, 1; T_1.4 ; - %load/vec4 v0x26c50e0_0; + %load/vec4 v0xc327a0_0; %pad/u 32; %cmpi/ne 1, 0, 32; %flag_mov 8, 4; - %load/vec4 v0x26c50e0_0; + %load/vec4 v0xc327a0_0; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.6, 6; - %vpi_call 2 68 "$display", "Serial in failed, serial" {0 0 0}; + %vpi_call 2 69 "$display", "Serial in failed, serial" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4be0_0, 0, 1; + %store/vec4 v0xc322a0_0, 0, 1; T_1.6 ; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4e50_0, 0, 1; + %store/vec4 v0xc32510_0, 0, 1; %pushi/vec4 83, 0, 8; - %store/vec4 v0x26c4c80_0, 0, 8; + %store/vec4 v0xc32340_0, 0, 8; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; - %load/vec4 v0x26c4d80_0; + %load/vec4 v0xc32440_0; %cmpi/ne 83, 0, 8; %flag_mov 8, 4; - %load/vec4 v0x26c4d80_0; + %load/vec4 v0xc32440_0; %xor/r; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.8, 6; - %vpi_call 2 77 "$display", "Parallel in failed, parallel" {0 0 0}; + %vpi_call 2 78 "$display", "Parallel in failed, parallel" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4be0_0, 0, 1; + %store/vec4 v0xc322a0_0, 0, 1; T_1.8 ; - %load/vec4 v0x26c50e0_0; + %load/vec4 v0xc327a0_0; %pad/u 32; %cmpi/ne 0, 0, 32; %flag_mov 8, 4; - %load/vec4 v0x26c50e0_0; + %load/vec4 v0xc327a0_0; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.10, 6; - %vpi_call 2 81 "$display", "Parallel in failed, serial" {0 0 0}; + %vpi_call 2 82 "$display", "Parallel in failed, serial" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4be0_0, 0, 1; + %store/vec4 v0xc322a0_0, 0, 1; T_1.10 ; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4e50_0, 0, 1; + %store/vec4 v0xc32510_0, 0, 1; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c5010_0, 0, 1; + %store/vec4 v0xc326d0_0, 0, 1; %pushi/vec4 255, 0, 8; - %store/vec4 v0x26c4c80_0, 0, 8; + %store/vec4 v0xc32340_0, 0, 8; %pushi/vec4 1, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4b20_0, 0, 1; + %store/vec4 v0xc321e0_0, 0, 1; %delay 5, 0; - %load/vec4 v0x26c4d80_0; + %load/vec4 v0xc32440_0; %cmpi/ne 255, 0, 8; %flag_mov 8, 4; - %load/vec4 v0x26c4d80_0; + %load/vec4 v0xc32440_0; %xor/r; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.12, 6; - %vpi_call 2 91 "$display", "Same time in failed, parallel" {0 0 0}; + %vpi_call 2 92 "$display", "Same time in failed, parallel" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4be0_0, 0, 1; + %store/vec4 v0xc322a0_0, 0, 1; T_1.12 ; - %load/vec4 v0x26c50e0_0; + %load/vec4 v0xc327a0_0; %pad/u 32; %cmpi/ne 1, 0, 32; %flag_mov 8, 4; - %load/vec4 v0x26c50e0_0; + %load/vec4 v0xc327a0_0; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.14, 6; - %vpi_call 2 95 "$display", "Same time in failed, serial" {0 0 0}; + %vpi_call 2 96 "$display", "Same time in failed, serial" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0x26c4be0_0, 0, 1; + %store/vec4 v0xc322a0_0, 0, 1; T_1.14 ; - %load/vec4 v0x26c4be0_0; + %load/vec4 v0xc322a0_0; %flag_set/vec4 8; %jmp/0xz T_1.16, 8; - %vpi_call 2 100 "$display", "DUT passed!" {0 0 0}; + %vpi_call 2 101 "$display", "DUT passed!" {0 0 0}; T_1.16 ; - %vpi_call 2 102 "$finish" {0 0 0}; + %vpi_call 2 103 "$finish" {0 0 0}; %end; .thread T_1; # The file index is used to find the file name in the following table. diff --git a/shift.vcd b/shift.vcd index 03adba6..0481f84 100644 --- a/shift.vcd +++ b/shift.vcd @@ -1,5 +1,5 @@ $date - Tue Oct 24 11:28:11 2017 + Tue Oct 24 11:37:56 2017 $end $version Icarus Verilog @@ -34,7 +34,7 @@ bx + bx * bx ) x( -x' +1' x& bx % 1$ diff --git a/shiftregister.t.v b/shiftregister.t.v index b639aa8..0fabc0c 100644 --- a/shiftregister.t.v +++ b/shiftregister.t.v @@ -28,6 +28,7 @@ module testshiftregister(); $dumpvars(0, testshiftregister); //initialize dutpassed = 1; + peripheralClkEdge = 1; clk = 0; #5; parallelDataIn = 8'd0; parallelLoad = 1; diff --git a/shiftregister.v b/shiftregister.v index 1b234ab..c166e61 100644 --- a/shiftregister.v +++ b/shiftregister.v @@ -20,11 +20,13 @@ output serialDataOut // Positive edge synchronized reg [width-1:0] shiftregistermem; always @(posedge clk) begin - if(parallelLoad) - shiftregistermem <= parallelDataIn; - else begin - shiftregistermem <= {shiftregistermem[width-2:0],serialDataIn}; - end + if(peripheralClkEdge) begin + if(parallelLoad) + shiftregistermem <= parallelDataIn; + else begin + shiftregistermem <= {shiftregistermem[width-2:0],serialDataIn}; + end + end end assign parallelDataOut = shiftregistermem; From 61c437da757455776f7961b72fdf853a51690b85 Mon Sep 17 00:00:00 2001 From: Tobias Shapinsky Date: Tue, 24 Oct 2017 11:44:01 -0400 Subject: [PATCH 07/20] created midpoint fpga wrapper --- midpoint.v | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 midpoint.v diff --git a/midpoint.v b/midpoint.v new file mode 100644 index 0000000..b161894 --- /dev/null +++ b/midpoint.v @@ -0,0 +1,32 @@ +`include "shiftregister.v" +`include "inputconditioner.v" +module midpoint_wrapper + ( + input clk, + input [3:0] sw, + input [3:0] btn, + input [3:0] led + ) + + wire par_load; + wire ser_in; + wire clk_edge; + wire [7:0] par_data_in; + wire [7:0] par_data_out; + + inputconditioner btn_cond(.clk(clk),.noisysignal(btn[0]),.negativeedge(par_load)); + inputconditioner sw0_cond(.clk(clk),.noisysignal(sw[0]),.coditioned(ser_in)); + inputconditioner sw1_cond(.clk(clk),.noisysignal(sw[1]),.positiveedge(clk_edge)); + + assign par_data_in = 8'hA5; + + shiftregister reg(.clk(clk),.peripheralClkEdge(clk_edge),.parallelLoad(par_load),.parallelDataIn(par_data_in),.serialDataIn(ser_in),.parallelDataDout(par_data_out)); + + always @(posedge clk)begin + if(sw[1]) + led <= par_data_out[4:7]; + else begin + led <= par_data_out[0:3]; + end + end +endmodule From 644e8f484471c532727ea980b4f535b0b5166aa5 Mon Sep 17 00:00:00 2001 From: Henry Rachootin Date: Wed, 25 Oct 2017 16:45:21 -0400 Subject: [PATCH 08/20] requirments are vague, got dick stuck in ceiling fan --- shift | 206 ++++++++++++++++++++++++------------------------ shift.vcd | 2 +- shiftregister.v | 11 ++- 3 files changed, 109 insertions(+), 110 deletions(-) diff --git a/shift b/shift index 4c84dca..cc2e75d 100755 --- a/shift +++ b/shift @@ -6,17 +6,17 @@ :vpi_module "vhdl_sys"; :vpi_module "v2005_math"; :vpi_module "va_math"; -S_0xbe9c60 .scope module, "testshiftregister" "testshiftregister" 2 6; +S_0x18e7c60 .scope module, "testshiftregister" "testshiftregister" 2 6; .timescale 0 0; -v0xc321e0_0 .var "clk", 0 0; -v0xc322a0_0 .var "dutpassed", 0 0; -v0xc32340_0 .var "parallelDataIn", 7 0; -v0xc32440_0 .net "parallelDataOut", 7 0, L_0xc32870; 1 drivers -v0xc32510_0 .var "parallelLoad", 0 0; -v0xc32600_0 .var "peripheralClkEdge", 0 0; -v0xc326d0_0 .var "serialDataIn", 0 0; -v0xc327a0_0 .net "serialDataOut", 0 0, L_0xc32930; 1 drivers -S_0xc0e880 .scope module, "dut" "shiftregister" 2 17, 3 9 0, S_0xbe9c60; +v0x19301e0_0 .var "clk", 0 0; +v0x19302a0_0 .var "dutpassed", 0 0; +v0x1930340_0 .var "parallelDataIn", 7 0; +v0x1930440_0 .net "parallelDataOut", 7 0, L_0x1930870; 1 drivers +v0x1930510_0 .var "parallelLoad", 0 0; +v0x1930600_0 .var "peripheralClkEdge", 0 0; +v0x19306d0_0 .var "serialDataIn", 0 0; +v0x19307a0_0 .net "serialDataOut", 0 0, L_0x1930930; 1 drivers +S_0x190c880 .scope module, "dut" "shiftregister" 2 17, 3 9 0, S_0x18e7c60; .timescale 0 0; .port_info 0 /INPUT 1 "clk" .port_info 1 /INPUT 1 "peripheralClkEdge" @@ -25,246 +25,246 @@ S_0xc0e880 .scope module, "dut" "shiftregister" 2 17, 3 9 0, S_0xbe9c60; .port_info 4 /INPUT 1 "serialDataIn" .port_info 5 /OUTPUT 8 "parallelDataOut" .port_info 6 /OUTPUT 1 "serialDataOut" -P_0xc0ea50 .param/l "width" 0 3 10, +C4<00000000000000000000000000001000>; -L_0xc32870 .functor BUFZ 8, v0xc31fe0_0, C4<00000000>, C4<00000000>, C4<00000000>; -v0xc0eaf0_0 .net "clk", 0 0, v0xc321e0_0; 1 drivers -v0xc31ac0_0 .net "parallelDataIn", 7 0, v0xc32340_0; 1 drivers -v0xc31ba0_0 .net "parallelDataOut", 7 0, L_0xc32870; alias, 1 drivers -v0xc31c90_0 .net "parallelLoad", 0 0, v0xc32510_0; 1 drivers -v0xc31d50_0 .net "peripheralClkEdge", 0 0, v0xc32600_0; 1 drivers -v0xc31e60_0 .net "serialDataIn", 0 0, v0xc326d0_0; 1 drivers -v0xc31f20_0 .net "serialDataOut", 0 0, L_0xc32930; alias, 1 drivers -v0xc31fe0_0 .var "shiftregistermem", 7 0; -E_0xc0feb0 .event posedge, v0xc0eaf0_0; -L_0xc32930 .part v0xc31fe0_0, 7, 1; - .scope S_0xc0e880; +P_0x190ca50 .param/l "width" 0 3 10, +C4<00000000000000000000000000001000>; +L_0x1930870 .functor BUFZ 8, v0x192ffe0_0, C4<00000000>, C4<00000000>, C4<00000000>; +v0x190caf0_0 .net "clk", 0 0, v0x19301e0_0; 1 drivers +v0x192fac0_0 .net "parallelDataIn", 7 0, v0x1930340_0; 1 drivers +v0x192fba0_0 .net "parallelDataOut", 7 0, L_0x1930870; alias, 1 drivers +v0x192fc90_0 .net "parallelLoad", 0 0, v0x1930510_0; 1 drivers +v0x192fd50_0 .net "peripheralClkEdge", 0 0, v0x1930600_0; 1 drivers +v0x192fe60_0 .net "serialDataIn", 0 0, v0x19306d0_0; 1 drivers +v0x192ff20_0 .net "serialDataOut", 0 0, L_0x1930930; alias, 1 drivers +v0x192ffe0_0 .var "shiftregistermem", 7 0; +E_0x190deb0 .event posedge, v0x190caf0_0; +L_0x1930930 .part v0x192ffe0_0, 7, 1; + .scope S_0x190c880; T_0 ; - %wait E_0xc0feb0; - %load/vec4 v0xc31d50_0; + %wait E_0x190deb0; + %load/vec4 v0x192fc90_0; %flag_set/vec4 8; %jmp/0xz T_0.0, 8; - %load/vec4 v0xc31c90_0; + %load/vec4 v0x192fac0_0; + %assign/vec4 v0x192ffe0_0, 0; + %jmp T_0.1; +T_0.0 ; + %load/vec4 v0x192fd50_0; %flag_set/vec4 8; %jmp/0xz T_0.2, 8; - %load/vec4 v0xc31ac0_0; - %assign/vec4 v0xc31fe0_0, 0; - %jmp T_0.3; -T_0.2 ; - %load/vec4 v0xc31fe0_0; + %load/vec4 v0x192ffe0_0; %parti/s 7, 0, 2; - %load/vec4 v0xc31e60_0; + %load/vec4 v0x192fe60_0; %concat/vec4; draw_concat_vec4 - %assign/vec4 v0xc31fe0_0, 0; -T_0.3 ; -T_0.0 ; + %assign/vec4 v0x192ffe0_0, 0; +T_0.2 ; +T_0.1 ; %jmp T_0; .thread T_0; - .scope S_0xbe9c60; + .scope S_0x18e7c60; T_1 ; %vpi_call 2 27 "$dumpfile", "shift.vcd" {0 0 0}; - %vpi_call 2 28 "$dumpvars", 32'sb00000000000000000000000000000000, S_0xbe9c60 {0 0 0}; + %vpi_call 2 28 "$dumpvars", 32'sb00000000000000000000000000000000, S_0x18e7c60 {0 0 0}; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc322a0_0, 0, 1; + %store/vec4 v0x19302a0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc32600_0, 0, 1; + %store/vec4 v0x1930600_0, 0, 1; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 8; - %store/vec4 v0xc32340_0, 0, 8; + %store/vec4 v0x1930340_0, 0, 8; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc32510_0, 0, 1; + %store/vec4 v0x1930510_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; - %load/vec4 v0xc32440_0; + %load/vec4 v0x1930440_0; %cmpi/ne 0, 0, 8; %flag_mov 8, 4; - %load/vec4 v0xc32440_0; + %load/vec4 v0x1930440_0; %xor/r; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.0, 6; %vpi_call 2 38 "$display", "initialization failed, parallel" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc322a0_0, 0, 1; + %store/vec4 v0x19302a0_0, 0, 1; T_1.0 ; - %load/vec4 v0xc327a0_0; + %load/vec4 v0x19307a0_0; %pad/u 32; %cmpi/ne 0, 0, 32; %flag_mov 8, 4; - %load/vec4 v0xc327a0_0; + %load/vec4 v0x19307a0_0; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.2, 6; %vpi_call 2 42 "$display", "initialization failed, serial" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc322a0_0, 0, 1; + %store/vec4 v0x19302a0_0, 0, 1; T_1.2 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc32510_0, 0, 1; + %store/vec4 v0x1930510_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc326d0_0, 0, 1; + %store/vec4 v0x19306d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc326d0_0, 0, 1; + %store/vec4 v0x19306d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc326d0_0, 0, 1; + %store/vec4 v0x19306d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc326d0_0, 0, 1; + %store/vec4 v0x19306d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc326d0_0, 0, 1; + %store/vec4 v0x19306d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc326d0_0, 0, 1; + %store/vec4 v0x19306d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc326d0_0, 0, 1; + %store/vec4 v0x19306d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc326d0_0, 0, 1; + %store/vec4 v0x19306d0_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; - %load/vec4 v0xc32440_0; + %load/vec4 v0x1930440_0; %cmpi/ne 202, 0, 8; %flag_mov 8, 4; - %load/vec4 v0xc32440_0; + %load/vec4 v0x1930440_0; %xor/r; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.4, 6; %vpi_call 2 65 "$display", "Serial in failed, parallel" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc322a0_0, 0, 1; + %store/vec4 v0x19302a0_0, 0, 1; T_1.4 ; - %load/vec4 v0xc327a0_0; + %load/vec4 v0x19307a0_0; %pad/u 32; %cmpi/ne 1, 0, 32; %flag_mov 8, 4; - %load/vec4 v0xc327a0_0; + %load/vec4 v0x19307a0_0; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.6, 6; %vpi_call 2 69 "$display", "Serial in failed, serial" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc322a0_0, 0, 1; + %store/vec4 v0x19302a0_0, 0, 1; T_1.6 ; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc32510_0, 0, 1; + %store/vec4 v0x1930510_0, 0, 1; %pushi/vec4 83, 0, 8; - %store/vec4 v0xc32340_0, 0, 8; + %store/vec4 v0x1930340_0, 0, 8; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; - %load/vec4 v0xc32440_0; + %load/vec4 v0x1930440_0; %cmpi/ne 83, 0, 8; %flag_mov 8, 4; - %load/vec4 v0xc32440_0; + %load/vec4 v0x1930440_0; %xor/r; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.8, 6; %vpi_call 2 78 "$display", "Parallel in failed, parallel" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc322a0_0, 0, 1; + %store/vec4 v0x19302a0_0, 0, 1; T_1.8 ; - %load/vec4 v0xc327a0_0; + %load/vec4 v0x19307a0_0; %pad/u 32; %cmpi/ne 0, 0, 32; %flag_mov 8, 4; - %load/vec4 v0xc327a0_0; + %load/vec4 v0x19307a0_0; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.10, 6; %vpi_call 2 82 "$display", "Parallel in failed, serial" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc322a0_0, 0, 1; + %store/vec4 v0x19302a0_0, 0, 1; T_1.10 ; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc32510_0, 0, 1; + %store/vec4 v0x1930510_0, 0, 1; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc326d0_0, 0, 1; + %store/vec4 v0x19306d0_0, 0, 1; %pushi/vec4 255, 0, 8; - %store/vec4 v0xc32340_0, 0, 8; + %store/vec4 v0x1930340_0, 0, 8; %pushi/vec4 1, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc321e0_0, 0, 1; + %store/vec4 v0x19301e0_0, 0, 1; %delay 5, 0; - %load/vec4 v0xc32440_0; + %load/vec4 v0x1930440_0; %cmpi/ne 255, 0, 8; %flag_mov 8, 4; - %load/vec4 v0xc32440_0; + %load/vec4 v0x1930440_0; %xor/r; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.12, 6; %vpi_call 2 92 "$display", "Same time in failed, parallel" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc322a0_0, 0, 1; + %store/vec4 v0x19302a0_0, 0, 1; T_1.12 ; - %load/vec4 v0xc327a0_0; + %load/vec4 v0x19307a0_0; %pad/u 32; %cmpi/ne 1, 0, 32; %flag_mov 8, 4; - %load/vec4 v0xc327a0_0; + %load/vec4 v0x19307a0_0; %cmpi/e 1, 1, 1; %flag_or 6, 8; %jmp/0xz T_1.14, 6; %vpi_call 2 96 "$display", "Same time in failed, serial" {0 0 0}; %pushi/vec4 0, 0, 1; - %store/vec4 v0xc322a0_0, 0, 1; + %store/vec4 v0x19302a0_0, 0, 1; T_1.14 ; - %load/vec4 v0xc322a0_0; + %load/vec4 v0x19302a0_0; %flag_set/vec4 8; %jmp/0xz T_1.16, 8; %vpi_call 2 101 "$display", "DUT passed!" {0 0 0}; diff --git a/shift.vcd b/shift.vcd index 0481f84..4149b41 100644 --- a/shift.vcd +++ b/shift.vcd @@ -1,5 +1,5 @@ $date - Tue Oct 24 11:37:56 2017 + Wed Oct 25 16:44:59 2017 $end $version Icarus Verilog diff --git a/shiftregister.v b/shiftregister.v index c166e61..e10129a 100644 --- a/shiftregister.v +++ b/shiftregister.v @@ -20,12 +20,11 @@ output serialDataOut // Positive edge synchronized reg [width-1:0] shiftregistermem; always @(posedge clk) begin - if(peripheralClkEdge) begin - if(parallelLoad) - shiftregistermem <= parallelDataIn; - else begin - shiftregistermem <= {shiftregistermem[width-2:0],serialDataIn}; - end + if(parallelLoad) begin + shiftregistermem <= parallelDataIn; + end + else if(peripheralClkEdge) begin + shiftregistermem <= {shiftregistermem[width-2:0],serialDataIn}; end end From 3d9ab426d0a795ca5e7ced6f9a3727ffa67b5d85 Mon Sep 17 00:00:00 2001 From: Tobias Shapinsky Date: Wed, 25 Oct 2017 20:52:15 -0400 Subject: [PATCH 09/20] upload to FPGA --- ZYBO_Master.xdc | 146 ++++++++++++++++++++++++++++++++++++++++++++++++ midpoint.v | 18 +++--- 2 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 ZYBO_Master.xdc diff --git a/ZYBO_Master.xdc b/ZYBO_Master.xdc new file mode 100644 index 0000000..f3dbb71 --- /dev/null +++ b/ZYBO_Master.xdc @@ -0,0 +1,146 @@ +## This file is a general .xdc for the ZYBO Rev B board +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used signals according to the project + + +##Clock signal +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L11P_T1_SRCC_35 Sch=sysclk +#create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports { clk }]; + + +##Switches +set_property -dict { PACKAGE_PIN G15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L19N_T3_VREF_35 Sch=SW0 +set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L24P_T3_34 Sch=SW1 +set_property -dict { PACKAGE_PIN W13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L4N_T0_34 Sch=SW2 +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L9P_T1_DQS_34 Sch=SW3 + + +##Buttons +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { btn[0] }]; #IO_L20N_T3_34 Sch=BTN0 +set_property -dict { PACKAGE_PIN P16 IOSTANDARD LVCMOS33 } [get_ports { btn[1] }]; #IO_L24N_T3_34 Sch=BTN1 +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { btn[2] }]; #IO_L18P_T2_34 Sch=BTN2 +set_property -dict { PACKAGE_PIN Y16 IOSTANDARD LVCMOS33 } [get_ports { btn[3] }]; #IO_L7P_T1_34 Sch=BTN3 + + +##LEDs +set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L23P_T3_35 Sch=LED0 +set_property -dict { PACKAGE_PIN M15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L23N_T3_35 Sch=LED1 +set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_0_35=Sch=LED2 +set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L3N_T0_DQS_AD1N_35 Sch=LED3 + + +##I2S Audio Codec +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports ac_bclk]; #IO_L12N_T1_MRCC_35 Sch=AC_BCLK +#set_property -dict { PACKAGE_PIN T19 IOSTANDARD LVCMOS33 } [get_ports ac_mclk]; #IO_25_34 Sch=AC_MCLK +#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports ac_muten]; #IO_L23N_T3_34 Sch=AC_MUTEN +#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports ac_pbdat]; #IO_L8P_T1_AD10P_35 Sch=AC_PBDAT +#set_property -dict { PACKAGE_PIN L17 IOSTANDARD LVCMOS33 } [get_ports ac_pblrc]; #IO_L11N_T1_SRCC_35 Sch=AC_PBLRC +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports ac_recdat]; #IO_L12P_T1_MRCC_35 Sch=AC_RECDAT +#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports ac_reclrc]; #IO_L8N_T1_AD10N_35 Sch=AC_RECLRC + + +##Audio Codec/external EEPROM IIC bus +#set_property -dict { PACKAGE_PIN N18 IOSTANDARD LVCMOS33 } [get_ports ac_scl]; #IO_L13P_T2_MRCC_34 Sch=AC_SCL +#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports ac_sda]; #IO_L23P_T3_34 Sch=AC_SDA + + +##Additional Ethernet signals +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports eth_int_b]; #IO_L6P_T0_35 Sch=ETH_INT_B +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports eth_rst_b]; #IO_L3P_T0_DQS_AD1P_35 Sch=ETH_RST_B + + +##HDMI Signals +#set_property -dict { PACKAGE_PIN H17 IOSTANDARD TMDS_33 } [get_ports hdmi_clk_n]; #IO_L13N_T2_MRCC_35 Sch=HDMI_CLK_N +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD TMDS_33 } [get_ports hdmi_clk_p]; #IO_L13P_T2_MRCC_35 Sch=HDMI_CLK_P +#set_property -dict { PACKAGE_PIN D20 IOSTANDARD TMDS_33 } [get_ports { hdmi_d_n[0] }]; #IO_L4N_T0_35 Sch=HDMI_D0_N +#set_property -dict { PACKAGE_PIN D19 IOSTANDARD TMDS_33 } [get_ports { hdmi_d_p[0] }]; #IO_L4P_T0_35 Sch=HDMI_D0_P +#set_property -dict { PACKAGE_PIN B20 IOSTANDARD TMDS_33 } [get_ports { hdmi_d_n[1] }]; #IO_L1N_T0_AD0N_35 Sch=HDMI_D1_N +#set_property -dict { PACKAGE_PIN C20 IOSTANDARD TMDS_33 } [get_ports { hdmi_d_p[1] }]; #IO_L1P_T0_AD0P_35 Sch=HDMI_D1_P +#set_property -dict { PACKAGE_PIN A20 IOSTANDARD TMDS_33 } [get_ports { hdmi_d_n[2] }]; #IO_L2N_T0_AD8N_35 Sch=HDMI_D2_N +#set_property -dict { PACKAGE_PIN B19 IOSTANDARD TMDS_33 } [get_ports { hdmi_d_p[2] }]; #IO_L2P_T0_AD8P_35 Sch=HDMI_D2_P +#set_property -dict { PACKAGE_PIN E19 IOSTANDARD LVCMOS33 } [get_ports hdmi_cec]; #IO_L5N_T0_AD9N_35 Sch=HDMI_CEC +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports hdmi_hpd]; #IO_L5P_T0_AD9P_35 Sch=HDMI_HPD +#set_property -dict { PACKAGE_PIN F17 IOSTANDARD LVCMOS33 } [get_ports hdmi_out_en]; #IO_L6N_T0_VREF_35 Sch=HDMI_OUT_EN +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports hdmi_scl]; #IO_L16P_T2_35 Sch=HDMI_SCL +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports hdmi_sda]; #IO_L16N_T2_35 Sch=HDMI_SDA + + +##Pmod Header JA (XADC) +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { ja_p[0] }]; #IO_L21P_T3_DQS_AD14P_35 Sch=JA1_R_p +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { ja_p[1] }]; #IO_L22P_T3_AD7P_35 Sch=JA2_R_P +#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { ja_p[2] }]; #IO_L24P_T3_AD15P_35 Sch=JA3_R_P +#set_property -dict { PACKAGE_PIN K14 IOSTANDARD LVCMOS33 } [get_ports { ja_p[3] }]; #IO_L20P_T3_AD6P_35 Sch=JA4_R_P +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { ja_n[0] }]; #IO_L21N_T3_DQS_AD14N_35 Sch=JA1_R_N +#set_property -dict { PACKAGE_PIN L15 IOSTANDARD LVCMOS33 } [get_ports { ja_n[1] }]; #IO_L22N_T3_AD7N_35 Sch=JA2_R_N +#set_property -dict { PACKAGE_PIN J16 IOSTANDARD LVCMOS33 } [get_ports { ja_n[2] }]; #IO_L24N_T3_AD15N_35 Sch=JA3_R_N +#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { ja_n[3] }]; #IO_L20N_T3_AD6N_35 Sch=JA4_R_N + + +##Pmod Header JB +#set_property -dict { PACKAGE_PIN T20 IOSTANDARD LVCMOS33 } [get_ports { jb_p[0] }]; #IO_L15P_T2_DQS_34 Sch=JB1_p +#set_property -dict { PACKAGE_PIN U20 IOSTANDARD LVCMOS33 } [get_ports { jb_n[0] }]; #IO_L15N_T2_DQS_34 Sch=JB1_N +#set_property -dict { PACKAGE_PIN V20 IOSTANDARD LVCMOS33 } [get_ports { jb_p[1] }]; #IO_L16P_T2_34 Sch=JB2_P +#set_property -dict { PACKAGE_PIN W20 IOSTANDARD LVCMOS33 } [get_ports { jb_n[1] }]; #IO_L16N_T2_34 Sch=JB2_N +#set_property -dict { PACKAGE_PIN Y18 IOSTANDARD LVCMOS33 } [get_ports { jb_p[2] }]; #IO_L17P_T2_34 Sch=JB3_P +#set_property -dict { PACKAGE_PIN Y19 IOSTANDARD LVCMOS33 } [get_ports { jb_n[2] }]; #IO_L17N_T2_34 Sch=JB3_N +#set_property -dict { PACKAGE_PIN W18 IOSTANDARD LVCMOS33 } [get_ports { jb_p[3] }]; #IO_L22P_T3_34 Sch=JB4_P +#set_property -dict { PACKAGE_PIN W19 IOSTANDARD LVCMOS33 } [get_ports { jb_n[3] }]; #IO_L22N_T3_34 Sch=JB4_N + + +##Pmod Header JC +#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { jc_p[0] }]; #IO_L10P_T1_34 Sch=JC1_P +#set_property -dict { PACKAGE_PIN W15 IOSTANDARD LVCMOS33 } [get_ports { jc_n[0] }]; #IO_L10N_T1_34 Sch=JC1_N +#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { jc_p[1] }]; #IO_L1P_T0_34 Sch=JC2_P +#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { jc_n[1] }]; #IO_L1N_T0_34 Sch=JC2_N +#set_property -dict { PACKAGE_PIN W14 IOSTANDARD LVCMOS33 } [get_ports { jc_p[2] }]; #IO_L8P_T1_34 Sch=JC3_P +#set_property -dict { PACKAGE_PIN Y14 IOSTANDARD LVCMOS33 } [get_ports { jc_n[2] }]; #IO_L8N_T1_34 Sch=JC3_N +#set_property -dict { PACKAGE_PIN T12 IOSTANDARD LVCMOS33 } [get_ports { jc_p[3] }]; #IO_L2P_T0_34 Sch=JC4_P +#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { jc_n[3] }]; #IO_L2N_T0_34 Sch=JC4_N + + +##Pmod Header JD +#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { jd_p[0] }]; #IO_L5P_T0_34 Sch=JD1_P +#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { jd_n[0] }]; #IO_L5N_T0_34 Sch=JD1_N +#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { jd_p[1] }]; #IO_L6P_T0_34 Sch=JD2_P +#set_property -dict { PACKAGE_PIN R14 IOSTANDARD LVCMOS33 } [get_ports { jd_n[1] }]; #IO_L6N_T0_VREF_34 Sch=JD2_N +#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { jd_p[2] }]; #IO_L11P_T1_SRCC_34 Sch=JD3_P +#set_property -dict { PACKAGE_PIN U15 IOSTANDARD LVCMOS33 } [get_ports { jd_n[2] }]; #IO_L11N_T1_SRCC_34 Sch=JD3_N +#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { jd_p[3] }]; #IO_L21P_T3_DQS_34 Sch=JD4_P +#set_property -dict { PACKAGE_PIN V18 IOSTANDARD LVCMOS33 } [get_ports { jd_n[3] }]; #IO_L21N_T3_DQS_34 Sch=JD4_N + + +##Pmod Header JE +#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { je[0] }]; #IO_L4P_T0_34 Sch=JE1 +#set_property -dict { PACKAGE_PIN W16 IOSTANDARD LVCMOS33 } [get_ports { je[1] }]; #IO_L18N_T2_34 Sch=JE2 +#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { je[2] }]; #IO_25_35 Sch=JE3 +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { je[3] }]; #IO_L19P_T3_35 Sch=JE4 +#set_property -dict { PACKAGE_PIN V13 IOSTANDARD LVCMOS33 } [get_ports { je[4] }]; #IO_L3N_T0_DQS_34 Sch=JE7 +#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { je[5] }]; #IO_L9N_T1_DQS_34 Sch=JE8 +#set_property -dict { PACKAGE_PIN T17 IOSTANDARD LVCMOS33 } [get_ports { je[6] }]; #IO_L20P_T3_34 Sch=JE9 +#set_property -dict { PACKAGE_PIN Y17 IOSTANDARD LVCMOS33 } [get_ports { je[7] }]; #IO_L7N_T1_34 Sch=JE10 + + +##USB-OTG overcurrent detect pin +#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports otg_oc]; #IO_L3P_T0_DQS_PUDC_B_34 Sch=OTG_OC + + +##VGA Connector +#set_property -dict { PACKAGE_PIN M19 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L7P_T1_AD2P_35 Sch=VGA_R1 +#set_property -dict { PACKAGE_PIN L20 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L9N_T1_DQS_AD3N_35 Sch=VGA_R2 +#set_property -dict { PACKAGE_PIN J20 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L17P_T2_AD5P_35 Sch=VGA_R3 +#set_property -dict { PACKAGE_PIN G20 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L18N_T2_AD13N_35 Sch=VGA_R4 +#set_property -dict { PACKAGE_PIN F19 IOSTANDARD LVCMOS33 } [get_ports { vga_r[4] }]; #IO_L15P_T2_DQS_AD12P_35 Sch=VGA_R5 +#set_property -dict { PACKAGE_PIN H18 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L14N_T2_AD4N_SRCC_35 Sch=VGA_G0 +#set_property -dict { PACKAGE_PIN N20 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L14P_T2_SRCC_34 Sch=VGA_G1 +#set_property -dict { PACKAGE_PIN L19 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L9P_T1_DQS_AD3P_35 Sch=VGA_G2 +#set_property -dict { PACKAGE_PIN J19 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L10N_T1_AD11N_35 Sch=VGA_G3 +#set_property -dict { PACKAGE_PIN H20 IOSTANDARD LVCMOS33 } [get_ports { vga_g[4] }]; #IO_L17N_T2_AD5N_35 Sch=VGA_G4 +#set_property -dict { PACKAGE_PIN F20 IOSTANDARD LVCMOS33 } [get_ports { vga_g[5] }]; #IO_L15N_T2_DQS_AD12N_35 Sch=VGA=G5 +#set_property -dict { PACKAGE_PIN P20 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L14N_T2_SRCC_34 Sch=VGA_B1 +#set_property -dict { PACKAGE_PIN M20 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L7N_T1_AD2N_35 Sch=VGA_B2 +#set_property -dict { PACKAGE_PIN K19 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L10P_T1_AD11P_35 Sch=VGA_B3 +#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L14P_T2_AD4P_SRCC_35 Sch=VGA_B4 +#set_property -dict { PACKAGE_PIN G19 IOSTANDARD LVCMOS33 } [get_ports { vga_b[4] }]; #IO_L18P_T2_AD13P_35 Sch=VGA_B5 +#set_property -dict { PACKAGE_PIN P19 IOSTANDARD LVCMOS33 } [get_ports vga_hs]; #IO_L13N_T2_MRCC_34 Sch=VGA_HS +#set_property -dict { PACKAGE_PIN R19 IOSTANDARD LVCMOS33 } [get_ports vga_vs]; #IO_0_34 Sch=VGA_VS diff --git a/midpoint.v b/midpoint.v index b161894..0bcc955 100644 --- a/midpoint.v +++ b/midpoint.v @@ -1,32 +1,34 @@ `include "shiftregister.v" `include "inputconditioner.v" module midpoint_wrapper - ( +( input clk, input [3:0] sw, input [3:0] btn, - input [3:0] led - ) + output [3:0] led + ); wire par_load; wire ser_in; wire clk_edge; wire [7:0] par_data_in; wire [7:0] par_data_out; + reg [3:0] ledmem; inputconditioner btn_cond(.clk(clk),.noisysignal(btn[0]),.negativeedge(par_load)); - inputconditioner sw0_cond(.clk(clk),.noisysignal(sw[0]),.coditioned(ser_in)); + inputconditioner sw0_cond(.clk(clk),.noisysignal(sw[0]),.conditioned(ser_in)); inputconditioner sw1_cond(.clk(clk),.noisysignal(sw[1]),.positiveedge(clk_edge)); assign par_data_in = 8'hA5; - shiftregister reg(.clk(clk),.peripheralClkEdge(clk_edge),.parallelLoad(par_load),.parallelDataIn(par_data_in),.serialDataIn(ser_in),.parallelDataDout(par_data_out)); + shiftregister shftreg(.clk(clk),.peripheralClkEdge(clk_edge),.parallelLoad(par_load),.parallelDataIn(par_data_in),.serialDataIn(ser_in),.parallelDataOut(par_data_out)); always @(posedge clk)begin - if(sw[1]) - led <= par_data_out[4:7]; + if(sw[3]) + ledmem = par_data_out[7:4]; else begin - led <= par_data_out[0:3]; + ledmem = par_data_out[3:0]; end end + assign led=ledmem; endmodule From f3e6111f18dc6a43cc139386faed541df670542b Mon Sep 17 00:00:00 2001 From: Tobias Shapinsky Date: Wed, 1 Nov 2017 20:50:24 -0400 Subject: [PATCH 10/20] added single test to spimefor spimem --- spimemory.t.v | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 spimemory.t.v diff --git a/spimemory.t.v b/spimemory.t.v new file mode 100644 index 0000000..400a4d9 --- /dev/null +++ b/spimemory.t.v @@ -0,0 +1,92 @@ +//---------------------------------------------------------------------- +// SPI Memory test bench +//---------------------------------------------------------------------- +`include "spimemory.v" + +module testMemory(); + + reg clk; + reg sclk_pin; + reg cs_pin; + reg mosi_pin; + wire miso_pin; + reg [6:0] address; + reg [7:0] data; + reg dutpassed; + reg[31:0] i; + + spiMemory dut(.clk(clk), + .sclk_pin(sclk_pin), + .cs_pin(cs_pin), + .mosi_pin(mosi_pin), + .miso_pin(miso_pin)); + + initial begin + clk = 0; + sclk_pin = 0; + cs_pin = 0; + mosi_pin = 0; + end + //always #10 clk != clk; + + initial begin + address = 7'b1010101; + data = 8'b11110000; + + //write address + for(i=0; i < 7; i=i+1) begin + mosi_pin = address[i]; + sclk_pin = 1; + #100; + sclk_pin = 0; + end + + //set write + mosi_pin = 0; + sclk_pin = 1; + #100; + sclk_pin = 0; + + //write data + for(i=0; i < 8; i=i+1) begin + mosi_pin = data[i]; + sclk_pin = 1; + #100; + sclk_pin = 0; + end + + //write address + for(i=0; i < 7; i=i+1) begin + mosi_pin = address[i]; + sclk_pin = 1; + #100; + sclk_pin = 0; + end + + //set read + mosi_pin = 0; + sclk_pin = 1; + #100; + sclk_pin = 0; + + //read data + for(i=0; i < 8; i=i+1) begin + if(miso_pin != data[i]) begin + $display("read byte is different from written byte"); + dutpassed = 0; + end + sclk_pin = 1; + #100; + sclk_pin = 0; + end + + + if(dutpassed) begin + $display("DUT passed"); + end + else begin + $display("DUT failed"); + end + + end +endmodule From 5dffc89ae3e1d941fb147d9e9fc5df4513cf6856 Mon Sep 17 00:00:00 2001 From: Tobias Shapinsky Date: Wed, 1 Nov 2017 21:00:48 -0400 Subject: [PATCH 11/20] fixed tests not working --- spimemory.t.v | 98 ++++++++++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 45 deletions(-) diff --git a/spimemory.t.v b/spimemory.t.v index 400a4d9..f50502d 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -30,63 +30,71 @@ module testMemory(); //always #10 clk != clk; initial begin - address = 7'b1010101; - data = 8'b11110000; - - //write address - for(i=0; i < 7; i=i+1) begin - mosi_pin = address[i]; - sclk_pin = 1; + cs_pin = 1; #100; - sclk_pin = 0; - end - - //set write - mosi_pin = 0; - sclk_pin = 1; - #100; - sclk_pin = 0; - - //write data - for(i=0; i < 8; i=i+1) begin - mosi_pin = data[i]; + if(miso_pin !== Z) begin + $display("chip not in Z state when CS is low"); + end + cs_pin = 0; + #100 + + address = 7'b1010101; + data = 8'b11110000; + + //write address + for(i=0; i < 7; i=i+1) begin + mosi_pin = address[i]; + sclk_pin = 1; + #100; + sclk_pin = 0; + end + + //set write + mosi_pin = 0; sclk_pin = 1; #100; sclk_pin = 0; - end + + //write data + for(i=0; i < 8; i=i+1) begin + mosi_pin = data[i]; + sclk_pin = 1; + #100; + sclk_pin = 0; + end - //write address - for(i=0; i < 7; i=i+1) begin - mosi_pin = address[i]; + //write address + for(i=0; i < 7; i=i+1) begin + mosi_pin = address[i]; + sclk_pin = 1; + #100; + sclk_pin = 0; + end + + //set read + mosi_pin = 0; sclk_pin = 1; #100; sclk_pin = 0; - end - - //set read - mosi_pin = 0; - sclk_pin = 1; - #100; - sclk_pin = 0; - //read data - for(i=0; i < 8; i=i+1) begin - if(miso_pin != data[i]) begin - $display("read byte is different from written byte"); - dutpassed = 0; + //read data + for(i=0; i < 8; i=i+1) begin + if(miso_pin != data[i]) begin + $display("read byte is different from written byte"); + dutpassed = 0; + end + sclk_pin = 1; + #100; + sclk_pin = 0; end - sclk_pin = 1; - #100; - sclk_pin = 0; - end - if(dutpassed) begin - $display("DUT passed"); - end - else begin - $display("DUT failed"); - end + if(dutpassed) begin + $display("DUT passed"); + end + else begin + $display("DUT failed"); + end end endmodule From 2dde05a333d12bde0815524030aa72fc1c1bb0dc Mon Sep 17 00:00:00 2001 From: Tobias Shapinsky Date: Wed, 1 Nov 2017 21:04:55 -0400 Subject: [PATCH 12/20] finish commit --- spimemory.t.v | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/spimemory.t.v b/spimemory.t.v index f50502d..f662b91 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -30,10 +30,13 @@ module testMemory(); //always #10 clk != clk; initial begin + dutpassed = 1; + cs_pin = 1; #100; - if(miso_pin !== Z) begin + if(miso_pin !== 'z) begin $display("chip not in Z state when CS is low"); + dutpassed = 0; end cs_pin = 0; #100 @@ -79,7 +82,7 @@ module testMemory(); //read data for(i=0; i < 8; i=i+1) begin - if(miso_pin != data[i]) begin + if(miso_pin !== data[i] || miso_pin === 'x) begin $display("read byte is different from written byte"); dutpassed = 0; end @@ -87,14 +90,13 @@ module testMemory(); #100; sclk_pin = 0; end + + $display("DUT passed"); - if(dutpassed) begin - $display("DUT passed"); - end - else begin - $display("DUT failed"); - end - + end // initial begin + always @(negedge dutpassed) begin + $display("DUT failed"); + $finish(); end endmodule From 1f24895e13d78ae4e46c29fc9467bc1faa24f4c4 Mon Sep 17 00:00:00 2001 From: Henry Rachootin Date: Wed, 1 Nov 2017 21:06:20 -0400 Subject: [PATCH 13/20] FUCK YOU GIT --- datamemory.v | 2 +- spimem | 663 ++++++++++++++++++++++++++++++++++++++++++++++++++ spimemory.t.v | 16 +- spimemory.v | 97 +++++++- 4 files changed, 766 insertions(+), 12 deletions(-) create mode 100755 spimem diff --git a/datamemory.v b/datamemory.v index 0d82131..02225af 100644 --- a/datamemory.v +++ b/datamemory.v @@ -17,7 +17,7 @@ module datamemory input [addresswidth-1:0] address, input writeEnable, input [width-1:0] dataIn -) +); reg [width-1:0] memory [depth-1:0]; diff --git a/spimem b/spimem new file mode 100755 index 0000000..109b944 --- /dev/null +++ b/spimem @@ -0,0 +1,663 @@ +#! /usr/local/bin/vvp +:ivl_version "0.10.0 (devel)" "(s20150513)"; +:ivl_delay_selection "TYPICAL"; +:vpi_time_precision + 0; +:vpi_module "system"; +:vpi_module "vhdl_sys"; +:vpi_module "v2005_math"; +:vpi_module "va_math"; +S_0x153fb00 .scope module, "testMemory" "testMemory" 2 6; + .timescale 0 0; +v0x157b1f0_0 .var "address", 6 0; +v0x157b2f0_0 .var "clk", 0 0; +v0x157b3b0_0 .var "cs_pin", 0 0; +v0x157b4a0_0 .var "data", 7 0; +v0x157b540_0 .var "dutpassed", 0 0; +v0x157b650_0 .var "i", 31 0; +v0x157b730_0 .net "miso_pin", 0 0, v0x157aa30_0; 1 drivers +v0x157b7d0_0 .var "mosi_pin", 0 0; +v0x157b8c0_0 .var "sclk_pin", 0 0; +S_0x153fc80 .scope module, "dut" "spiMemory" 2 18, 3 12 0, S_0x153fb00; + .timescale 0 0; + .port_info 0 /INPUT 1 "clk" + .port_info 1 /INPUT 1 "sclk_pin" + .port_info 2 /INPUT 1 "cs_pin" + .port_info 3 /OUTPUT 1 "miso_pin" + .port_info 4 /INPUT 1 "mosi_pin" + .port_info 5 /OUTPUT 4 "leds" +v0x157a260_0 .var "addressReg", 6 0; +v0x157a370_0 .var "bitsTx", 4 0; +v0x157a430_0 .net "clk", 0 0, v0x157b2f0_0; 1 drivers +v0x157a500_0 .net "cs", 0 0, v0x1576fd0_0; 1 drivers +v0x157a5d0_0 .net "cs_pin", 0 0, v0x157b3b0_0; 1 drivers +o0x7fa8681b3b28 .functor BUFZ 4, C4; HiZ drive +v0x157a6c0_0 .net "leds", 3 0, o0x7fa8681b3b28; 0 drivers +v0x157a760_0 .var "load_mem", 0 0; +v0x157a830_0 .var "load_shift", 0 0; +v0x157a8d0_0 .net "mem_out", 7 0, v0x1577da0_0; 1 drivers +v0x157aa30_0 .var "miso_pin", 0 0; +v0x157aad0_0 .net "mosi", 0 0, v0x15785e0_0; 1 drivers +v0x157aba0_0 .net "mosi_pin", 0 0, v0x157b7d0_0; 1 drivers +v0x157ac70_0 .net "sclk_neg", 0 0, v0x1579260_0; 1 drivers +v0x157ad40_0 .net "sclk_pin", 0 0, v0x157b8c0_0; 1 drivers +v0x157ae10_0 .net "sclk_pos", 0 0, v0x1579430_0; 1 drivers +v0x157aeb0_0 .net "shift_pOut", 7 0, L_0x157b9f0; 1 drivers +v0x157afa0_0 .net "shift_sOut", 0 0, L_0x157ba60; 1 drivers +v0x157b150_0 .var "state", 2 0; +E_0x154cfb0 .event posedge, v0x1576fd0_0; +E_0x154d790 .event posedge, v0x1579260_0; +E_0x154d960 .event posedge, v0x1579430_0; +S_0x153b900 .scope module, "cscond" "inputconditioner" 3 35, 4 8 0, S_0x153fc80; + .timescale 0 0; + .port_info 0 /INPUT 1 "clk" + .port_info 1 /INPUT 1 "noisysignal" + .port_info 2 /OUTPUT 1 "conditioned" + .port_info 3 /OUTPUT 1 "positiveedge" + .port_info 4 /OUTPUT 1 "negativeedge" +P_0x153c790 .param/l "counterwidth" 0 4 17, +C4<00000000000000000000000000000011>; +P_0x153c7d0 .param/l "waittime" 0 4 18, +C4<00000000000000000000000000000011>; +v0x1533440_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers +v0x1576fd0_0 .var "conditioned", 0 0; +v0x1577090_0 .var "counter", 2 0; +v0x1577180_0 .var "negativeedge", 0 0; +v0x1577240_0 .net "noisysignal", 0 0, v0x157b3b0_0; alias, 1 drivers +v0x1577350_0 .var "positiveedge", 0 0; +v0x1577410_0 .var "synchronizer0", 0 0; +v0x15774d0_0 .var "synchronizer1", 0 0; +E_0x154dbd0 .event posedge, v0x1533440_0; +S_0x1577630 .scope module, "mem" "datamemory" 3 42, 5 8 0, S_0x153fc80; + .timescale 0 0; + .port_info 0 /INPUT 1 "clk" + .port_info 1 /OUTPUT 8 "dataOut" + .port_info 2 /INPUT 7 "address" + .port_info 3 /INPUT 1 "writeEnable" + .port_info 4 /INPUT 8 "dataIn" +P_0x1577820 .param/l "addresswidth" 0 5 10, +C4<00000000000000000000000000000111>; +P_0x1577860 .param/l "depth" 0 5 11, +C4<00000000000000000000000010000000>; +P_0x15778a0 .param/l "width" 0 5 12, +C4<00000000000000000000000000001000>; +v0x1577b00_0 .net "address", 6 0, v0x157a260_0; 1 drivers +v0x1577be0_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers +v0x1577cd0_0 .net "dataIn", 7 0, L_0x157b9f0; alias, 1 drivers +v0x1577da0_0 .var "dataOut", 7 0; +v0x1577e60 .array "memory", 0 127, 7 0; +v0x1577f70_0 .net "writeEnable", 0 0, v0x157a760_0; 1 drivers +S_0x15780d0 .scope module, "mosicond" "inputconditioner" 3 34, 4 8 0, S_0x153fc80; + .timescale 0 0; + .port_info 0 /INPUT 1 "clk" + .port_info 1 /INPUT 1 "noisysignal" + .port_info 2 /OUTPUT 1 "conditioned" + .port_info 3 /OUTPUT 1 "positiveedge" + .port_info 4 /OUTPUT 1 "negativeedge" +P_0x15782a0 .param/l "counterwidth" 0 4 17, +C4<00000000000000000000000000000011>; +P_0x15782e0 .param/l "waittime" 0 4 18, +C4<00000000000000000000000000000011>; +v0x15784f0_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers +v0x15785e0_0 .var "conditioned", 0 0; +v0x15786a0_0 .var "counter", 2 0; +v0x1578760_0 .var "negativeedge", 0 0; +v0x1578820_0 .net "noisysignal", 0 0, v0x157b7d0_0; alias, 1 drivers +v0x1578930_0 .var "positiveedge", 0 0; +v0x15789f0_0 .var "synchronizer0", 0 0; +v0x1578ab0_0 .var "synchronizer1", 0 0; +S_0x1578c10 .scope module, "sclkcond" "inputconditioner" 3 36, 4 8 0, S_0x153fc80; + .timescale 0 0; + .port_info 0 /INPUT 1 "clk" + .port_info 1 /INPUT 1 "noisysignal" + .port_info 2 /OUTPUT 1 "conditioned" + .port_info 3 /OUTPUT 1 "positiveedge" + .port_info 4 /OUTPUT 1 "negativeedge" +P_0x1578de0 .param/l "counterwidth" 0 4 17, +C4<00000000000000000000000000000011>; +P_0x1578e20 .param/l "waittime" 0 4 18, +C4<00000000000000000000000000000011>; +v0x1579050_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers +v0x15790f0_0 .var "conditioned", 0 0; +v0x1579190_0 .var "counter", 2 0; +v0x1579260_0 .var "negativeedge", 0 0; +v0x1579320_0 .net "noisysignal", 0 0, v0x157b8c0_0; alias, 1 drivers +v0x1579430_0 .var "positiveedge", 0 0; +v0x15794f0_0 .var "synchronizer0", 0 0; +v0x15795b0_0 .var "synchronizer1", 0 0; +S_0x1579710 .scope module, "shiftReg" "shiftregister" 3 39, 6 9 0, S_0x153fc80; + .timescale 0 0; + .port_info 0 /INPUT 1 "clk" + .port_info 1 /INPUT 1 "peripheralClkEdge" + .port_info 2 /INPUT 1 "parallelLoad" + .port_info 3 /INPUT 8 "parallelDataIn" + .port_info 4 /INPUT 1 "serialDataIn" + .port_info 5 /OUTPUT 8 "parallelDataOut" + .port_info 6 /OUTPUT 1 "serialDataOut" +P_0x1579930 .param/l "width" 0 6 10, +C4<00000000000000000000000000001000>; +L_0x157b9f0 .functor BUFZ 8, v0x157a060_0, C4<00000000>, C4<00000000>, C4<00000000>; +v0x1579ac0_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers +o0x7fa8681b38b8 .functor BUFZ 8, C4; HiZ drive +v0x1579bf0_0 .net "parallelDataIn", 7 0, o0x7fa8681b38b8; 0 drivers +v0x1579cf0_0 .net "parallelDataOut", 7 0, L_0x157b9f0; alias, 1 drivers +o0x7fa8681b38e8 .functor BUFZ 1, C4; HiZ drive +v0x1579dc0_0 .net "parallelLoad", 0 0, o0x7fa8681b38e8; 0 drivers +v0x1579e60_0 .net "peripheralClkEdge", 0 0, v0x1579430_0; alias, 1 drivers +o0x7fa8681b3918 .functor BUFZ 1, C4; HiZ drive +v0x1579f00_0 .net "serialDataIn", 0 0, o0x7fa8681b3918; 0 drivers +v0x1579fa0_0 .net "serialDataOut", 0 0, L_0x157ba60; alias, 1 drivers +v0x157a060_0 .var "shiftregistermem", 7 0; +L_0x157ba60 .part v0x157a060_0, 7, 1; + .scope S_0x15780d0; +T_0 ; + %pushi/vec4 0, 0, 3; + %store/vec4 v0x15786a0_0, 0, 3; + %end; + .thread T_0; + .scope S_0x15780d0; +T_1 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x15789f0_0, 0, 1; + %end; + .thread T_1; + .scope S_0x15780d0; +T_2 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1578ab0_0, 0, 1; + %end; + .thread T_2; + .scope S_0x15780d0; +T_3 ; + %wait E_0x154dbd0; + %load/vec4 v0x15785e0_0; + %load/vec4 v0x1578ab0_0; + %cmp/e; + %jmp/0xz T_3.0, 4; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x15786a0_0, 0; + %jmp T_3.1; +T_3.0 ; + %load/vec4 v0x15786a0_0; + %pad/u 32; + %cmpi/e 3, 0, 32; + %jmp/0xz T_3.2, 4; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x15786a0_0, 0; + %load/vec4 v0x1578ab0_0; + %assign/vec4 v0x15785e0_0, 0; + %load/vec4 v0x15785e0_0; + %inv; + %load/vec4 v0x1578ab0_0; + %and; + %assign/vec4 v0x1578930_0, 0; + %load/vec4 v0x1578ab0_0; + %inv; + %load/vec4 v0x15785e0_0; + %and; + %assign/vec4 v0x1578760_0, 0; + %jmp T_3.3; +T_3.2 ; + %load/vec4 v0x15786a0_0; + %addi 1, 0, 3; + %assign/vec4 v0x15786a0_0, 0; +T_3.3 ; +T_3.1 ; + %load/vec4 v0x1578930_0; + %flag_set/vec4 8; + %jmp/0xz T_3.4, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x1578930_0, 0; +T_3.4 ; + %load/vec4 v0x1578760_0; + %flag_set/vec4 8; + %jmp/0xz T_3.6, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x1578760_0, 0; +T_3.6 ; + %load/vec4 v0x1578820_0; + %assign/vec4 v0x15789f0_0, 0; + %load/vec4 v0x15789f0_0; + %assign/vec4 v0x1578ab0_0, 0; + %jmp T_3; + .thread T_3; + .scope S_0x153b900; +T_4 ; + %pushi/vec4 0, 0, 3; + %store/vec4 v0x1577090_0, 0, 3; + %end; + .thread T_4; + .scope S_0x153b900; +T_5 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1577410_0, 0, 1; + %end; + .thread T_5; + .scope S_0x153b900; +T_6 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x15774d0_0, 0, 1; + %end; + .thread T_6; + .scope S_0x153b900; +T_7 ; + %wait E_0x154dbd0; + %load/vec4 v0x1576fd0_0; + %load/vec4 v0x15774d0_0; + %cmp/e; + %jmp/0xz T_7.0, 4; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x1577090_0, 0; + %jmp T_7.1; +T_7.0 ; + %load/vec4 v0x1577090_0; + %pad/u 32; + %cmpi/e 3, 0, 32; + %jmp/0xz T_7.2, 4; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x1577090_0, 0; + %load/vec4 v0x15774d0_0; + %assign/vec4 v0x1576fd0_0, 0; + %load/vec4 v0x1576fd0_0; + %inv; + %load/vec4 v0x15774d0_0; + %and; + %assign/vec4 v0x1577350_0, 0; + %load/vec4 v0x15774d0_0; + %inv; + %load/vec4 v0x1576fd0_0; + %and; + %assign/vec4 v0x1577180_0, 0; + %jmp T_7.3; +T_7.2 ; + %load/vec4 v0x1577090_0; + %addi 1, 0, 3; + %assign/vec4 v0x1577090_0, 0; +T_7.3 ; +T_7.1 ; + %load/vec4 v0x1577350_0; + %flag_set/vec4 8; + %jmp/0xz T_7.4, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x1577350_0, 0; +T_7.4 ; + %load/vec4 v0x1577180_0; + %flag_set/vec4 8; + %jmp/0xz T_7.6, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x1577180_0, 0; +T_7.6 ; + %load/vec4 v0x1577240_0; + %assign/vec4 v0x1577410_0, 0; + %load/vec4 v0x1577410_0; + %assign/vec4 v0x15774d0_0, 0; + %jmp T_7; + .thread T_7; + .scope S_0x1578c10; +T_8 ; + %pushi/vec4 0, 0, 3; + %store/vec4 v0x1579190_0, 0, 3; + %end; + .thread T_8; + .scope S_0x1578c10; +T_9 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x15794f0_0, 0, 1; + %end; + .thread T_9; + .scope S_0x1578c10; +T_10 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x15795b0_0, 0, 1; + %end; + .thread T_10; + .scope S_0x1578c10; +T_11 ; + %wait E_0x154dbd0; + %load/vec4 v0x15790f0_0; + %load/vec4 v0x15795b0_0; + %cmp/e; + %jmp/0xz T_11.0, 4; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x1579190_0, 0; + %jmp T_11.1; +T_11.0 ; + %load/vec4 v0x1579190_0; + %pad/u 32; + %cmpi/e 3, 0, 32; + %jmp/0xz T_11.2, 4; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x1579190_0, 0; + %load/vec4 v0x15795b0_0; + %assign/vec4 v0x15790f0_0, 0; + %load/vec4 v0x15790f0_0; + %inv; + %load/vec4 v0x15795b0_0; + %and; + %assign/vec4 v0x1579430_0, 0; + %load/vec4 v0x15795b0_0; + %inv; + %load/vec4 v0x15790f0_0; + %and; + %assign/vec4 v0x1579260_0, 0; + %jmp T_11.3; +T_11.2 ; + %load/vec4 v0x1579190_0; + %addi 1, 0, 3; + %assign/vec4 v0x1579190_0, 0; +T_11.3 ; +T_11.1 ; + %load/vec4 v0x1579430_0; + %flag_set/vec4 8; + %jmp/0xz T_11.4, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x1579430_0, 0; +T_11.4 ; + %load/vec4 v0x1579260_0; + %flag_set/vec4 8; + %jmp/0xz T_11.6, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x1579260_0, 0; +T_11.6 ; + %load/vec4 v0x1579320_0; + %assign/vec4 v0x15794f0_0, 0; + %load/vec4 v0x15794f0_0; + %assign/vec4 v0x15795b0_0, 0; + %jmp T_11; + .thread T_11; + .scope S_0x1579710; +T_12 ; + %wait E_0x154dbd0; + %load/vec4 v0x1579dc0_0; + %flag_set/vec4 8; + %jmp/0xz T_12.0, 8; + %load/vec4 v0x1579bf0_0; + %assign/vec4 v0x157a060_0, 0; + %jmp T_12.1; +T_12.0 ; + %load/vec4 v0x1579e60_0; + %flag_set/vec4 8; + %jmp/0xz T_12.2, 8; + %load/vec4 v0x157a060_0; + %parti/s 7, 0, 2; + %load/vec4 v0x1579f00_0; + %concat/vec4; draw_concat_vec4 + %assign/vec4 v0x157a060_0, 0; +T_12.2 ; +T_12.1 ; + %jmp T_12; + .thread T_12; + .scope S_0x1577630; +T_13 ; + %wait E_0x154dbd0; + %load/vec4 v0x1577f70_0; + %flag_set/vec4 8; + %jmp/0xz T_13.0, 8; + %load/vec4 v0x1577cd0_0; + %load/vec4 v0x1577b00_0; + %pad/u 9; + %ix/vec4 3; + %ix/load 4, 0, 0; Constant delay + %assign/vec4/a/d v0x1577e60, 0, 4; +T_13.0 ; + %load/vec4 v0x1577b00_0; + %pad/u 9; + %ix/vec4 4; + %load/vec4a v0x1577e60, 4; + %assign/vec4 v0x1577da0_0, 0; + %jmp T_13; + .thread T_13; + .scope S_0x153fc80; +T_14 ; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x157b150_0, 0; + %pushi/vec4 0, 0, 7; + %assign/vec4 v0x157a260_0, 0; + %pushi/vec4 0, 0, 5; + %assign/vec4 v0x157a370_0, 0; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x157a830_0, 0; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x157a760_0, 0; + %end; + .thread T_14; + .scope S_0x153fc80; +T_15 ; + %wait E_0x154d960; + %load/vec4 v0x157a500_0; + %nor/r; + %flag_set/vec4 8; + %jmp/0xz T_15.0, 8; + %load/vec4 v0x157b150_0; + %cmpi/e 0, 0, 3; + %jmp/0xz T_15.2, 4; + %load/vec4 v0x157a370_0; + %addi 1, 0, 5; + %store/vec4 v0x157a370_0, 0, 5; + %load/vec4 v0x157a370_0; + %pad/u 32; + %cmpi/e 7, 0, 32; + %jmp/0xz T_15.4, 4; + %pushi/vec4 1, 0, 3; + %assign/vec4 v0x157b150_0, 0; + %load/vec4 v0x157aeb0_0; + %parti/s 7, 0, 2; + %assign/vec4 v0x157a260_0, 0; +T_15.4 ; +T_15.2 ; + %load/vec4 v0x157b150_0; + %cmpi/e 3, 0, 3; + %jmp/0xz T_15.6, 4; + %load/vec4 v0x157a370_0; + %addi 1, 0, 5; + %store/vec4 v0x157a370_0, 0, 5; + %load/vec4 v0x157a370_0; + %pad/u 32; + %cmpi/e 8, 0, 32; + %jmp/0xz T_15.8, 4; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x157a760_0, 0; + %load/vec4 v0x157a260_0; + %addi 1, 0, 7; + %assign/vec4 v0x157a260_0, 0; +T_15.8 ; +T_15.6 ; + %load/vec4 v0x157b150_0; + %cmpi/e 1, 0, 3; + %jmp/0xz T_15.10, 4; + %load/vec4 v0x157aeb0_0; + %parti/s 1, 0, 2; + %pad/u 32; + %cmpi/e 1, 0, 32; + %jmp/0xz T_15.12, 4; + %pushi/vec4 3, 0, 3; + %assign/vec4 v0x157b150_0, 0; +T_15.12 ; + %load/vec4 v0x157aeb0_0; + %parti/s 1, 0, 2; + %pad/u 32; + %cmpi/e 0, 0, 32; + %jmp/0xz T_15.14, 4; + %pushi/vec4 2, 0, 3; + %assign/vec4 v0x157b150_0, 0; + %pushi/vec4 1, 0, 1; + %assign/vec4 v0x157a830_0, 0; +T_15.14 ; + %pushi/vec4 0, 0, 5; + %assign/vec4 v0x157a370_0, 0; +T_15.10 ; +T_15.0 ; + %jmp T_15; + .thread T_15; + .scope S_0x153fc80; +T_16 ; + %wait E_0x154d790; + %load/vec4 v0x157a760_0; + %flag_set/vec4 8; + %jmp/0xz T_16.0, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x157a760_0, 0; +T_16.0 ; + %load/vec4 v0x157a830_0; + %flag_set/vec4 8; + %jmp/0xz T_16.2, 8; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x157a830_0, 0; +T_16.2 ; + %load/vec4 v0x157a500_0; + %nor/r; + %flag_set/vec4 8; + %jmp/0xz T_16.4, 8; + %load/vec4 v0x157b150_0; + %cmpi/e 2, 0, 3; + %jmp/0xz T_16.6, 4; + %load/vec4 v0x157afa0_0; + %assign/vec4 v0x157aa30_0, 0; + %load/vec4 v0x157a370_0; + %addi 1, 0, 5; + %store/vec4 v0x157a370_0, 0, 5; +T_16.6 ; +T_16.4 ; + %jmp T_16; + .thread T_16; + .scope S_0x153fc80; +T_17 ; + %wait E_0x154cfb0; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x157b150_0, 0; + %pushi/vec4 0, 0, 5; + %assign/vec4 v0x157a370_0, 0; + %pushi/vec4 0, 1, 1; + %assign/vec4 v0x157aa30_0, 0; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x157a760_0, 0; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x157a830_0, 0; + %jmp T_17; + .thread T_17; + .scope S_0x153fb00; +T_18 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b2f0_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b3b0_0, 0, 1; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b7d0_0, 0, 1; + %end; + .thread T_18; + .scope S_0x153fb00; +T_19 ; + %pushi/vec4 85, 0, 7; + %store/vec4 v0x157b1f0_0, 0, 7; + %pushi/vec4 240, 0, 8; + %store/vec4 v0x157b4a0_0, 0, 8; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x157b650_0, 0, 32; +T_19.0 ; + %load/vec4 v0x157b650_0; + %cmpi/u 7, 0, 32; + %jmp/0xz T_19.1, 5; + %load/vec4 v0x157b1f0_0; + %load/vec4 v0x157b650_0; + %part/u 1; + %store/vec4 v0x157b7d0_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %delay 100, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %load/vec4 v0x157b650_0; + %addi 1, 0, 32; + %store/vec4 v0x157b650_0, 0, 32; + %jmp T_19.0; +T_19.1 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b7d0_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %delay 100, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x157b650_0, 0, 32; +T_19.2 ; + %load/vec4 v0x157b650_0; + %cmpi/u 8, 0, 32; + %jmp/0xz T_19.3, 5; + %load/vec4 v0x157b4a0_0; + %load/vec4 v0x157b650_0; + %part/u 1; + %store/vec4 v0x157b7d0_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %delay 100, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %load/vec4 v0x157b650_0; + %addi 1, 0, 32; + %store/vec4 v0x157b650_0, 0, 32; + %jmp T_19.2; +T_19.3 ; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x157b650_0, 0, 32; +T_19.4 ; + %load/vec4 v0x157b650_0; + %cmpi/u 7, 0, 32; + %jmp/0xz T_19.5, 5; + %load/vec4 v0x157b1f0_0; + %load/vec4 v0x157b650_0; + %part/u 1; + %store/vec4 v0x157b7d0_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %delay 100, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %load/vec4 v0x157b650_0; + %addi 1, 0, 32; + %store/vec4 v0x157b650_0, 0, 32; + %jmp T_19.4; +T_19.5 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b7d0_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %delay 100, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x157b650_0, 0, 32; +T_19.6 ; + %load/vec4 v0x157b650_0; + %cmpi/u 8, 0, 32; + %jmp/0xz T_19.7, 5; + %load/vec4 v0x157b730_0; + %load/vec4 v0x157b4a0_0; + %load/vec4 v0x157b650_0; + %part/u 1; + %cmp/ne; + %jmp/0xz T_19.8, 4; + %vpi_call 2 75 "$display", "read byte is different from written byte" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b540_0, 0, 1; +T_19.8 ; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %delay 100, 0; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x157b8c0_0, 0, 1; + %load/vec4 v0x157b650_0; + %addi 1, 0, 32; + %store/vec4 v0x157b650_0, 0, 32; + %jmp T_19.6; +T_19.7 ; + %load/vec4 v0x157b540_0; + %flag_set/vec4 8; + %jmp/0xz T_19.10, 8; + %vpi_call 2 85 "$display", "DUT passed" {0 0 0}; + %jmp T_19.11; +T_19.10 ; + %vpi_call 2 88 "$display", "DUT failed" {0 0 0}; +T_19.11 ; + %end; + .thread T_19; +# The file index is used to find the file name in the following table. +:file_names 7; + "N/A"; + ""; + "spimemory.t.v"; + "./spimemory.v"; + "./inputconditioner.v"; + "./datamemory.v"; + "./shiftregister.v"; diff --git a/spimemory.t.v b/spimemory.t.v index f50502d..1f109da 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -14,11 +14,11 @@ module testMemory(); reg [7:0] data; reg dutpassed; reg[31:0] i; - - spiMemory dut(.clk(clk), - .sclk_pin(sclk_pin), + + spiMemory dut(.clk(clk), + .sclk_pin(sclk_pin), .cs_pin(cs_pin), - .mosi_pin(mosi_pin), + .mosi_pin(mosi_pin), .miso_pin(miso_pin)); initial begin @@ -37,10 +37,10 @@ module testMemory(); end cs_pin = 0; #100 - + address = 7'b1010101; data = 8'b11110000; - + //write address for(i=0; i < 7; i=i+1) begin mosi_pin = address[i]; @@ -48,13 +48,13 @@ module testMemory(); #100; sclk_pin = 0; end - + //set write mosi_pin = 0; sclk_pin = 1; #100; sclk_pin = 0; - + //write data for(i=0; i < 8; i=i+1) begin mosi_pin = data[i]; diff --git a/spimemory.v b/spimemory.v index c6ed4f7..e173251 100644 --- a/spimemory.v +++ b/spimemory.v @@ -1,17 +1,108 @@ //------------------------------------------------------------------------ // SPI Memory //------------------------------------------------------------------------ +`define READ_ADDRESS 2'd0 +`define READ_WR 2'd1 +`define WRITE_DATA 2'd2 +`define READ_DATA 2'd3 +`include "shiftregister.v" +`include "inputconditioner.v" +`include "datamemory.v" 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 + output reg miso_pin, // SPI master in slave out input mosi_pin, // SPI master out slave in output [3:0] leds // LEDs for debugging -) +); +wire mosi; +wire cs; +wire sclk_neg; +wire sclk_pos; +wire[7:0] shift_pOut; +wire shift_sOut; +wire[7:0] mem_out; +reg[6:0] addressReg; +reg[2:0] state; +reg[4:0] bitsTx; +reg load_shift; +reg load_mem; +inputconditioner mosicond(.clk(clk), .noisysignal(mosi_pin), .conditioned(mosi)); +inputconditioner cscond( .clk(clk), .noisysignal(cs_pin), .conditioned(cs)); +inputconditioner sclkcond(.clk(clk), .noisysignal(sclk_pin), + .positiveedge(sclk_pos), .negativeedge(sclk_neg)); + +shiftregister shiftReg(.clk(clk), .peripheralClkEdge(sclk_pos), + .parallelDataOut(shift_pOut), .serialDataOut(shift_sOut) + ); +datamemory mem(.clk(clk), + .dataOut(mem_out), + .address(addressReg), + .writeEnable(load_mem), + .dataIn(shift_pOut)); + +initial begin + state <= `READ_ADDRESS; + addressReg <= 7'd0; + bitsTx <= 4'd0; + load_shift <= 0; + load_mem <= 0; +end + +always @(posedge sclk_pos) begin + if(!cs) begin + if(state == `READ_ADDRESS) begin + bitsTx = bitsTx + 1; + if(bitsTx == 7) begin + state <= `READ_WR; + addressReg <= shift_pOut[6:0]; + end + end + if(state == `READ_DATA) begin + bitsTx = bitsTx + 1; + if(bitsTx == 8) begin + load_mem <= 0; + addressReg <= addressReg + 1;//Not defined in the spec, but useful + end + end + if(state == `READ_WR) begin + if(shift_pOut[0] == 1) begin + state <= `READ_DATA; + end + if(shift_pOut[0] == 0) begin + state <= `WRITE_DATA; + load_shift <= 1; + end + bitsTx <= 4'd0; + end + end +end + +always @ (posedge sclk_neg) begin + if(load_mem) begin + load_mem <= 0; + end + if(load_shift) begin + load_shift <= 0; + end + if(!cs) begin + if(state == `WRITE_DATA) begin + miso_pin <= shift_sOut; + bitsTx = bitsTx + 1; + end + end +end + +always @(posedge cs) begin + state <= `READ_ADDRESS; + bitsTx <= 4'd0; + miso_pin <= 'z; + load_mem <= 0; + load_shift <= 0; +end endmodule - From 002eb59c352816f45d7a538266b409e8833492d7 Mon Sep 17 00:00:00 2001 From: Tobias Shapinsky Date: Wed, 1 Nov 2017 21:07:51 -0400 Subject: [PATCH 14/20] typo --- spimemory.t.v | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spimemory.t.v b/spimemory.t.v index f662b91..1ffbb5f 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -35,7 +35,7 @@ module testMemory(); cs_pin = 1; #100; if(miso_pin !== 'z) begin - $display("chip not in Z state when CS is low"); + $display("chip not in Z state when CS is high"); dutpassed = 0; end cs_pin = 0; From 0431499c240fd978bbd35d0f58369cf35435d611 Mon Sep 17 00:00:00 2001 From: Tobias Shapinsky Date: Wed, 1 Nov 2017 21:14:47 -0400 Subject: [PATCH 15/20] fixed thing --- spimemory.t.v | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/spimemory.t.v b/spimemory.t.v index 1ffbb5f..06c93e3 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -21,15 +21,14 @@ module testMemory(); .mosi_pin(mosi_pin), .miso_pin(miso_pin)); + initial clk = 0; + + always #10 clk = !clk; + initial begin - clk = 0; sclk_pin = 0; cs_pin = 0; mosi_pin = 0; - end - //always #10 clk != clk; - - initial begin dutpassed = 1; cs_pin = 1; @@ -50,6 +49,7 @@ module testMemory(); sclk_pin = 1; #100; sclk_pin = 0; + #100; end //set write @@ -57,6 +57,8 @@ module testMemory(); sclk_pin = 1; #100; sclk_pin = 0; + #100; + //write data for(i=0; i < 8; i=i+1) begin @@ -64,6 +66,8 @@ module testMemory(); sclk_pin = 1; #100; sclk_pin = 0; + #100; + end //write address @@ -72,6 +76,8 @@ module testMemory(); sclk_pin = 1; #100; sclk_pin = 0; + #100; + end //set read @@ -79,6 +85,7 @@ module testMemory(); sclk_pin = 1; #100; sclk_pin = 0; + #100; //read data for(i=0; i < 8; i=i+1) begin @@ -89,6 +96,7 @@ module testMemory(); sclk_pin = 1; #100; sclk_pin = 0; + #100; end $display("DUT passed"); From f6f087ae8f58cd6a9ee99bcda131481294e4b186 Mon Sep 17 00:00:00 2001 From: Henry Rachootin Date: Wed, 1 Nov 2017 21:15:01 -0400 Subject: [PATCH 16/20] aslkljdhkjlsdf --- spimem | 686 ++++++++++++++++++++++++++------------------------ spimem.vcd | 231 +++++++++++++++++ spimemory.t.v | 6 +- spimemory.v | 1 + 4 files changed, 591 insertions(+), 333 deletions(-) create mode 100644 spimem.vcd diff --git a/spimem b/spimem index 109b944..e0a4ea3 100755 --- a/spimem +++ b/spimem @@ -6,18 +6,19 @@ :vpi_module "vhdl_sys"; :vpi_module "v2005_math"; :vpi_module "va_math"; -S_0x153fb00 .scope module, "testMemory" "testMemory" 2 6; +S_0x1b0ab00 .scope module, "testMemory" "testMemory" 2 6; .timescale 0 0; -v0x157b1f0_0 .var "address", 6 0; -v0x157b2f0_0 .var "clk", 0 0; -v0x157b3b0_0 .var "cs_pin", 0 0; -v0x157b4a0_0 .var "data", 7 0; -v0x157b540_0 .var "dutpassed", 0 0; -v0x157b650_0 .var "i", 31 0; -v0x157b730_0 .net "miso_pin", 0 0, v0x157aa30_0; 1 drivers -v0x157b7d0_0 .var "mosi_pin", 0 0; -v0x157b8c0_0 .var "sclk_pin", 0 0; -S_0x153fc80 .scope module, "dut" "spiMemory" 2 18, 3 12 0, S_0x153fb00; +v0x1b48860_0 .var "address", 6 0; +v0x1b48960_0 .var "clk", 0 0; +v0x1b48a20_0 .var "cs_pin", 0 0; +v0x1b48b10_0 .var "data", 7 0; +v0x1b48bb0_0 .var "dutpassed", 0 0; +v0x1b48cc0_0 .var "i", 31 0; +v0x1b48da0_0 .net "miso_pin", 0 0, v0x1b480a0_0; 1 drivers +v0x1b48e40_0 .var "mosi_pin", 0 0; +v0x1b48f30_0 .var "sclk_pin", 0 0; +E_0x1b17e60 .event negedge, v0x1b48bb0_0; +S_0x1b0ac80 .scope module, "dut" "spiMemory" 2 18, 3 12 0, S_0x1b0ab00; .timescale 0 0; .port_info 0 /INPUT 1 "clk" .port_info 1 /INPUT 1 "sclk_pin" @@ -25,97 +26,97 @@ S_0x153fc80 .scope module, "dut" "spiMemory" 2 18, 3 12 0, S_0x153fb00; .port_info 3 /OUTPUT 1 "miso_pin" .port_info 4 /INPUT 1 "mosi_pin" .port_info 5 /OUTPUT 4 "leds" -v0x157a260_0 .var "addressReg", 6 0; -v0x157a370_0 .var "bitsTx", 4 0; -v0x157a430_0 .net "clk", 0 0, v0x157b2f0_0; 1 drivers -v0x157a500_0 .net "cs", 0 0, v0x1576fd0_0; 1 drivers -v0x157a5d0_0 .net "cs_pin", 0 0, v0x157b3b0_0; 1 drivers -o0x7fa8681b3b28 .functor BUFZ 4, C4; HiZ drive -v0x157a6c0_0 .net "leds", 3 0, o0x7fa8681b3b28; 0 drivers -v0x157a760_0 .var "load_mem", 0 0; -v0x157a830_0 .var "load_shift", 0 0; -v0x157a8d0_0 .net "mem_out", 7 0, v0x1577da0_0; 1 drivers -v0x157aa30_0 .var "miso_pin", 0 0; -v0x157aad0_0 .net "mosi", 0 0, v0x15785e0_0; 1 drivers -v0x157aba0_0 .net "mosi_pin", 0 0, v0x157b7d0_0; 1 drivers -v0x157ac70_0 .net "sclk_neg", 0 0, v0x1579260_0; 1 drivers -v0x157ad40_0 .net "sclk_pin", 0 0, v0x157b8c0_0; 1 drivers -v0x157ae10_0 .net "sclk_pos", 0 0, v0x1579430_0; 1 drivers -v0x157aeb0_0 .net "shift_pOut", 7 0, L_0x157b9f0; 1 drivers -v0x157afa0_0 .net "shift_sOut", 0 0, L_0x157ba60; 1 drivers -v0x157b150_0 .var "state", 2 0; -E_0x154cfb0 .event posedge, v0x1576fd0_0; -E_0x154d790 .event posedge, v0x1579260_0; -E_0x154d960 .event posedge, v0x1579430_0; -S_0x153b900 .scope module, "cscond" "inputconditioner" 3 35, 4 8 0, S_0x153fc80; +v0x1b478d0_0 .var "addressReg", 6 0; +v0x1b479e0_0 .var "bitsTx", 4 0; +v0x1b47aa0_0 .net "clk", 0 0, v0x1b48960_0; 1 drivers +v0x1b47b70_0 .net "cs", 0 0, v0x1b44650_0; 1 drivers +v0x1b47c40_0 .net "cs_pin", 0 0, v0x1b48a20_0; 1 drivers +o0x7fac247edb28 .functor BUFZ 4, C4; HiZ drive +v0x1b47d30_0 .net "leds", 3 0, o0x7fac247edb28; 0 drivers +v0x1b47dd0_0 .var "load_mem", 0 0; +v0x1b47ea0_0 .var "load_shift", 0 0; +v0x1b47f40_0 .net "mem_out", 7 0, v0x1b45450_0; 1 drivers +v0x1b480a0_0 .var "miso_pin", 0 0; +v0x1b48140_0 .net "mosi", 0 0, v0x1b45c90_0; 1 drivers +v0x1b48210_0 .net "mosi_pin", 0 0, v0x1b48e40_0; 1 drivers +v0x1b482e0_0 .net "sclk_neg", 0 0, v0x1b46910_0; 1 drivers +v0x1b483b0_0 .net "sclk_pin", 0 0, v0x1b48f30_0; 1 drivers +v0x1b48480_0 .net "sclk_pos", 0 0, v0x1b46ae0_0; 1 drivers +v0x1b48520_0 .net "shift_pOut", 7 0, L_0x1b49060; 1 drivers +v0x1b48610_0 .net "shift_sOut", 0 0, L_0x1b490d0; 1 drivers +v0x1b487c0_0 .var "state", 2 0; +E_0x1b18920 .event posedge, v0x1b44650_0; +E_0x1b18af0 .event posedge, v0x1b46910_0; +E_0x1b18d60 .event posedge, v0x1b46ae0_0; +S_0x1b06900 .scope module, "cscond" "inputconditioner" 3 35, 4 8 0, S_0x1b0ac80; .timescale 0 0; .port_info 0 /INPUT 1 "clk" .port_info 1 /INPUT 1 "noisysignal" .port_info 2 /OUTPUT 1 "conditioned" .port_info 3 /OUTPUT 1 "positiveedge" .port_info 4 /OUTPUT 1 "negativeedge" -P_0x153c790 .param/l "counterwidth" 0 4 17, +C4<00000000000000000000000000000011>; -P_0x153c7d0 .param/l "waittime" 0 4 18, +C4<00000000000000000000000000000011>; -v0x1533440_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers -v0x1576fd0_0 .var "conditioned", 0 0; -v0x1577090_0 .var "counter", 2 0; -v0x1577180_0 .var "negativeedge", 0 0; -v0x1577240_0 .net "noisysignal", 0 0, v0x157b3b0_0; alias, 1 drivers -v0x1577350_0 .var "positiveedge", 0 0; -v0x1577410_0 .var "synchronizer0", 0 0; -v0x15774d0_0 .var "synchronizer1", 0 0; -E_0x154dbd0 .event posedge, v0x1533440_0; -S_0x1577630 .scope module, "mem" "datamemory" 3 42, 5 8 0, S_0x153fc80; +P_0x1b07790 .param/l "counterwidth" 0 4 17, +C4<00000000000000000000000000000011>; +P_0x1b077d0 .param/l "waittime" 0 4 18, +C4<00000000000000000000000000000011>; +v0x1afe470_0 .net "clk", 0 0, v0x1b48960_0; alias, 1 drivers +v0x1b44650_0 .var "conditioned", 0 0; +v0x1b44710_0 .var "counter", 2 0; +v0x1b44800_0 .var "negativeedge", 0 0; +v0x1b448c0_0 .net "noisysignal", 0 0, v0x1b48a20_0; alias, 1 drivers +v0x1b449d0_0 .var "positiveedge", 0 0; +v0x1b44a90_0 .var "synchronizer0", 0 0; +v0x1b44b50_0 .var "synchronizer1", 0 0; +E_0x1b182a0 .event posedge, v0x1afe470_0; +S_0x1b44cb0 .scope module, "mem" "datamemory" 3 42, 5 8 0, S_0x1b0ac80; .timescale 0 0; .port_info 0 /INPUT 1 "clk" .port_info 1 /OUTPUT 8 "dataOut" .port_info 2 /INPUT 7 "address" .port_info 3 /INPUT 1 "writeEnable" .port_info 4 /INPUT 8 "dataIn" -P_0x1577820 .param/l "addresswidth" 0 5 10, +C4<00000000000000000000000000000111>; -P_0x1577860 .param/l "depth" 0 5 11, +C4<00000000000000000000000010000000>; -P_0x15778a0 .param/l "width" 0 5 12, +C4<00000000000000000000000000001000>; -v0x1577b00_0 .net "address", 6 0, v0x157a260_0; 1 drivers -v0x1577be0_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers -v0x1577cd0_0 .net "dataIn", 7 0, L_0x157b9f0; alias, 1 drivers -v0x1577da0_0 .var "dataOut", 7 0; -v0x1577e60 .array "memory", 0 127, 7 0; -v0x1577f70_0 .net "writeEnable", 0 0, v0x157a760_0; 1 drivers -S_0x15780d0 .scope module, "mosicond" "inputconditioner" 3 34, 4 8 0, S_0x153fc80; +P_0x1b44ea0 .param/l "addresswidth" 0 5 10, +C4<00000000000000000000000000000111>; +P_0x1b44ee0 .param/l "depth" 0 5 11, +C4<00000000000000000000000010000000>; +P_0x1b44f20 .param/l "width" 0 5 12, +C4<00000000000000000000000000001000>; +v0x1b45210_0 .net "address", 6 0, v0x1b478d0_0; 1 drivers +v0x1b452b0_0 .net "clk", 0 0, v0x1b48960_0; alias, 1 drivers +v0x1b45380_0 .net "dataIn", 7 0, L_0x1b49060; alias, 1 drivers +v0x1b45450_0 .var "dataOut", 7 0; +v0x1b45510 .array "memory", 0 127, 7 0; +v0x1b45620_0 .net "writeEnable", 0 0, v0x1b47dd0_0; 1 drivers +S_0x1b45780 .scope module, "mosicond" "inputconditioner" 3 34, 4 8 0, S_0x1b0ac80; .timescale 0 0; .port_info 0 /INPUT 1 "clk" .port_info 1 /INPUT 1 "noisysignal" .port_info 2 /OUTPUT 1 "conditioned" .port_info 3 /OUTPUT 1 "positiveedge" .port_info 4 /OUTPUT 1 "negativeedge" -P_0x15782a0 .param/l "counterwidth" 0 4 17, +C4<00000000000000000000000000000011>; -P_0x15782e0 .param/l "waittime" 0 4 18, +C4<00000000000000000000000000000011>; -v0x15784f0_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers -v0x15785e0_0 .var "conditioned", 0 0; -v0x15786a0_0 .var "counter", 2 0; -v0x1578760_0 .var "negativeedge", 0 0; -v0x1578820_0 .net "noisysignal", 0 0, v0x157b7d0_0; alias, 1 drivers -v0x1578930_0 .var "positiveedge", 0 0; -v0x15789f0_0 .var "synchronizer0", 0 0; -v0x1578ab0_0 .var "synchronizer1", 0 0; -S_0x1578c10 .scope module, "sclkcond" "inputconditioner" 3 36, 4 8 0, S_0x153fc80; +P_0x1b45950 .param/l "counterwidth" 0 4 17, +C4<00000000000000000000000000000011>; +P_0x1b45990 .param/l "waittime" 0 4 18, +C4<00000000000000000000000000000011>; +v0x1b45ba0_0 .net "clk", 0 0, v0x1b48960_0; alias, 1 drivers +v0x1b45c90_0 .var "conditioned", 0 0; +v0x1b45d50_0 .var "counter", 2 0; +v0x1b45e10_0 .var "negativeedge", 0 0; +v0x1b45ed0_0 .net "noisysignal", 0 0, v0x1b48e40_0; alias, 1 drivers +v0x1b45fe0_0 .var "positiveedge", 0 0; +v0x1b460a0_0 .var "synchronizer0", 0 0; +v0x1b46160_0 .var "synchronizer1", 0 0; +S_0x1b462c0 .scope module, "sclkcond" "inputconditioner" 3 36, 4 8 0, S_0x1b0ac80; .timescale 0 0; .port_info 0 /INPUT 1 "clk" .port_info 1 /INPUT 1 "noisysignal" .port_info 2 /OUTPUT 1 "conditioned" .port_info 3 /OUTPUT 1 "positiveedge" .port_info 4 /OUTPUT 1 "negativeedge" -P_0x1578de0 .param/l "counterwidth" 0 4 17, +C4<00000000000000000000000000000011>; -P_0x1578e20 .param/l "waittime" 0 4 18, +C4<00000000000000000000000000000011>; -v0x1579050_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers -v0x15790f0_0 .var "conditioned", 0 0; -v0x1579190_0 .var "counter", 2 0; -v0x1579260_0 .var "negativeedge", 0 0; -v0x1579320_0 .net "noisysignal", 0 0, v0x157b8c0_0; alias, 1 drivers -v0x1579430_0 .var "positiveedge", 0 0; -v0x15794f0_0 .var "synchronizer0", 0 0; -v0x15795b0_0 .var "synchronizer1", 0 0; -S_0x1579710 .scope module, "shiftReg" "shiftregister" 3 39, 6 9 0, S_0x153fc80; +P_0x1b46490 .param/l "counterwidth" 0 4 17, +C4<00000000000000000000000000000011>; +P_0x1b464d0 .param/l "waittime" 0 4 18, +C4<00000000000000000000000000000011>; +v0x1b46700_0 .net "clk", 0 0, v0x1b48960_0; alias, 1 drivers +v0x1b467a0_0 .var "conditioned", 0 0; +v0x1b46840_0 .var "counter", 2 0; +v0x1b46910_0 .var "negativeedge", 0 0; +v0x1b469d0_0 .net "noisysignal", 0 0, v0x1b48f30_0; alias, 1 drivers +v0x1b46ae0_0 .var "positiveedge", 0 0; +v0x1b46ba0_0 .var "synchronizer0", 0 0; +v0x1b46c60_0 .var "synchronizer1", 0 0; +S_0x1b46dc0 .scope module, "shiftReg" "shiftregister" 3 39, 6 9 0, S_0x1b0ac80; .timescale 0 0; .port_info 0 /INPUT 1 "clk" .port_info 1 /INPUT 1 "peripheralClkEdge" @@ -124,534 +125,557 @@ S_0x1579710 .scope module, "shiftReg" "shiftregister" 3 39, 6 9 0, S_0x153fc80; .port_info 4 /INPUT 1 "serialDataIn" .port_info 5 /OUTPUT 8 "parallelDataOut" .port_info 6 /OUTPUT 1 "serialDataOut" -P_0x1579930 .param/l "width" 0 6 10, +C4<00000000000000000000000000001000>; -L_0x157b9f0 .functor BUFZ 8, v0x157a060_0, C4<00000000>, C4<00000000>, C4<00000000>; -v0x1579ac0_0 .net "clk", 0 0, v0x157b2f0_0; alias, 1 drivers -o0x7fa8681b38b8 .functor BUFZ 8, C4; HiZ drive -v0x1579bf0_0 .net "parallelDataIn", 7 0, o0x7fa8681b38b8; 0 drivers -v0x1579cf0_0 .net "parallelDataOut", 7 0, L_0x157b9f0; alias, 1 drivers -o0x7fa8681b38e8 .functor BUFZ 1, C4; HiZ drive -v0x1579dc0_0 .net "parallelLoad", 0 0, o0x7fa8681b38e8; 0 drivers -v0x1579e60_0 .net "peripheralClkEdge", 0 0, v0x1579430_0; alias, 1 drivers -o0x7fa8681b3918 .functor BUFZ 1, C4; HiZ drive -v0x1579f00_0 .net "serialDataIn", 0 0, o0x7fa8681b3918; 0 drivers -v0x1579fa0_0 .net "serialDataOut", 0 0, L_0x157ba60; alias, 1 drivers -v0x157a060_0 .var "shiftregistermem", 7 0; -L_0x157ba60 .part v0x157a060_0, 7, 1; - .scope S_0x15780d0; +P_0x1b46fe0 .param/l "width" 0 6 10, +C4<00000000000000000000000000001000>; +L_0x1b49060 .functor BUFZ 8, v0x1b476d0_0, C4<00000000>, C4<00000000>, C4<00000000>; +v0x1b47130_0 .net "clk", 0 0, v0x1b48960_0; alias, 1 drivers +o0x7fac247ed8b8 .functor BUFZ 8, C4; HiZ drive +v0x1b47280_0 .net "parallelDataIn", 7 0, o0x7fac247ed8b8; 0 drivers +v0x1b47360_0 .net "parallelDataOut", 7 0, L_0x1b49060; alias, 1 drivers +o0x7fac247ed8e8 .functor BUFZ 1, C4; HiZ drive +v0x1b47430_0 .net "parallelLoad", 0 0, o0x7fac247ed8e8; 0 drivers +v0x1b474d0_0 .net "peripheralClkEdge", 0 0, v0x1b46ae0_0; alias, 1 drivers +o0x7fac247ed918 .functor BUFZ 1, C4; HiZ drive +v0x1b47570_0 .net "serialDataIn", 0 0, o0x7fac247ed918; 0 drivers +v0x1b47610_0 .net "serialDataOut", 0 0, L_0x1b490d0; alias, 1 drivers +v0x1b476d0_0 .var "shiftregistermem", 7 0; +L_0x1b490d0 .part v0x1b476d0_0, 7, 1; + .scope S_0x1b45780; T_0 ; %pushi/vec4 0, 0, 3; - %store/vec4 v0x15786a0_0, 0, 3; + %store/vec4 v0x1b45d50_0, 0, 3; %end; .thread T_0; - .scope S_0x15780d0; + .scope S_0x1b45780; T_1 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x15789f0_0, 0, 1; + %store/vec4 v0x1b460a0_0, 0, 1; %end; .thread T_1; - .scope S_0x15780d0; + .scope S_0x1b45780; T_2 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x1578ab0_0, 0, 1; + %store/vec4 v0x1b46160_0, 0, 1; %end; .thread T_2; - .scope S_0x15780d0; + .scope S_0x1b45780; T_3 ; - %wait E_0x154dbd0; - %load/vec4 v0x15785e0_0; - %load/vec4 v0x1578ab0_0; + %wait E_0x1b182a0; + %load/vec4 v0x1b45c90_0; + %load/vec4 v0x1b46160_0; %cmp/e; %jmp/0xz T_3.0, 4; %pushi/vec4 0, 0, 3; - %assign/vec4 v0x15786a0_0, 0; + %assign/vec4 v0x1b45d50_0, 0; %jmp T_3.1; T_3.0 ; - %load/vec4 v0x15786a0_0; + %load/vec4 v0x1b45d50_0; %pad/u 32; %cmpi/e 3, 0, 32; %jmp/0xz T_3.2, 4; %pushi/vec4 0, 0, 3; - %assign/vec4 v0x15786a0_0, 0; - %load/vec4 v0x1578ab0_0; - %assign/vec4 v0x15785e0_0, 0; - %load/vec4 v0x15785e0_0; + %assign/vec4 v0x1b45d50_0, 0; + %load/vec4 v0x1b46160_0; + %assign/vec4 v0x1b45c90_0, 0; + %load/vec4 v0x1b45c90_0; %inv; - %load/vec4 v0x1578ab0_0; + %load/vec4 v0x1b46160_0; %and; - %assign/vec4 v0x1578930_0, 0; - %load/vec4 v0x1578ab0_0; + %assign/vec4 v0x1b45fe0_0, 0; + %load/vec4 v0x1b46160_0; %inv; - %load/vec4 v0x15785e0_0; + %load/vec4 v0x1b45c90_0; %and; - %assign/vec4 v0x1578760_0, 0; + %assign/vec4 v0x1b45e10_0, 0; %jmp T_3.3; T_3.2 ; - %load/vec4 v0x15786a0_0; + %load/vec4 v0x1b45d50_0; %addi 1, 0, 3; - %assign/vec4 v0x15786a0_0, 0; + %assign/vec4 v0x1b45d50_0, 0; T_3.3 ; T_3.1 ; - %load/vec4 v0x1578930_0; + %load/vec4 v0x1b45fe0_0; %flag_set/vec4 8; %jmp/0xz T_3.4, 8; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x1578930_0, 0; + %assign/vec4 v0x1b45fe0_0, 0; T_3.4 ; - %load/vec4 v0x1578760_0; + %load/vec4 v0x1b45e10_0; %flag_set/vec4 8; %jmp/0xz T_3.6, 8; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x1578760_0, 0; + %assign/vec4 v0x1b45e10_0, 0; T_3.6 ; - %load/vec4 v0x1578820_0; - %assign/vec4 v0x15789f0_0, 0; - %load/vec4 v0x15789f0_0; - %assign/vec4 v0x1578ab0_0, 0; + %load/vec4 v0x1b45ed0_0; + %assign/vec4 v0x1b460a0_0, 0; + %load/vec4 v0x1b460a0_0; + %assign/vec4 v0x1b46160_0, 0; %jmp T_3; .thread T_3; - .scope S_0x153b900; + .scope S_0x1b06900; T_4 ; %pushi/vec4 0, 0, 3; - %store/vec4 v0x1577090_0, 0, 3; + %store/vec4 v0x1b44710_0, 0, 3; %end; .thread T_4; - .scope S_0x153b900; + .scope S_0x1b06900; T_5 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x1577410_0, 0, 1; + %store/vec4 v0x1b44a90_0, 0, 1; %end; .thread T_5; - .scope S_0x153b900; + .scope S_0x1b06900; T_6 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x15774d0_0, 0, 1; + %store/vec4 v0x1b44b50_0, 0, 1; %end; .thread T_6; - .scope S_0x153b900; + .scope S_0x1b06900; T_7 ; - %wait E_0x154dbd0; - %load/vec4 v0x1576fd0_0; - %load/vec4 v0x15774d0_0; + %wait E_0x1b182a0; + %load/vec4 v0x1b44650_0; + %load/vec4 v0x1b44b50_0; %cmp/e; %jmp/0xz T_7.0, 4; %pushi/vec4 0, 0, 3; - %assign/vec4 v0x1577090_0, 0; + %assign/vec4 v0x1b44710_0, 0; %jmp T_7.1; T_7.0 ; - %load/vec4 v0x1577090_0; + %load/vec4 v0x1b44710_0; %pad/u 32; %cmpi/e 3, 0, 32; %jmp/0xz T_7.2, 4; %pushi/vec4 0, 0, 3; - %assign/vec4 v0x1577090_0, 0; - %load/vec4 v0x15774d0_0; - %assign/vec4 v0x1576fd0_0, 0; - %load/vec4 v0x1576fd0_0; + %assign/vec4 v0x1b44710_0, 0; + %load/vec4 v0x1b44b50_0; + %assign/vec4 v0x1b44650_0, 0; + %load/vec4 v0x1b44650_0; %inv; - %load/vec4 v0x15774d0_0; + %load/vec4 v0x1b44b50_0; %and; - %assign/vec4 v0x1577350_0, 0; - %load/vec4 v0x15774d0_0; + %assign/vec4 v0x1b449d0_0, 0; + %load/vec4 v0x1b44b50_0; %inv; - %load/vec4 v0x1576fd0_0; + %load/vec4 v0x1b44650_0; %and; - %assign/vec4 v0x1577180_0, 0; + %assign/vec4 v0x1b44800_0, 0; %jmp T_7.3; T_7.2 ; - %load/vec4 v0x1577090_0; + %load/vec4 v0x1b44710_0; %addi 1, 0, 3; - %assign/vec4 v0x1577090_0, 0; + %assign/vec4 v0x1b44710_0, 0; T_7.3 ; T_7.1 ; - %load/vec4 v0x1577350_0; + %load/vec4 v0x1b449d0_0; %flag_set/vec4 8; %jmp/0xz T_7.4, 8; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x1577350_0, 0; + %assign/vec4 v0x1b449d0_0, 0; T_7.4 ; - %load/vec4 v0x1577180_0; + %load/vec4 v0x1b44800_0; %flag_set/vec4 8; %jmp/0xz T_7.6, 8; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x1577180_0, 0; + %assign/vec4 v0x1b44800_0, 0; T_7.6 ; - %load/vec4 v0x1577240_0; - %assign/vec4 v0x1577410_0, 0; - %load/vec4 v0x1577410_0; - %assign/vec4 v0x15774d0_0, 0; + %load/vec4 v0x1b448c0_0; + %assign/vec4 v0x1b44a90_0, 0; + %load/vec4 v0x1b44a90_0; + %assign/vec4 v0x1b44b50_0, 0; %jmp T_7; .thread T_7; - .scope S_0x1578c10; + .scope S_0x1b462c0; T_8 ; %pushi/vec4 0, 0, 3; - %store/vec4 v0x1579190_0, 0, 3; + %store/vec4 v0x1b46840_0, 0, 3; %end; .thread T_8; - .scope S_0x1578c10; + .scope S_0x1b462c0; T_9 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x15794f0_0, 0, 1; + %store/vec4 v0x1b46ba0_0, 0, 1; %end; .thread T_9; - .scope S_0x1578c10; + .scope S_0x1b462c0; T_10 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x15795b0_0, 0, 1; + %store/vec4 v0x1b46c60_0, 0, 1; %end; .thread T_10; - .scope S_0x1578c10; + .scope S_0x1b462c0; T_11 ; - %wait E_0x154dbd0; - %load/vec4 v0x15790f0_0; - %load/vec4 v0x15795b0_0; + %wait E_0x1b182a0; + %load/vec4 v0x1b467a0_0; + %load/vec4 v0x1b46c60_0; %cmp/e; %jmp/0xz T_11.0, 4; %pushi/vec4 0, 0, 3; - %assign/vec4 v0x1579190_0, 0; + %assign/vec4 v0x1b46840_0, 0; %jmp T_11.1; T_11.0 ; - %load/vec4 v0x1579190_0; + %load/vec4 v0x1b46840_0; %pad/u 32; %cmpi/e 3, 0, 32; %jmp/0xz T_11.2, 4; %pushi/vec4 0, 0, 3; - %assign/vec4 v0x1579190_0, 0; - %load/vec4 v0x15795b0_0; - %assign/vec4 v0x15790f0_0, 0; - %load/vec4 v0x15790f0_0; + %assign/vec4 v0x1b46840_0, 0; + %load/vec4 v0x1b46c60_0; + %assign/vec4 v0x1b467a0_0, 0; + %load/vec4 v0x1b467a0_0; %inv; - %load/vec4 v0x15795b0_0; + %load/vec4 v0x1b46c60_0; %and; - %assign/vec4 v0x1579430_0, 0; - %load/vec4 v0x15795b0_0; + %assign/vec4 v0x1b46ae0_0, 0; + %load/vec4 v0x1b46c60_0; %inv; - %load/vec4 v0x15790f0_0; + %load/vec4 v0x1b467a0_0; %and; - %assign/vec4 v0x1579260_0, 0; + %assign/vec4 v0x1b46910_0, 0; %jmp T_11.3; T_11.2 ; - %load/vec4 v0x1579190_0; + %load/vec4 v0x1b46840_0; %addi 1, 0, 3; - %assign/vec4 v0x1579190_0, 0; + %assign/vec4 v0x1b46840_0, 0; T_11.3 ; T_11.1 ; - %load/vec4 v0x1579430_0; + %load/vec4 v0x1b46ae0_0; %flag_set/vec4 8; %jmp/0xz T_11.4, 8; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x1579430_0, 0; + %assign/vec4 v0x1b46ae0_0, 0; T_11.4 ; - %load/vec4 v0x1579260_0; + %load/vec4 v0x1b46910_0; %flag_set/vec4 8; %jmp/0xz T_11.6, 8; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x1579260_0, 0; + %assign/vec4 v0x1b46910_0, 0; T_11.6 ; - %load/vec4 v0x1579320_0; - %assign/vec4 v0x15794f0_0, 0; - %load/vec4 v0x15794f0_0; - %assign/vec4 v0x15795b0_0, 0; + %load/vec4 v0x1b469d0_0; + %assign/vec4 v0x1b46ba0_0, 0; + %load/vec4 v0x1b46ba0_0; + %assign/vec4 v0x1b46c60_0, 0; %jmp T_11; .thread T_11; - .scope S_0x1579710; + .scope S_0x1b46dc0; T_12 ; - %wait E_0x154dbd0; - %load/vec4 v0x1579dc0_0; + %wait E_0x1b182a0; + %load/vec4 v0x1b47430_0; %flag_set/vec4 8; %jmp/0xz T_12.0, 8; - %load/vec4 v0x1579bf0_0; - %assign/vec4 v0x157a060_0, 0; + %load/vec4 v0x1b47280_0; + %assign/vec4 v0x1b476d0_0, 0; %jmp T_12.1; T_12.0 ; - %load/vec4 v0x1579e60_0; + %load/vec4 v0x1b474d0_0; %flag_set/vec4 8; %jmp/0xz T_12.2, 8; - %load/vec4 v0x157a060_0; + %load/vec4 v0x1b476d0_0; %parti/s 7, 0, 2; - %load/vec4 v0x1579f00_0; + %load/vec4 v0x1b47570_0; %concat/vec4; draw_concat_vec4 - %assign/vec4 v0x157a060_0, 0; + %assign/vec4 v0x1b476d0_0, 0; T_12.2 ; T_12.1 ; %jmp T_12; .thread T_12; - .scope S_0x1577630; + .scope S_0x1b44cb0; T_13 ; - %wait E_0x154dbd0; - %load/vec4 v0x1577f70_0; + %wait E_0x1b182a0; + %load/vec4 v0x1b45620_0; %flag_set/vec4 8; %jmp/0xz T_13.0, 8; - %load/vec4 v0x1577cd0_0; - %load/vec4 v0x1577b00_0; + %load/vec4 v0x1b45380_0; + %load/vec4 v0x1b45210_0; %pad/u 9; %ix/vec4 3; %ix/load 4, 0, 0; Constant delay - %assign/vec4/a/d v0x1577e60, 0, 4; + %assign/vec4/a/d v0x1b45510, 0, 4; T_13.0 ; - %load/vec4 v0x1577b00_0; + %load/vec4 v0x1b45210_0; %pad/u 9; %ix/vec4 4; - %load/vec4a v0x1577e60, 4; - %assign/vec4 v0x1577da0_0, 0; + %load/vec4a v0x1b45510, 4; + %assign/vec4 v0x1b45450_0, 0; %jmp T_13; .thread T_13; - .scope S_0x153fc80; + .scope S_0x1b0ac80; T_14 ; %pushi/vec4 0, 0, 3; - %assign/vec4 v0x157b150_0, 0; + %assign/vec4 v0x1b487c0_0, 0; %pushi/vec4 0, 0, 7; - %assign/vec4 v0x157a260_0, 0; + %assign/vec4 v0x1b478d0_0, 0; %pushi/vec4 0, 0, 5; - %assign/vec4 v0x157a370_0, 0; + %assign/vec4 v0x1b479e0_0, 0; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x157a830_0, 0; + %assign/vec4 v0x1b47ea0_0, 0; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x157a760_0, 0; + %assign/vec4 v0x1b47dd0_0, 0; + %pushi/vec4 0, 1, 1; + %assign/vec4 v0x1b480a0_0, 0; %end; .thread T_14; - .scope S_0x153fc80; + .scope S_0x1b0ac80; T_15 ; - %wait E_0x154d960; - %load/vec4 v0x157a500_0; + %wait E_0x1b18d60; + %load/vec4 v0x1b47b70_0; %nor/r; %flag_set/vec4 8; %jmp/0xz T_15.0, 8; - %load/vec4 v0x157b150_0; + %load/vec4 v0x1b487c0_0; %cmpi/e 0, 0, 3; %jmp/0xz T_15.2, 4; - %load/vec4 v0x157a370_0; + %load/vec4 v0x1b479e0_0; %addi 1, 0, 5; - %store/vec4 v0x157a370_0, 0, 5; - %load/vec4 v0x157a370_0; + %store/vec4 v0x1b479e0_0, 0, 5; + %load/vec4 v0x1b479e0_0; %pad/u 32; %cmpi/e 7, 0, 32; %jmp/0xz T_15.4, 4; %pushi/vec4 1, 0, 3; - %assign/vec4 v0x157b150_0, 0; - %load/vec4 v0x157aeb0_0; + %assign/vec4 v0x1b487c0_0, 0; + %load/vec4 v0x1b48520_0; %parti/s 7, 0, 2; - %assign/vec4 v0x157a260_0, 0; + %assign/vec4 v0x1b478d0_0, 0; T_15.4 ; T_15.2 ; - %load/vec4 v0x157b150_0; + %load/vec4 v0x1b487c0_0; %cmpi/e 3, 0, 3; %jmp/0xz T_15.6, 4; - %load/vec4 v0x157a370_0; + %load/vec4 v0x1b479e0_0; %addi 1, 0, 5; - %store/vec4 v0x157a370_0, 0, 5; - %load/vec4 v0x157a370_0; + %store/vec4 v0x1b479e0_0, 0, 5; + %load/vec4 v0x1b479e0_0; %pad/u 32; %cmpi/e 8, 0, 32; %jmp/0xz T_15.8, 4; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x157a760_0, 0; - %load/vec4 v0x157a260_0; + %assign/vec4 v0x1b47dd0_0, 0; + %load/vec4 v0x1b478d0_0; %addi 1, 0, 7; - %assign/vec4 v0x157a260_0, 0; + %assign/vec4 v0x1b478d0_0, 0; T_15.8 ; T_15.6 ; - %load/vec4 v0x157b150_0; + %load/vec4 v0x1b487c0_0; %cmpi/e 1, 0, 3; %jmp/0xz T_15.10, 4; - %load/vec4 v0x157aeb0_0; + %load/vec4 v0x1b48520_0; %parti/s 1, 0, 2; %pad/u 32; %cmpi/e 1, 0, 32; %jmp/0xz T_15.12, 4; %pushi/vec4 3, 0, 3; - %assign/vec4 v0x157b150_0, 0; + %assign/vec4 v0x1b487c0_0, 0; T_15.12 ; - %load/vec4 v0x157aeb0_0; + %load/vec4 v0x1b48520_0; %parti/s 1, 0, 2; %pad/u 32; %cmpi/e 0, 0, 32; %jmp/0xz T_15.14, 4; %pushi/vec4 2, 0, 3; - %assign/vec4 v0x157b150_0, 0; + %assign/vec4 v0x1b487c0_0, 0; %pushi/vec4 1, 0, 1; - %assign/vec4 v0x157a830_0, 0; + %assign/vec4 v0x1b47ea0_0, 0; T_15.14 ; %pushi/vec4 0, 0, 5; - %assign/vec4 v0x157a370_0, 0; + %assign/vec4 v0x1b479e0_0, 0; T_15.10 ; T_15.0 ; %jmp T_15; .thread T_15; - .scope S_0x153fc80; + .scope S_0x1b0ac80; T_16 ; - %wait E_0x154d790; - %load/vec4 v0x157a760_0; + %wait E_0x1b18af0; + %load/vec4 v0x1b47dd0_0; %flag_set/vec4 8; %jmp/0xz T_16.0, 8; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x157a760_0, 0; + %assign/vec4 v0x1b47dd0_0, 0; T_16.0 ; - %load/vec4 v0x157a830_0; + %load/vec4 v0x1b47ea0_0; %flag_set/vec4 8; %jmp/0xz T_16.2, 8; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x157a830_0, 0; + %assign/vec4 v0x1b47ea0_0, 0; T_16.2 ; - %load/vec4 v0x157a500_0; + %load/vec4 v0x1b47b70_0; %nor/r; %flag_set/vec4 8; %jmp/0xz T_16.4, 8; - %load/vec4 v0x157b150_0; + %load/vec4 v0x1b487c0_0; %cmpi/e 2, 0, 3; %jmp/0xz T_16.6, 4; - %load/vec4 v0x157afa0_0; - %assign/vec4 v0x157aa30_0, 0; - %load/vec4 v0x157a370_0; + %load/vec4 v0x1b48610_0; + %assign/vec4 v0x1b480a0_0, 0; + %load/vec4 v0x1b479e0_0; %addi 1, 0, 5; - %store/vec4 v0x157a370_0, 0, 5; + %store/vec4 v0x1b479e0_0, 0, 5; T_16.6 ; T_16.4 ; %jmp T_16; .thread T_16; - .scope S_0x153fc80; + .scope S_0x1b0ac80; T_17 ; - %wait E_0x154cfb0; + %wait E_0x1b18920; %pushi/vec4 0, 0, 3; - %assign/vec4 v0x157b150_0, 0; + %assign/vec4 v0x1b487c0_0, 0; %pushi/vec4 0, 0, 5; - %assign/vec4 v0x157a370_0, 0; + %assign/vec4 v0x1b479e0_0, 0; %pushi/vec4 0, 1, 1; - %assign/vec4 v0x157aa30_0, 0; + %assign/vec4 v0x1b480a0_0, 0; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x157a760_0, 0; + %assign/vec4 v0x1b47dd0_0, 0; %pushi/vec4 0, 0, 1; - %assign/vec4 v0x157a830_0, 0; + %assign/vec4 v0x1b47ea0_0, 0; %jmp T_17; .thread T_17; - .scope S_0x153fb00; + .scope S_0x1b0ab00; T_18 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b2f0_0, 0, 1; + %store/vec4 v0x1b48960_0, 0, 1; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; + %store/vec4 v0x1b48f30_0, 0, 1; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b3b0_0, 0, 1; + %store/vec4 v0x1b48a20_0, 0, 1; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b7d0_0, 0, 1; + %store/vec4 v0x1b48e40_0, 0, 1; %end; .thread T_18; - .scope S_0x153fb00; + .scope S_0x1b0ab00; T_19 ; + %vpi_call 2 33 "$dumpfile", "spimem.vcd" {0 0 0}; + %vpi_call 2 34 "$dumpvars", 32'sb00000000000000000000000000000000, S_0x1b0ab00 {0 0 0}; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1b48bb0_0, 0, 1; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x1b48a20_0, 0, 1; + %delay 100, 0; + %load/vec4 v0x1b48da0_0; + %cmpi/ne 0, 1, 1; + %jmp/0xz T_19.0, 6; + %vpi_call 2 40 "$display", "chip not in Z state when CS is high" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1b48bb0_0, 0, 1; +T_19.0 ; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1b48a20_0, 0, 1; + %delay 100, 0; %pushi/vec4 85, 0, 7; - %store/vec4 v0x157b1f0_0, 0, 7; + %store/vec4 v0x1b48860_0, 0, 7; %pushi/vec4 240, 0, 8; - %store/vec4 v0x157b4a0_0, 0, 8; + %store/vec4 v0x1b48b10_0, 0, 8; %pushi/vec4 0, 0, 32; - %store/vec4 v0x157b650_0, 0, 32; -T_19.0 ; - %load/vec4 v0x157b650_0; + %store/vec4 v0x1b48cc0_0, 0, 32; +T_19.2 ; + %load/vec4 v0x1b48cc0_0; %cmpi/u 7, 0, 32; - %jmp/0xz T_19.1, 5; - %load/vec4 v0x157b1f0_0; - %load/vec4 v0x157b650_0; + %jmp/0xz T_19.3, 5; + %load/vec4 v0x1b48860_0; + %load/vec4 v0x1b48cc0_0; %part/u 1; - %store/vec4 v0x157b7d0_0, 0, 1; + %store/vec4 v0x1b48e40_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; + %store/vec4 v0x1b48f30_0, 0, 1; %delay 100, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; - %load/vec4 v0x157b650_0; + %store/vec4 v0x1b48f30_0, 0, 1; + %load/vec4 v0x1b48cc0_0; %addi 1, 0, 32; - %store/vec4 v0x157b650_0, 0, 32; - %jmp T_19.0; -T_19.1 ; + %store/vec4 v0x1b48cc0_0, 0, 32; + %jmp T_19.2; +T_19.3 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b7d0_0, 0, 1; + %store/vec4 v0x1b48e40_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; + %store/vec4 v0x1b48f30_0, 0, 1; %delay 100, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; + %store/vec4 v0x1b48f30_0, 0, 1; %pushi/vec4 0, 0, 32; - %store/vec4 v0x157b650_0, 0, 32; -T_19.2 ; - %load/vec4 v0x157b650_0; + %store/vec4 v0x1b48cc0_0, 0, 32; +T_19.4 ; + %load/vec4 v0x1b48cc0_0; %cmpi/u 8, 0, 32; - %jmp/0xz T_19.3, 5; - %load/vec4 v0x157b4a0_0; - %load/vec4 v0x157b650_0; + %jmp/0xz T_19.5, 5; + %load/vec4 v0x1b48b10_0; + %load/vec4 v0x1b48cc0_0; %part/u 1; - %store/vec4 v0x157b7d0_0, 0, 1; + %store/vec4 v0x1b48e40_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; + %store/vec4 v0x1b48f30_0, 0, 1; %delay 100, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; - %load/vec4 v0x157b650_0; + %store/vec4 v0x1b48f30_0, 0, 1; + %load/vec4 v0x1b48cc0_0; %addi 1, 0, 32; - %store/vec4 v0x157b650_0, 0, 32; - %jmp T_19.2; -T_19.3 ; + %store/vec4 v0x1b48cc0_0, 0, 32; + %jmp T_19.4; +T_19.5 ; %pushi/vec4 0, 0, 32; - %store/vec4 v0x157b650_0, 0, 32; -T_19.4 ; - %load/vec4 v0x157b650_0; + %store/vec4 v0x1b48cc0_0, 0, 32; +T_19.6 ; + %load/vec4 v0x1b48cc0_0; %cmpi/u 7, 0, 32; - %jmp/0xz T_19.5, 5; - %load/vec4 v0x157b1f0_0; - %load/vec4 v0x157b650_0; + %jmp/0xz T_19.7, 5; + %load/vec4 v0x1b48860_0; + %load/vec4 v0x1b48cc0_0; %part/u 1; - %store/vec4 v0x157b7d0_0, 0, 1; + %store/vec4 v0x1b48e40_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; + %store/vec4 v0x1b48f30_0, 0, 1; %delay 100, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; - %load/vec4 v0x157b650_0; + %store/vec4 v0x1b48f30_0, 0, 1; + %load/vec4 v0x1b48cc0_0; %addi 1, 0, 32; - %store/vec4 v0x157b650_0, 0, 32; - %jmp T_19.4; -T_19.5 ; + %store/vec4 v0x1b48cc0_0, 0, 32; + %jmp T_19.6; +T_19.7 ; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b7d0_0, 0, 1; + %store/vec4 v0x1b48e40_0, 0, 1; %pushi/vec4 1, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; + %store/vec4 v0x1b48f30_0, 0, 1; %delay 100, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; + %store/vec4 v0x1b48f30_0, 0, 1; %pushi/vec4 0, 0, 32; - %store/vec4 v0x157b650_0, 0, 32; -T_19.6 ; - %load/vec4 v0x157b650_0; + %store/vec4 v0x1b48cc0_0, 0, 32; +T_19.8 ; + %load/vec4 v0x1b48cc0_0; %cmpi/u 8, 0, 32; - %jmp/0xz T_19.7, 5; - %load/vec4 v0x157b730_0; - %load/vec4 v0x157b4a0_0; - %load/vec4 v0x157b650_0; + %jmp/0xz T_19.9, 5; + %load/vec4 v0x1b48da0_0; + %load/vec4 v0x1b48b10_0; + %load/vec4 v0x1b48cc0_0; %part/u 1; %cmp/ne; - %jmp/0xz T_19.8, 4; - %vpi_call 2 75 "$display", "read byte is different from written byte" {0 0 0}; - %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b540_0, 0, 1; -T_19.8 ; + %flag_mov 8, 6; + %load/vec4 v0x1b48da0_0; + %cmpi/e 1, 1, 1; + %flag_or 6, 8; + %jmp/0xz T_19.10, 6; + %vpi_call 2 88 "$display", "read byte is different from written byte" {0 0 0}; + %pushi/vec4 0, 0, 1; + %store/vec4 v0x1b48bb0_0, 0, 1; +T_19.10 ; %pushi/vec4 1, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; + %store/vec4 v0x1b48f30_0, 0, 1; %delay 100, 0; %pushi/vec4 0, 0, 1; - %store/vec4 v0x157b8c0_0, 0, 1; - %load/vec4 v0x157b650_0; + %store/vec4 v0x1b48f30_0, 0, 1; + %load/vec4 v0x1b48cc0_0; %addi 1, 0, 32; - %store/vec4 v0x157b650_0, 0, 32; - %jmp T_19.6; -T_19.7 ; - %load/vec4 v0x157b540_0; - %flag_set/vec4 8; - %jmp/0xz T_19.10, 8; - %vpi_call 2 85 "$display", "DUT passed" {0 0 0}; - %jmp T_19.11; -T_19.10 ; - %vpi_call 2 88 "$display", "DUT failed" {0 0 0}; -T_19.11 ; + %store/vec4 v0x1b48cc0_0, 0, 32; + %jmp T_19.8; +T_19.9 ; + %vpi_call 2 96 "$display", "DUT passed" {0 0 0}; %end; .thread T_19; + .scope S_0x1b0ab00; +T_20 ; + %wait E_0x1b17e60; + %vpi_call 2 101 "$display", "DUT failed" {0 0 0}; + %vpi_call 2 102 "$finish" {0 0 0}; + %jmp T_20; + .thread T_20; # The file index is used to find the file name in the following table. :file_names 7; "N/A"; diff --git a/spimem.vcd b/spimem.vcd new file mode 100644 index 0000000..682000e --- /dev/null +++ b/spimem.vcd @@ -0,0 +1,231 @@ +$date + Wed Nov 1 21:09:35 2017 +$end +$version + Icarus Verilog +$end +$timescale + 1s +$end +$scope module testMemory $end +$var wire 1 ! miso_pin $end +$var reg 7 " address [6:0] $end +$var reg 1 # clk $end +$var reg 1 $ cs_pin $end +$var reg 8 % data [7:0] $end +$var reg 1 & dutpassed $end +$var reg 32 ' i [31:0] $end +$var reg 1 ( mosi_pin $end +$var reg 1 ) sclk_pin $end +$scope module dut $end +$var wire 1 # clk $end +$var wire 1 $ cs_pin $end +$var wire 4 * leds [3:0] $end +$var wire 1 ( mosi_pin $end +$var wire 1 ) sclk_pin $end +$var wire 1 + shift_sOut $end +$var wire 8 , shift_pOut [7:0] $end +$var wire 1 - sclk_pos $end +$var wire 1 . sclk_neg $end +$var wire 1 / mosi $end +$var wire 8 0 mem_out [7:0] $end +$var wire 1 1 cs $end +$var reg 7 2 addressReg [6:0] $end +$var reg 5 3 bitsTx [4:0] $end +$var reg 1 4 load_mem $end +$var reg 1 5 load_shift $end +$var reg 1 ! miso_pin $end +$var reg 3 6 state [2:0] $end +$scope module cscond $end +$var wire 1 # clk $end +$var wire 1 $ noisysignal $end +$var reg 1 1 conditioned $end +$var reg 3 7 counter [2:0] $end +$var reg 1 8 negativeedge $end +$var reg 1 9 positiveedge $end +$var reg 1 : synchronizer0 $end +$var reg 1 ; synchronizer1 $end +$upscope $end +$scope module mem $end +$var wire 7 < address [6:0] $end +$var wire 1 # clk $end +$var wire 1 4 writeEnable $end +$var wire 8 = dataIn [7:0] $end +$var reg 8 > dataOut [7:0] $end +$upscope $end +$scope module mosicond $end +$var wire 1 # clk $end +$var wire 1 ( noisysignal $end +$var reg 1 / conditioned $end +$var reg 3 ? counter [2:0] $end +$var reg 1 @ negativeedge $end +$var reg 1 A positiveedge $end +$var reg 1 B synchronizer0 $end +$var reg 1 C synchronizer1 $end +$upscope $end +$scope module sclkcond $end +$var wire 1 # clk $end +$var wire 1 ) noisysignal $end +$var reg 1 D conditioned $end +$var reg 3 E counter [2:0] $end +$var reg 1 . negativeedge $end +$var reg 1 - positiveedge $end +$var reg 1 F synchronizer0 $end +$var reg 1 G synchronizer1 $end +$upscope $end +$scope module shiftReg $end +$var wire 1 # clk $end +$var wire 8 H parallelDataIn [7:0] $end +$var wire 8 I parallelDataOut [7:0] $end +$var wire 1 J parallelLoad $end +$var wire 1 - peripheralClkEdge $end +$var wire 1 K serialDataIn $end +$var wire 1 + serialDataOut $end +$var reg 8 L shiftregistermem [7:0] $end +$upscope $end +$upscope $end +$upscope $end +$enddefinitions $end +#0 +$dumpvars +bx L +zK +zJ +bx I +bz H +0G +0F +b0 E +xD +0C +0B +xA +x@ +b0 ? +bx > +bx = +b0 < +0; +0: +x9 +x8 +b0 7 +b0 6 +05 +04 +b0 3 +b0 2 +x1 +bx 0 +x/ +x. +x- +bx , +x+ +bz * +0) +0( +bx ' +1& +bx % +1$ +0# +bx " +z! +$end +#100 +0$ +#200 +1) +1( +b0 ' +b11110000 % +b1010101 " +#300 +0( +b1 ' +1) +#400 +1( +b10 ' +1) +#500 +0( +b11 ' +1) +#600 +1( +b100 ' +1) +#700 +0( +b101 ' +1) +#800 +1( +b110 ' +1) +#900 +0( +b111 ' +1) +#1000 +b0 ' +1) +#1100 +b1 ' +1) +#1200 +b10 ' +1) +#1300 +b11 ' +1) +#1400 +1( +b100 ' +1) +#1500 +b101 ' +1) +#1600 +b110 ' +1) +#1700 +b111 ' +1) +#1800 +b0 ' +1) +#1900 +0( +b1 ' +1) +#2000 +1( +b10 ' +1) +#2100 +0( +b11 ' +1) +#2200 +1( +b100 ' +1) +#2300 +0( +b101 ' +1) +#2400 +1( +b110 ' +1) +#2500 +0( +b111 ' +1) +#2600 +0& +b0 ' +1) diff --git a/spimemory.t.v b/spimemory.t.v index db05016..99cc656 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -30,8 +30,10 @@ module testMemory(); //always #10 clk != clk; initial begin + $dumpfile("spimem.vcd"); + $dumpvars(0, testMemory); dutpassed = 1; - + cs_pin = 1; #100; if(miso_pin !== 'z) begin @@ -90,7 +92,7 @@ module testMemory(); #100; sclk_pin = 0; end - + $display("DUT passed"); diff --git a/spimemory.v b/spimemory.v index e173251..3381b84 100644 --- a/spimemory.v +++ b/spimemory.v @@ -51,6 +51,7 @@ initial begin bitsTx <= 4'd0; load_shift <= 0; load_mem <= 0; + miso_pin <= 'z; end always @(posedge sclk_pos) begin From a311ff0a0ce6e1910f6fc030b0539a53da7379e3 Mon Sep 17 00:00:00 2001 From: Tobias Shapinsky Date: Wed, 1 Nov 2017 21:20:10 -0400 Subject: [PATCH 17/20] added CS stuff --- spimemory.t.v | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spimemory.t.v b/spimemory.t.v index 06c93e3..f855fba 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -69,7 +69,12 @@ module testMemory(); #100; end - + //deassert and reassert CS + cs_pin = 1; + #100; + cs_pin = 0; + #100; + //write address for(i=0; i < 7; i=i+1) begin mosi_pin = address[i]; From ca74fc129cdaaec5c46e4940de0aa3143ebe1a8e Mon Sep 17 00:00:00 2001 From: Henry Rachootin Date: Wed, 1 Nov 2017 22:09:24 -0400 Subject: [PATCH 18/20] ajhsdfjkh --- spimemory.t.v | 36 ++++++++++++++++++------------------ spimemory.v | 12 ++++++------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/spimemory.t.v b/spimemory.t.v index b56d053..e2b9f3c 100644 --- a/spimemory.t.v +++ b/spimemory.t.v @@ -38,13 +38,13 @@ module testMemory(); dutpassed = 1; cs_pin = 1; - #100; + #1000; if(miso_pin !== 'z) begin $display("chip not in Z state when CS is high"); dutpassed = 0; end cs_pin = 0; - #100 + #1000 address = 7'b1010101; data = 8'b11110000; @@ -53,50 +53,50 @@ module testMemory(); for(i=0; i < 7; i=i+1) begin mosi_pin = address[i]; sclk_pin = 1; - #100; + #1000; sclk_pin = 0; - #100; + #1000; end //set write mosi_pin = 0; sclk_pin = 1; - #100; + #1000; sclk_pin = 0; - #100; + #1000; //write data for(i=0; i < 8; i=i+1) begin mosi_pin = data[i]; sclk_pin = 1; - #100; + #1000; sclk_pin = 0; - #100; + #1000; end //deassert and reassert CS cs_pin = 1; - #100; + #1000; cs_pin = 0; - #100; - + #1000; + //write address for(i=0; i < 7; i=i+1) begin mosi_pin = address[i]; sclk_pin = 1; - #100; + #1000; sclk_pin = 0; - #100; + #1000; end //set read - mosi_pin = 0; + mosi_pin = 1; sclk_pin = 1; - #100; + #1000; sclk_pin = 0; - #100; + #1000; //read data for(i=0; i < 8; i=i+1) begin @@ -105,9 +105,9 @@ module testMemory(); dutpassed = 0; end sclk_pin = 1; - #100; + #1000; sclk_pin = 0; - #100; + #1000; end $display("DUT passed"); diff --git a/spimemory.v b/spimemory.v index 3381b84..53471a9 100644 --- a/spimemory.v +++ b/spimemory.v @@ -37,7 +37,8 @@ inputconditioner sclkcond(.clk(clk), .noisysignal(sclk_pin), .positiveedge(sclk_pos), .negativeedge(sclk_neg)); shiftregister shiftReg(.clk(clk), .peripheralClkEdge(sclk_pos), - .parallelDataOut(shift_pOut), .serialDataOut(shift_sOut) + .parallelDataOut(shift_pOut), .serialDataOut(shift_sOut), + .serialDataIn(mosi), .parallelLoad(load_shift), .parallelDataIn(mem_out) ); datamemory mem(.clk(clk), .dataOut(mem_out), @@ -54,7 +55,7 @@ initial begin miso_pin <= 'z; end -always @(posedge sclk_pos) begin +always @(negedge sclk_pos) begin if(!cs) begin if(state == `READ_ADDRESS) begin bitsTx = bitsTx + 1; @@ -66,15 +67,14 @@ always @(posedge sclk_pos) begin if(state == `READ_DATA) begin bitsTx = bitsTx + 1; if(bitsTx == 8) begin - load_mem <= 0; - addressReg <= addressReg + 1;//Not defined in the spec, but useful + load_mem <= 1; end end if(state == `READ_WR) begin - if(shift_pOut[0] == 1) begin + if(shift_pOut[0] == 0) begin state <= `READ_DATA; end - if(shift_pOut[0] == 0) begin + if(shift_pOut[0] == 1) begin state <= `WRITE_DATA; load_shift <= 1; end From 11e8cda3d00e7e3d2f31c01cb3dde8ff526e13ea Mon Sep 17 00:00:00 2001 From: TShapinsky Date: Thu, 2 Nov 2017 22:10:23 -0400 Subject: [PATCH 19/20] Added lab writeup --- Lab2.pdf | Bin 0 -> 152361 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Lab2.pdf diff --git a/Lab2.pdf b/Lab2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f46fa69c9bac6d661394537aace9ca60fdbc1b74 GIT binary patch literal 152361 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 literal 0 HcmV?d00001 From 178818a390c7ebc15575572c843ca974f0d61640 Mon Sep 17 00:00:00 2001 From: yah Date: Fri, 3 Nov 2017 11:00:38 -0400 Subject: [PATCH 20/20] Replaced some errant = with <= --- spimemory.v | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spimemory.v b/spimemory.v index 53471a9..1c14109 100644 --- a/spimemory.v +++ b/spimemory.v @@ -58,7 +58,7 @@ end always @(negedge sclk_pos) begin if(!cs) begin if(state == `READ_ADDRESS) begin - bitsTx = bitsTx + 1; + bitsTx <= bitsTx + 1; if(bitsTx == 7) begin state <= `READ_WR; addressReg <= shift_pOut[6:0]; @@ -93,7 +93,7 @@ always @ (posedge sclk_neg) begin if(!cs) begin if(state == `WRITE_DATA) begin miso_pin <= shift_sOut; - bitsTx = bitsTx + 1; + bitsTx <= bitsTx + 1; end end end