From 7af2c51d61f223e65bd96fdbbcdc624edaac2ab2 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Wed, 7 Dec 2022 22:35:29 +0100 Subject: [PATCH] Integrate CAN controller and implement switches interrupt --- documentation/SJA1000.pdf | Bin 213310 -> 257931 bytes documentation/SJA1000_datasheet.pdf | Bin 242559 -> 248777 bytes programs/can_test.prog_ | 71 ++++++++++++++++++++++ programs/interrupt_test.prog | 65 ++++++++++++++++++++ programs/scrolling.prog | 8 +-- soc/core/lt16x32_global.vhd | 2 +- soc/lib/config.vhd | 3 + soc/peripheral/peripherals.vhd | 20 ++++++- soc/peripheral/switches.vhd | 26 +++++++- soc/testbench/can_demo_tb.vhd | 12 ++-- soc/testbench/project.vhd | 72 +++++++++++++++++++++++ soc/testbench/switches_tb.vhd | 28 +++++++++ soc/testbench/testdata/data_read.tdf | 4 ++ soc/testbench/testdata/data_send.tdf | 5 ++ soc/testbench/testdata/default_setup.tdf | 6 ++ soc/top/top.vhd | 42 ++++++++++--- soc/top/top.xdc | 4 +- 17 files changed, 346 insertions(+), 22 deletions(-) create mode 100644 programs/can_test.prog_ create mode 100644 programs/interrupt_test.prog create mode 100644 soc/testbench/project.vhd create mode 100644 soc/testbench/testdata/data_read.tdf create mode 100644 soc/testbench/testdata/data_send.tdf create mode 100644 soc/testbench/testdata/default_setup.tdf diff --git a/documentation/SJA1000.pdf b/documentation/SJA1000.pdf index 2b3d2b6cc9eda4029b3c7d2eddd9fda2e1955659..5b808bed42a36cf94e1bf7710a0e6a08caaf4094 100644 GIT binary patch delta 44988 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 YGqkc>xs52RTibSB3$#P8$k?v`2ay2mX8-^I delta 15 WcmeCa&%dvUx1oixg=q`3og)A%*>AE>c#l)sEr`8D1U!^bno8m!QygNU9O%AZP9uvX7By!kCm7`EEhY)yu!<_ZMlDWxjwPgm-A+DlX`8rF($TMZ{){xL9PApwjWEo z{Mh!*9n*d_r2x-OJ`W(`MO1noh*qy&u)SGFmsLw3u59$JFh@ zj)i0D)@kF4sq?;e)o$6zNgV7EHxu9XW!wGSv3i14xAy~IwhOKIrPG$2it)5;3J9*^ z7|tcdK9xbyH0Nm3$s z%tkAzUnhQz=(W2z+Tvba)v+eR)X5qmC);mZ65)}w!f)TT2YlnV(6KRAR4Znh? z#fQ(H6wB<-Mr&D?iZfezlWAAjER+RjDi~iATP9~dh5rZ3s#smb#pT0dRb3b8+d|`Q zamLt1N(=trKAvW8E|&9ZDb5nQI5j^O&EcOQO*W^u0rgpngj2k{CZ>2K)sQkK@Ys(I z6VmRIVXsU$93Am`crb>yHel(2M{^iD#$B&KM;yXKg(*C49UZb#)_P?#Sp~{;5ks8? zuvwJ)XmOA1g++if={pknOfe>?PnH9rN8hvCPQ%4F+Iu)F>BvW8r z*Vy$Pn|E=C-r|ni07o2ghpYU&c14{L8!2dy716DtrJN8hAARQnDtn+!mas+J|LQ-kYkyF4MIN(m$be@rC zq_j?lmOQTKjx@X^rEJi^Y3fhpjb*Eq7fPz!!bNn(1`bp6q%R^<#(8HQOSSIXcO6@I zpu=f-6*}Ur>5gLV=dLE7owF@6J$Gg1xl&nC+p44h)+=`;mN*hfqd@nQN6#ItNZ*1- z(xyFmw6a!WZR0gKd7kn#?$M{uTb{~*f0wRYqo2@Yn7ss5bML>k^n zXb#X6B*w%#mKce@1}rh{I=1#KG1Q-)p8xi%qO5CNv@%t5o%E-(S>dG1n2isVNxS{X5#cE#^ROvEK7iTW(pqdx`;M(U;c>`CCH}A?2dXzZu(6ptm$<0-A^;viXI^Uy zW+}@m$bBr*6k}pnjkyXRyWp{-#`W>Cs*jIQ2*JPp!@?Sanj#Fi+;kSHrNLdJc}H9x zA4S}XHzu1XDt(d()s&6JB~bPjsNs#pr?OmcNlIvA3J#pLHeu|wNnwKlBFL=i#woy5+F`S{xiAPMdByuaUFrJ>+BOYLZ`xwtIGjb-=8^HzV-sT6 z7E&d3+-8t}x7!khPu@fQaH}nb&^9(RN*z$$)2I$iIy;o(w%bxIK7G<^q;H7=CW?sZ zan$Aq!K{|W#gl5;)Lq}b_~esHpe`w9?>rP|cm8+(%YXgh{jdK1i`C1I{`uQC=Xb@O zFF*g{^GE;q|EvG``iuYm{I4(l>~3O%)5T&Xa1&{=)a>!H`Uq8j=W&miy>nSFpmEm~ b->0i$xoY8w+zK6jeDumIZ~gl15Z@wM4s delta 15 WcmX>(o&WzczJ?aY7N#xC^_u}ZkOtQP diff --git a/programs/can_test.prog_ b/programs/can_test.prog_ new file mode 100644 index 0000000..5f1da16 --- /dev/null +++ b/programs/can_test.prog_ @@ -0,0 +1,71 @@ +reset: + br always >main + nop + +hardfault: + reti + nop + +memfault: + reti + nop + +timer_interrupt: + reti + nop + +can_interrupt: + br >can_interrupt + nop + +.align +led_addr: .word 0x000F0000 + +timer_counter_addr: .word 0x000F0008 +timer_status_addr: .word 0x000F000C + +dmem_start_addr: .word 0x00000400 +dmem_end_addr: .word 0x000004FC + +priority_mask: .word 0xFFFFFF03 + +timer_target_value: .word 127 // for simulation +// timer_target_value: .word 0xF10000 // for real board + +can_base_addr: .word 0x000F0100 + +can_control_ptr: .word =can_base_addr +can_command_ptr: .word =can_base_addr + 1 +can_acceptance_code_ptr: .word =can_base_addr + 4 +can_acceptance_mask_ptr: .word =can_base_addr + 5 +can_acceptance_bus_timing0_ptr: .word =can_base_addr + 6 +can_acceptance_bus_timing1_ptr: .word =can_base_addr + 7 +can_output_control_ptr: .word =can_base_addr + 8 +can_identifier0_ptr: .word =can_base_addr + 10 +can_identifier1_ptr: .word =can_base_addr + 11 +can_data0_ptr: .word =can_base_addr + 12 +can_data1_ptr: .word =can_base_addr + 13 + +main: + // Initialize stack pointer to the end of the data memory + ldr r12, >dmem_end_addr + + // Set runtime priority + ldr r0, >priority_mask + and r14, r0, r14 + + // Set LED to pattern + clr r2 + addi r2, 0x7A + st08 r0, r2 + + // Initialize CAN + ldr r0, >can_acceptance_code_ptr + +loop: + br >loop + nop + +can_interrupt: + reti + nop diff --git a/programs/interrupt_test.prog b/programs/interrupt_test.prog new file mode 100644 index 0000000..3dff467 --- /dev/null +++ b/programs/interrupt_test.prog @@ -0,0 +1,65 @@ +reset: + br always >main + nop + +hardfault: + reti + nop + +memfault: + reti + nop + +switches_interrupt: + br >switches_interrupt_handler + nop + +can_interrupt: + br >can_interrupt_handler + nop + +.align +led_addr: .word 0x000F0000 +timer_counter_addr: .word 0x000F0008 +timer_status_addr: .word 0x000F000C +dmem_start_addr: .word 0x00000400 +dmem_end_addr: .word 0x000004FC +priority_mask: .word 0xFFFFFF03 + +// timer_target_value: .word 127 // for simulation +timer_target_value: .word 0xF10000 // for real board + +main: + // Initialize stack pointer to the end of the data memory + ldr r12, >dmem_end_addr + + // Set runtime priority + ldr r0, >priority_mask + and r14, r0, r14 + + ldr r0,>led_addr // LED addr + ldr r1,>timer_status_addr // Timer addr + ldr r3,>timer_counter_addr // Timer addr + + // Set LED to pattern + clr r2 + addi r2, 0x7A + st08 r0, r2 + + // Enable the timer... + ldr r2, >timer_target_value + st32 r3, r2 + + clr r2 + addi r2, 0x1 // enable bit set + st32 r1, r2 + +loop: + br >loop + nop + +timer_interrupt_handler: + // Set LED to pattern + clr r2 + addi r2, 0x0C + st08 r0, r2 diff --git a/programs/scrolling.prog b/programs/scrolling.prog index 5f61807..e034797 100644 --- a/programs/scrolling.prog +++ b/programs/scrolling.prog @@ -12,11 +12,11 @@ nop scrolling_addr: .word 0x000F00A0 scrolling_count_addr: .word 0x000F00A4 -scrolling_cnt_value: .word 0x20FC000 // for real board -// scrolling_cnt_value: .word 0x500 // for simulation +// scrolling_cnt_value: .word 0x20FC000 // for real board +scrolling_cnt_value: .word 0x500 // for simulation -w_cnt_top: .word 0x3FC000 // for real board -// w_cnt_top: .word 0x100 //for simulation +// w_cnt_top: .word 0x3FC000 // for real board +w_cnt_top: .word 0x100 //for simulation pattern_ptr: .word =pattern1 diff --git a/soc/core/lt16x32_global.vhd b/soc/core/lt16x32_global.vhd index 4500d34..8c6f54a 100644 --- a/soc/core/lt16x32_global.vhd +++ b/soc/core/lt16x32_global.vhd @@ -8,7 +8,7 @@ package lt16x32_global is -- width of the memory, the core supports 32 only constant memory_width : integer := 32; -- width of the vector holding the interrupt number, maximum 7 due to processor architecture - constant irq_num_width : integer := 4; + constant irq_num_width : integer := 5; -- width of the vector holding the interrupt priority, maximum 6 due to processor architecture constant irq_prio_width : integer := 4; diff --git a/soc/lib/config.vhd b/soc/lib/config.vhd index 34d3eb1..854dea5 100644 --- a/soc/lib/config.vhd +++ b/soc/lib/config.vhd @@ -30,6 +30,7 @@ package config is constant CFG_SW : integer := CFG_LED+1; constant CFG_TIMER : integer := CFG_SW+1; constant CFG_SCR : integer := CFG_TIMER+1; + constant CFG_CAN : integer := CFG_SCR+1; ----------------------------- -- base address (BADR) & mask address (MADR) @@ -42,6 +43,7 @@ package config is constant CFG_BADR_SW : generic_addr_type := 16#000F0004#; constant CFG_BADR_TIMER : generic_addr_type := 16#000F0008#; constant CFG_BADR_SCR : generic_addr_type := 16#000F00A0#; + constant CFG_BADR_CAN : generic_addr_type := 16#000F0100#; -- mask addr constant CFG_MADR_ZERO : generic_mask_type := 0; @@ -52,6 +54,7 @@ package config is constant CFG_MADR_SW : generic_mask_type := 16#3FFFFF# - (4 - 1); -- size=4 byte constant CFG_MADR_TIMER : generic_mask_type := 16#3FFFFF# - (8 - 1); -- size=8 byte (2 words) constant CFG_MADR_SCR : generic_mask_type := 16#3FFFFF# - (8 - 1); -- size=8 byte + constant CFG_MADR_CAN : generic_mask_type := 16#3FFFFF# - (256 - 1); -- size=256 byte end package config; diff --git a/soc/peripheral/peripherals.vhd b/soc/peripheral/peripherals.vhd index f8dd4cb..bb5d10b 100644 --- a/soc/peripheral/peripherals.vhd +++ b/soc/peripheral/peripherals.vhd @@ -12,6 +12,22 @@ use work.config.all; package lt16soc_peripherals is + component can_vhdl_top is + generic( + memaddr : generic_addr_type; + addrmask : generic_mask_type + ); + port( + clk : in std_logic; + rstn : in std_logic; + wbs_i : in wb_slv_in_type; + wbs_o : out wb_slv_out_type; + rx_i : in std_logic; + tx_o : out std_logic; + irq_on : out std_logic + ); + end component can_vhdl_top; + component wb_led is generic( memaddr : generic_addr_type;-- := CFG_BADR_LED; @@ -38,7 +54,9 @@ package lt16soc_peripherals is wslvo : out wb_slv_out_type; buttons : in std_logic_vector(4 downto 0); - switches : in std_logic_vector(15 downto 0) + switches : in std_logic_vector(15 downto 0); + + interrupt : out std_logic ); end component; diff --git a/soc/peripheral/switches.vhd b/soc/peripheral/switches.vhd index 4826a1e..5257875 100644 --- a/soc/peripheral/switches.vhd +++ b/soc/peripheral/switches.vhd @@ -19,7 +19,9 @@ entity wb_switches is wslvo : out wb_slv_out_type; buttons : in std_logic_vector(4 downto 0); - switches : in std_logic_vector(15 downto 0) + switches : in std_logic_vector(15 downto 0); + + interrupt : out std_logic ); end wb_switches; @@ -28,6 +30,8 @@ architecture Behavioral of wb_switches is signal data : std_logic_vector(20 downto 0); signal ack : std_logic; + signal old_input : std_logic_vector(20 downto 0); + begin process(clk) @@ -55,6 +59,26 @@ begin end if; end process; + process(clk) + begin + if clk'event and clk='1' then + if rst = '1' then + interrupt <= '0'; + old_input <= (others => '0'); + else + if buttons & switches /= old_input + then + interrupt <= '1'; + else + interrupt <= '0'; + end if; + + old_input(15 downto 0) <= switches; + old_input(20 downto 16) <= buttons; + end if; + end if; + end process; + wslvo.dat(20 downto 0) <= data; wslvo.dat(31 downto 21) <= (others=>'0'); diff --git a/soc/testbench/can_demo_tb.vhd b/soc/testbench/can_demo_tb.vhd index 1eb55e8..60aaa65 100644 --- a/soc/testbench/can_demo_tb.vhd +++ b/soc/testbench/can_demo_tb.vhd @@ -111,13 +111,13 @@ begin --setup both can nodes - write_regs_from_file( "./testdata/default_setup.tdf", wbs_i1, wbs_o1, clk); + write_regs_from_file( "/home/derek/Git/lt16lab/soc/testbench/testdata/default_setup.tdf", wbs_i1, wbs_o1, clk); --wait for 1000 ns; - write_regs_from_file( "./testdata/default_setup.tdf", wbs_i2, wbs_o2, clk); + write_regs_from_file( "/home/derek/Git/lt16lab/soc/testbench/testdata/default_setup.tdf", wbs_i2, wbs_o2, clk); wait for 1000 ns; --setup and execute a 2 byte transmission in controller 1 - write_regs_from_file( "./testdata/data_send.tdf", wbs_i1, wbs_o1, clk); + write_regs_from_file( "/home/derek/Git/lt16lab/soc/testbench/testdata/data_send.tdf", wbs_i1, wbs_o1, clk); tx_vector(2) <= tx_vector(1); --manual ack by copying controler 2's ack @@ -131,7 +131,7 @@ begin --read status register of controller 1 can_wb_read_reg(wbs_i1, wbs_o1, 2, clk); --read from controller 2's read buffer - read_regs_with_fileaddr("./testdata/data_read.tdf", "read_data0.tdf", wbs_i2, wbs_o2, clk); + read_regs_with_fileaddr("/home/derek/Git/lt16lab/soc/testbench/testdata/data_read.tdf", "read_data0.tdf", wbs_i2, wbs_o2, clk); wait for 1200 ns; --release receive buffer of controller 2 @@ -146,8 +146,8 @@ begin wait on irq_on2; --read from both receive buffers - read_regs_with_fileaddr("./testdata/data_read.tdf", "read_data1.tdf", wbs_i1, wbs_o1, clk); - read_regs_with_fileaddr("./testdata/data_read.tdf", "read_data2.tdf", wbs_i2, wbs_o2, clk); + read_regs_with_fileaddr("/home/derek/Git/lt16lab/soc/testbench/testdata/data_read.tdf", "read_data1.tdf", wbs_i1, wbs_o1, clk); + read_regs_with_fileaddr("/home/derek/Git/lt16lab/soc/testbench/testdata/data_read.tdf", "read_data2.tdf", wbs_i2, wbs_o2, clk); wait for 2400 ns; --release both receive buffers can_wb_write_reg(wbs_i1, wbs_o1, 1, "00000100", clk); diff --git a/soc/testbench/project.vhd b/soc/testbench/project.vhd new file mode 100644 index 0000000..8474394 --- /dev/null +++ b/soc/testbench/project.vhd @@ -0,0 +1,72 @@ +-- See the file "LICENSE" for the full license governing this code. -- +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +ENTITY project_tb IS +END ENTITY; + +ARCHITECTURE sim OF project_tb IS + + constant CLK_PERIOD : time := 10 ns; + + signal clk : std_logic := '0'; + signal rst : std_logic; + + signal led : std_logic_vector(7 downto 0); + signal btn : std_logic_vector(4 downto 0) := (others => '0'); + signal sw : std_logic_vector(15 downto 0) := (others => '0'); + signal anodes : std_logic_vector(7 downto 0); + signal cathodes : std_logic_vector(7 downto 0); + + signal can_rx_i : std_logic := '1'; + signal can_tx_o : std_logic := '1'; + + COMPONENT lt16soc_top IS + generic( + programfilename : string := "../../programs/interrupt_test.ram" + ); + port( + clk : in std_logic; + rst : in std_logic; + led : out std_logic_vector(7 downto 0); + btn : in std_logic_vector(4 downto 0); + sw : in std_logic_vector(15 downto 0); + anodes : out std_logic_vector(7 downto 0); + cathodes : out std_logic_vector(7 downto 0); + can_rx_i : in std_logic; + can_tx_o : out std_logic + ); + END COMPONENT; + +BEGIN + + dut: lt16soc_top port map( + clk=>clk, + rst=>rst, + led=>led, + btn=>btn, + sw=>sw, + anodes=>anodes, + cathodes=>cathodes, + can_rx_i=>can_rx_i, + can_tx_o=>can_tx_o + ); + + clk_gen: process + begin + clk <= not clk; + wait for CLK_PERIOD/2; + end process clk_gen; + + stimuli: process + begin + rst <= '0'; + wait for CLK_PERIOD; + rst <= '1'; + wait for 100us; + assert false report "Simulation terminated!" severity failure; + end process stimuli; + + +END ARCHITECTURE; diff --git a/soc/testbench/switches_tb.vhd b/soc/testbench/switches_tb.vhd index b93c07e..a65cdd7 100644 --- a/soc/testbench/switches_tb.vhd +++ b/soc/testbench/switches_tb.vhd @@ -23,6 +23,8 @@ ARCHITECTURE sim OF switches_tb IS signal buttons: std_logic_vector(4 downto 0); signal switches : std_logic_vector(15 downto 0); + signal interrupt : std_logic; + signal slvi : wb_slv_in_type; signal slvo : wb_slv_out_type; @@ -38,6 +40,7 @@ BEGIN rst => rst, buttons => buttons, switches => switches, + interrupt => interrupt, wslvi => slvi, wslvo => slvo ); @@ -74,6 +77,31 @@ BEGIN generate_sync_wb_single_read(slvi,slvo,clk,data, SIZE => "01"); -- Half word wait for 100 ns; + + buttons <= "00000"; + switches <= x"DEAD"; + + wait for 50ns; + buttons <= "00100"; + switches <= x"DEAD"; + + wait for 50ns; + buttons <= "00000"; + switches <= x"DEAD"; + + wait for 50ns; + buttons <= "00000"; + switches <= x"DAAD"; + + wait for 50ns; + buttons <= "01000"; + switches <= x"DEAD"; + + wait for 50ns; + buttons <= "00010"; + switches <= x"DEAD"; + + wait for 50ns; assert false report "Simulation terminated!" severity failure; end process stimuli; diff --git a/soc/testbench/testdata/data_read.tdf b/soc/testbench/testdata/data_read.tdf new file mode 100644 index 0000000..1df864c --- /dev/null +++ b/soc/testbench/testdata/data_read.tdf @@ -0,0 +1,4 @@ +20 +21 +22 +23 \ No newline at end of file diff --git a/soc/testbench/testdata/data_send.tdf b/soc/testbench/testdata/data_send.tdf new file mode 100644 index 0000000..8768f7e --- /dev/null +++ b/soc/testbench/testdata/data_send.tdf @@ -0,0 +1,5 @@ +10 10101010 +11 11000010 +12 10101010 +13 00001111 +1 00000001 \ No newline at end of file diff --git a/soc/testbench/testdata/default_setup.tdf b/soc/testbench/testdata/default_setup.tdf new file mode 100644 index 0000000..7feff40 --- /dev/null +++ b/soc/testbench/testdata/default_setup.tdf @@ -0,0 +1,6 @@ +4 00000000 +5 11111111 +6 10000000 +7 01001000 +8 00000010 +0 11111110 \ No newline at end of file diff --git a/soc/top/top.vhd b/soc/top/top.vhd index 2e677f3..7c2da86 100644 --- a/soc/top/top.vhd +++ b/soc/top/top.vhd @@ -14,7 +14,7 @@ use work.lt16soc_peripherals.all; entity lt16soc_top is generic( - programfilename : string := "../../programs/scrolling.ram" -- see "Synthesize XST" process properties for actual value ("-generics" in .xst file)! + programfilename : string := "../../programs/interrupt_test.ram" -- see "Synthesize XST" process properties for actual value ("-generics" in .xst file)! ); port( -- clock signal @@ -28,7 +28,10 @@ port( sw : in std_logic_vector(15 downto 0); anodes : out std_logic_vector(7 downto 0); - cathodes : out std_logic_vector(7 downto 0) + cathodes : out std_logic_vector(7 downto 0); + + can_rx_i : in std_logic; + can_tx_o : out std_logic ); end entity lt16soc_top; @@ -40,7 +43,7 @@ architecture RTL of lt16soc_top is signal rst_gen : std_logic; - constant slv_mask_vector : std_logic_vector(0 to NWBSLV-1) := b"1111_1100_0000_0001"; + constant slv_mask_vector : std_logic_vector(0 to NWBSLV-1) := b"1111_1110_0000_0001"; constant mst_mask_vector : std_logic_vector(0 to NWBMST-1) := b"1000"; signal slvo : wb_slv_out_vector := (others=> wbs_out_none); @@ -180,12 +183,32 @@ begin addrmask=>CFG_MADR_DMEM) port map(clk,rst_gen,slvi(CFG_DMEM),slvo(CFG_DMEM)); + can_inst : component can_vhdl_top + generic map( + memaddr=>CFG_BADR_CAN, + addrmask=>CFG_MADR_CAN + ) + port map( + clk => clk, + rstn => rst, + wbs_i => slvi(CFG_CAN), + wbs_o => slvo(CFG_CAN), + rx_i => can_rx_i, + tx_o => can_tx_o, + irq_on => irq_lines(4) + ); + leddev : wb_led generic map( - CFG_BADR_LED,CFG_MADR_LED + CFG_BADR_LED, + CFG_MADR_LED ) port map( - clk,rst_gen,led,slvi(CFG_LED),slvo(CFG_LED) + clk, + rst_gen, + led, + slvi(CFG_LED), + slvo(CFG_LED) ); swdev : wb_switches @@ -198,10 +221,15 @@ begin timerdev : wb_timer generic map( - CFG_BADR_TIMER,CFG_MADR_TIMER + CFG_BADR_TIMER, + CFG_MADR_TIMER ) port map( - clk,rst_gen,slvi(CFG_TIMER),slvo(CFG_TIMER), irq_lines(3) + clk, + rst_gen, + slvi(CFG_TIMER), + slvo(CFG_TIMER), + irq_lines(3) ); scrollingdev : wb_scrolling diff --git a/soc/top/top.xdc b/soc/top/top.xdc index 750b6c9..f1a2f7e 100644 --- a/soc/top/top.xdc +++ b/soc/top/top.xdc @@ -81,8 +81,8 @@ set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btn[4] ##Pmod Headers ##Pmod Header JA -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { JA[1] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { JA[2] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { can_rx_i }]; #IO_L20N_T3_A19_15 Sch=ja[1] +set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { can_tx_o }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] #set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { JA[3] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] #set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { JA[4] }]; #IO_L18N_T2_A23_15 Sch=ja[4] #set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { JA[7] }]; #IO_L16N_T2_A27_15 Sch=ja[7]