Clear over CAN working
This commit is contained in:
@@ -19,36 +19,55 @@ can_interrupt:
|
|||||||
nop
|
nop
|
||||||
|
|
||||||
.align
|
.align
|
||||||
led_addr: .word 0x000F0000
|
|
||||||
switches_addr: .word 0x000F0004
|
|
||||||
dmem_start_addr: .word 0x00000400
|
dmem_start_addr: .word 0x00000400
|
||||||
dmem_end_addr: .word 0x000004FC
|
dmem_end_addr: .word 0x000004FC
|
||||||
|
|
||||||
|
led_addr: .word 0x000F0000
|
||||||
|
switches_addr: .word 0x000F0004
|
||||||
|
scrolling_addr: .word 0x000F00A0
|
||||||
|
scrolling_count_addr: .word 0x000F00A4
|
||||||
|
|
||||||
priority_mask: .word 0xFFFFFF03
|
priority_mask: .word 0xFFFFFF03
|
||||||
|
write_mask: .word 0x1000000
|
||||||
|
clear_mask: .word 0x100
|
||||||
|
// scrolling_cnt_value: .word 0x20FC000 // for real board
|
||||||
|
scrolling_cnt_value: .word 0x500 // for simulation
|
||||||
|
|
||||||
// CAN
|
// CAN
|
||||||
can_control_addr: .word 0x000F0100
|
can_control_addr: .word 0x000F0100
|
||||||
can_command_addr: .word 0x000F0101
|
can_command_addr: .word 0x000F0101
|
||||||
|
can_interrupt_addr: .word 0x000F0103
|
||||||
can_acceptance_code_addr: .word 0x000F0104
|
can_acceptance_code_addr: .word 0x000F0104
|
||||||
can_acceptance_mask_addr: .word 0x000F0105
|
can_acceptance_mask_addr: .word 0x000F0105
|
||||||
can_bus_timing0_addr: .word 0x000F0106
|
can_bus_timing0_addr: .word 0x000F0106
|
||||||
can_bus_timing1_addr: .word 0x000F0107
|
can_bus_timing1_addr: .word 0x000F0107
|
||||||
can_output_control_addr: .word 0x000F0108
|
can_output_control_addr: .word 0x000F0108
|
||||||
can_identifier0_addr: .word 0x000F010A
|
can_tx_identifier0_addr: .word 0x000F010A
|
||||||
can_identifier1_addr: .word 0x000F010B
|
can_tx_identifier1_addr: .word 0x000F010B
|
||||||
can_data0_addr: .word 0x000F010C
|
can_tx_data0_addr: .word 0x000F010C
|
||||||
can_data1_addr: .word 0x000F010D
|
can_tx_data1_addr: .word 0x000F010D
|
||||||
|
can_rx_data0_addr: .word 0x000F0116
|
||||||
|
can_rx_data1_addr: .word 0x000F0117
|
||||||
|
|
||||||
// CAN Constants
|
// CAN Constants
|
||||||
acceptance_code: .word 0x00
|
acceptance_code: .word 0x00
|
||||||
acceptance_mask: .word 0xFF
|
acceptance_mask: .word 0xFF
|
||||||
// btr0: .word 0x45 Real board
|
// btr0: .word 0x45 // for Real board
|
||||||
// btr1: .word 0x16 Real board
|
// btr1: .word 0x16 // for Real board
|
||||||
btr0: .word 0x80
|
btr0: .word 0x80
|
||||||
btr1: .word 0x48
|
btr1: .word 0x48
|
||||||
output_control: .word 0x02
|
output_control: .word 0x02
|
||||||
control: .word 0xFE
|
control: .word 0xFE
|
||||||
id0: .word 0xAA
|
id0: .word 0xAA
|
||||||
id1: .word 0xC2
|
id1: .word 0xC1 // data length is also encoded here
|
||||||
|
rx_interrupt_mask: .word 0x01
|
||||||
|
tx_interrupt_mask: .word 0x02
|
||||||
|
frame_data_add: .word 0x00
|
||||||
|
frame_data_clear: .word 0x01
|
||||||
|
frame_frequency: .word 0x02
|
||||||
|
button_data_add: .word 0x10000
|
||||||
|
button_data_clear: .word 0x20000
|
||||||
|
button_frequency: .word 0x40000
|
||||||
|
|
||||||
main:
|
main:
|
||||||
// Initialize stack pointer to the end of the data memory
|
// Initialize stack pointer to the end of the data memory
|
||||||
@@ -58,6 +77,11 @@ main:
|
|||||||
ldr r0, >priority_mask
|
ldr r0, >priority_mask
|
||||||
and r14, r0, r14
|
and r14, r0, r14
|
||||||
|
|
||||||
|
// (Re)set scrolling speed
|
||||||
|
ldr r5, >scrolling_count_addr
|
||||||
|
ldr r7, >scrolling_cnt_value
|
||||||
|
st32 r5, r7
|
||||||
|
|
||||||
// --- CAN init ---
|
// --- CAN init ---
|
||||||
ldr r0, >can_acceptance_code_addr
|
ldr r0, >can_acceptance_code_addr
|
||||||
ldr r3, >acceptance_code
|
ldr r3, >acceptance_code
|
||||||
@@ -83,50 +107,144 @@ main:
|
|||||||
ldr r3, >control
|
ldr r3, >control
|
||||||
st08 r0, r3
|
st08 r0, r3
|
||||||
|
|
||||||
ldr r0, >can_identifier0_addr
|
loop:
|
||||||
|
br >loop
|
||||||
|
nop
|
||||||
|
|
||||||
|
can_interrupt_handler:
|
||||||
|
// Dispatch interrupt event
|
||||||
|
ldr r0, >can_interrupt_addr
|
||||||
|
ld08 r1, r0
|
||||||
|
clr r4
|
||||||
|
|
||||||
|
ldr r2, >rx_interrupt_mask
|
||||||
|
and r5, r1, r2
|
||||||
|
cmp neq r5, r4
|
||||||
|
br true >can_rx_handler
|
||||||
|
nop
|
||||||
|
|
||||||
|
ldr r2, >tx_interrupt_mask
|
||||||
|
and r5, r1, r2
|
||||||
|
cmp neq r5, r4
|
||||||
|
br true >can_tx_handler
|
||||||
|
nop
|
||||||
|
|
||||||
|
// Unimplemented CAN interrupt
|
||||||
|
reti
|
||||||
|
nop
|
||||||
|
|
||||||
|
switches_interrupt_handler:
|
||||||
|
// Read switch state
|
||||||
|
ldr r0, >switches_addr
|
||||||
|
ld32 r2, r0
|
||||||
|
|
||||||
|
clr r4
|
||||||
|
|
||||||
|
ldr r3, >button_data_clear
|
||||||
|
and r5, r2, r3
|
||||||
|
cmp neq r5, r4
|
||||||
|
br true >can_send_data_clear_frame
|
||||||
|
nop
|
||||||
|
|
||||||
|
// Unimplemented button function
|
||||||
|
|
||||||
|
reti
|
||||||
|
nop
|
||||||
|
|
||||||
|
can_tx_handler:
|
||||||
|
reti
|
||||||
|
nop
|
||||||
|
|
||||||
|
can_send_data_clear_frame:
|
||||||
|
ldr r0, >can_tx_identifier0_addr
|
||||||
ldr r3, >id0
|
ldr r3, >id0
|
||||||
st08 r0, r3
|
st08 r0, r3
|
||||||
|
|
||||||
ldr r0, >can_identifier1_addr
|
ldr r0, >can_tx_identifier1_addr
|
||||||
ldr r3, >id1
|
ldr r3, >id1
|
||||||
st08 r0, r3
|
st08 r0, r3
|
||||||
|
|
||||||
ldr r0, >can_data0_addr
|
ldr r0, >can_tx_data0_addr
|
||||||
clr r3
|
ldr r3, >frame_data_clear
|
||||||
addi r3, 0x7A
|
|
||||||
st08 r0, r3
|
st08 r0, r3
|
||||||
|
|
||||||
ldr r0, >can_data1_addr
|
|
||||||
clr r3
|
|
||||||
addi r3, 0x4F
|
|
||||||
st08 r0, r3
|
|
||||||
|
|
||||||
// Wait some clks
|
|
||||||
call >wait
|
|
||||||
|
|
||||||
ldr r0, >can_command_addr
|
ldr r0, >can_command_addr
|
||||||
clr r3
|
clr r3
|
||||||
addi r3, 0x01
|
addi r3, 0x01
|
||||||
st08 r0, r3
|
st08 r0, r3
|
||||||
|
|
||||||
ldr r0, >led_addr
|
|
||||||
ldr r1, >switches_addr
|
|
||||||
|
|
||||||
st08 r0, r2
|
|
||||||
loop:
|
|
||||||
br >loop
|
|
||||||
nop
|
|
||||||
|
|
||||||
switches_interrupt_handler:
|
|
||||||
ld32 r2, r1
|
|
||||||
|
|
||||||
// Set LED to pattern
|
|
||||||
st08 r0, r2
|
|
||||||
|
|
||||||
reti
|
reti
|
||||||
nop
|
nop
|
||||||
|
|
||||||
can_interrupt_handler:
|
can_rx_handler:
|
||||||
|
// Dispatch CAN frame
|
||||||
|
ldr r0, >can_rx_data0_addr
|
||||||
|
ld08 r1, r0
|
||||||
|
|
||||||
|
ldr r2, >frame_data_add
|
||||||
|
cmp eq r2, r1
|
||||||
|
br true >can_handle_data_add_frame
|
||||||
|
nop
|
||||||
|
|
||||||
|
ldr r2, >frame_data_clear
|
||||||
|
cmp eq r2, r1
|
||||||
|
br true >can_handle_data_clear_frame
|
||||||
|
nop
|
||||||
|
|
||||||
|
ldr r2, >frame_frequency
|
||||||
|
cmp eq r2, r1
|
||||||
|
br true >can_handle_frequency_frame
|
||||||
|
nop
|
||||||
|
|
||||||
|
// Unimplemented CAN frame
|
||||||
|
reti
|
||||||
|
nop
|
||||||
|
|
||||||
|
.align
|
||||||
|
scrolling_addr_ptr: .word =scrolling_addr
|
||||||
|
write_mask_ptr: .word =write_mask_ptr
|
||||||
|
|
||||||
|
can_handle_data_add_frame:
|
||||||
|
// Expect symbol to add in r10 register
|
||||||
|
|
||||||
|
ldr r0, >scrolling_addr_ptr
|
||||||
|
ld32 r0, r0
|
||||||
|
|
||||||
|
ldr r1, >write_mask_ptr
|
||||||
|
ld32 r1, r1
|
||||||
|
|
||||||
|
lsh r10, r10, 16
|
||||||
|
or r4, r4, r1
|
||||||
|
st32 r0, r4
|
||||||
|
|
||||||
|
reti
|
||||||
|
nop
|
||||||
|
|
||||||
|
.align
|
||||||
|
clear_mask_ptr: .word =clear_mask
|
||||||
|
can_command_addr_ptr: .word =can_command_addr
|
||||||
|
|
||||||
|
can_handle_data_clear_frame:
|
||||||
|
// Release receive buffer
|
||||||
|
ldr r0, >can_command_addr_ptr
|
||||||
|
ld32 r0, r0
|
||||||
|
clr r1
|
||||||
|
addi r1, 0x04
|
||||||
|
st08 r0, r1
|
||||||
|
|
||||||
|
ldr r0, >scrolling_addr_ptr
|
||||||
|
ldr r1, >clear_mask_ptr
|
||||||
|
|
||||||
|
ld32 r0, r0
|
||||||
|
ld32 r1, r1
|
||||||
|
|
||||||
|
st32 r0, r1
|
||||||
|
|
||||||
|
reti
|
||||||
|
nop
|
||||||
|
|
||||||
|
can_handle_frequency_frame:
|
||||||
|
// TODO
|
||||||
reti
|
reti
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ priority_mask: .word 0xFFFFFF03
|
|||||||
// CAN
|
// CAN
|
||||||
can_control_addr: .word 0x000F0100
|
can_control_addr: .word 0x000F0100
|
||||||
can_command_addr: .word 0x000F0101
|
can_command_addr: .word 0x000F0101
|
||||||
|
can_interrupt_addr: .word 0x000F0103
|
||||||
can_acceptance_code_addr: .word 0x000F0104
|
can_acceptance_code_addr: .word 0x000F0104
|
||||||
can_acceptance_mask_addr: .word 0x000F0105
|
can_acceptance_mask_addr: .word 0x000F0105
|
||||||
can_bus_timing0_addr: .word 0x000F0106
|
can_bus_timing0_addr: .word 0x000F0106
|
||||||
|
|||||||
@@ -20,12 +20,14 @@ ARCHITECTURE sim OF project_2top_tb IS
|
|||||||
|
|
||||||
signal led0 : std_logic_vector(7 downto 0);
|
signal led0 : std_logic_vector(7 downto 0);
|
||||||
signal led1 : std_logic_vector(7 downto 0);
|
signal led1 : std_logic_vector(7 downto 0);
|
||||||
signal btn : std_logic_vector(4 downto 0) := (others => '0');
|
signal btn0 : std_logic_vector(4 downto 0) := (others => '0');
|
||||||
|
signal btn1 : std_logic_vector(4 downto 0) := (others => '0');
|
||||||
signal sw : std_logic_vector(15 downto 0) := (others => '0');
|
signal sw : std_logic_vector(15 downto 0) := (others => '0');
|
||||||
signal anodes0 : std_logic_vector(7 downto 0);
|
signal anodes0 : std_logic_vector(7 downto 0);
|
||||||
signal cathodes0 : std_logic_vector(7 downto 0);
|
signal cathodes0 : std_logic_vector(7 downto 0);
|
||||||
signal anodes1 : std_logic_vector(7 downto 0);
|
signal anodes1 : std_logic_vector(7 downto 0);
|
||||||
signal cathodes1 : std_logic_vector(7 downto 0);
|
signal cathodes1 : std_logic_vector(7 downto 0);
|
||||||
|
signal rst_n : std_logic;
|
||||||
|
|
||||||
constant peer_num_inst : integer := 2;
|
constant peer_num_inst : integer := 2;
|
||||||
signal rx_vector : std_logic_vector(peer_num_inst - 1 downto 0);
|
signal rx_vector : std_logic_vector(peer_num_inst - 1 downto 0);
|
||||||
@@ -67,7 +69,7 @@ BEGIN
|
|||||||
clk=>clk,
|
clk=>clk,
|
||||||
rst=>rst,
|
rst=>rst,
|
||||||
led=>led0,
|
led=>led0,
|
||||||
btn=>btn,
|
btn=>btn0,
|
||||||
sw=>sw,
|
sw=>sw,
|
||||||
anodes=>anodes0,
|
anodes=>anodes0,
|
||||||
cathodes=>cathodes0,
|
cathodes=>cathodes0,
|
||||||
@@ -77,13 +79,13 @@ BEGIN
|
|||||||
|
|
||||||
soc1: lt16soc_top
|
soc1: lt16soc_top
|
||||||
generic map(
|
generic map(
|
||||||
programfilename => "../../programs/project_init.ram"
|
programfilename => "../../programs/project.ram"
|
||||||
)
|
)
|
||||||
port map(
|
port map(
|
||||||
clk=>clk,
|
clk=>clk,
|
||||||
rst=>rst,
|
rst=>rst,
|
||||||
led=>led1,
|
led=>led1,
|
||||||
btn=>btn,
|
btn=>btn1,
|
||||||
sw=>sw,
|
sw=>sw,
|
||||||
anodes=>anodes1,
|
anodes=>anodes1,
|
||||||
cathodes=>cathodes1,
|
cathodes=>cathodes1,
|
||||||
@@ -96,7 +98,7 @@ BEGIN
|
|||||||
peer_num => peer_num_inst
|
peer_num => peer_num_inst
|
||||||
)
|
)
|
||||||
port map(
|
port map(
|
||||||
rst => not rst,
|
rst => rst_n,
|
||||||
rx_vector => rx_vector,
|
rx_vector => rx_vector,
|
||||||
tx_vector => tx_vector
|
tx_vector => tx_vector
|
||||||
);
|
);
|
||||||
@@ -112,8 +114,17 @@ BEGIN
|
|||||||
rst <= '0';
|
rst <= '0';
|
||||||
wait for CLK_PERIOD;
|
wait for CLK_PERIOD;
|
||||||
rst <= '1';
|
rst <= '1';
|
||||||
|
|
||||||
|
sw <= x"000F";
|
||||||
|
|
||||||
|
wait for 3us;
|
||||||
|
btn0 <= "00001"; -- add
|
||||||
|
-- btn0 <= "00010"; -- clear
|
||||||
|
|
||||||
wait for 300us;
|
wait for 300us;
|
||||||
assert false report "Simulation terminated!" severity failure;
|
assert false report "Simulation terminated!" severity failure;
|
||||||
end process stimuli;
|
end process stimuli;
|
||||||
|
|
||||||
|
rst_n <= not rst;
|
||||||
|
|
||||||
END ARCHITECTURE;
|
END ARCHITECTURE;
|
||||||
|
|||||||
Reference in New Issue
Block a user