From 53ddd2edc2a306579f835e62180c9caaea87c29b Mon Sep 17 00:00:00 2001 From: Gustavo-V-F Date: Sat, 5 Mar 2022 23:33:10 -0300 Subject: [PATCH] Returned Nokia 5110 LCD unrelated files to original state --- memory/iram_quartus.vhd | 82 +- peripherals/gpio/testbench.vhd | 224 ++--- peripherals/lcd/tb.do | 33 - software/Makefile | 6 +- software/blink.c | 2 +- software/quartus_blink.hex | 1407 +++++++++++++++----------------- testbench.do | 2 +- testbench.vhd | 436 +++++----- 8 files changed, 1046 insertions(+), 1146 deletions(-) delete mode 100644 peripherals/lcd/tb.do diff --git a/memory/iram_quartus.vhd b/memory/iram_quartus.vhd index 421e90da..2b3e9bd9 100644 --- a/memory/iram_quartus.vhd +++ b/memory/iram_quartus.vhd @@ -17,6 +17,7 @@ -- 20.1.1 Build 720 11/11/2020 SJ Lite Edition -- ************************************************************ + --Copyright (C) 2020 Intel Corporation. All rights reserved. --Your use of Intel Corporation's design tools, logic functions --and other software and tools, and any partner logic @@ -32,6 +33,7 @@ --refer to the applicable agreement for further details, at --https://fpgasoftware.intel.com/eula. + LIBRARY ieee; USE ieee.std_logic_1164.all; @@ -39,50 +41,54 @@ LIBRARY altera_mf; USE altera_mf.altera_mf_components.all; ENTITY iram_quartus IS - PORT( - address : IN STD_LOGIC_VECTOR(9 DOWNTO 0); - byteena : IN STD_LOGIC_VECTOR(3 DOWNTO 0) := (OTHERS => '1'); - clock : IN STD_LOGIC := '1'; - data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); - wren : IN STD_LOGIC; - q : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) - ); + PORT + ( + address : IN STD_LOGIC_VECTOR (9 DOWNTO 0); + byteena : IN STD_LOGIC_VECTOR (3 DOWNTO 0) := (OTHERS => '1'); + clock : IN STD_LOGIC := '1'; + data : IN STD_LOGIC_VECTOR (31 DOWNTO 0); + wren : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (31 DOWNTO 0) + ); END iram_quartus; + ARCHITECTURE SYN OF iram_quartus IS - SIGNAL sub_wire0 : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (31 DOWNTO 0); BEGIN - q <= sub_wire0(31 DOWNTO 0); - - altsyncram_component : altsyncram - GENERIC MAP( - byte_size => 8, - clock_enable_input_a => "BYPASS", - clock_enable_output_a => "BYPASS", - init_file => "./software/quartus_lcd.hex", - intended_device_family => "MAX 10", - lpm_hint => "ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=1", - lpm_type => "altsyncram", - numwords_a => 1000, - operation_mode => "SINGLE_PORT", - outdata_aclr_a => "NONE", - outdata_reg_a => "UNREGISTERED", - power_up_uninitialized => "FALSE", - read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", - widthad_a => 10, - width_a => 32, - width_byteena_a => 4 - ) - PORT MAP( - address_a => address, - byteena_a => byteena, - clock0 => clock, - data_a => data, - wren_a => wren, - q_a => sub_wire0 - ); + q <= sub_wire0(31 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + byte_size => 8, + clock_enable_input_a => "BYPASS", + clock_enable_output_a => "BYPASS", + init_file => "./software/quartus_blink.hex", + intended_device_family => "MAX 10", + lpm_hint => "ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=1", + lpm_type => "altsyncram", + numwords_a => 1024, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + read_during_write_mode_port_a => "NEW_DATA_NO_NBE_READ", + widthad_a => 10, + width_a => 32, + width_byteena_a => 4 + ) + PORT MAP ( + address_a => address, + byteena_a => byteena, + clock0 => clock, + data_a => data, + wren_a => wren, + q_a => sub_wire0 + ); + + END SYN; diff --git a/peripherals/gpio/testbench.vhd b/peripherals/gpio/testbench.vhd index de2e133b..f70f3ba6 100644 --- a/peripherals/gpio/testbench.vhd +++ b/peripherals/gpio/testbench.vhd @@ -7,73 +7,73 @@ use work.decoder_types.all; entity coretestbench is generic( --! Num of 32-bits memory words - IMEMORY_WORDS : integer := 1024; --!= 4K (1024 * 4) bytes - DMEMORY_WORDS : integer := 1024 --!= 2k (512 * 2) bytes + IMEMORY_WORDS : integer := 1024; --!= 4K (1024 * 4) bytes + DMEMORY_WORDS : integer := 1024 --!= 2k (512 * 2) bytes ); port( ----------- SEG7 ------------ - HEX0 : out std_logic_vector(7 downto 0); - HEX1 : out std_logic_vector(7 downto 0); - HEX2 : out std_logic_vector(7 downto 0); - HEX3 : out std_logic_vector(7 downto 0); - HEX4 : out std_logic_vector(7 downto 0); - HEX5 : out std_logic_vector(7 downto 0); + HEX0 : out std_logic_vector(7 downto 0); + HEX1 : out std_logic_vector(7 downto 0); + HEX2 : out std_logic_vector(7 downto 0); + HEX3 : out std_logic_vector(7 downto 0); + HEX4 : out std_logic_vector(7 downto 0); + HEX5 : out std_logic_vector(7 downto 0); ----------- SW ------------ - SW : in std_logic_vector(9 downto 0); - LEDR : out std_logic_vector(9 downto 0); + SW: in std_logic_vector(9 downto 0); + LEDR: out std_logic_vector(9 downto 0); + ---------- ARDUINO IO ----- - ARDUINO_IO : inout std_logic_vector(15 downto 0) + ARDUINO_IO: inout std_logic_vector(15 downto 0) ); + end entity coretestbench; architecture RTL of coretestbench is -- Clocks and reset - signal clk : std_logic; - signal clk_32x : std_logic; - signal rst : std_logic; - + signal clk : std_logic; + signal clk_32x : std_logic; + signal rst : std_logic; + -- Instruction bus and instruction memory - signal address : std_logic_vector(9 downto 0); + signal address : std_logic_vector(9 downto 0); signal iaddress : unsigned(15 downto 0); - signal idata : std_logic_vector(31 downto 0); - + signal idata : std_logic_vector(31 downto 0); + -- Data bus - signal daddress : unsigned(31 downto 0); - signal ddata_r : std_logic_vector(31 downto 0); - signal ddata_w : std_logic_vector(31 downto 0); - signal dmask : std_logic_vector(3 downto 0); - signal dcsel : std_logic_vector(1 downto 0); - signal d_we : std_logic := '0'; + signal daddress : unsigned(31 downto 0); + signal ddata_r : std_logic_vector(31 downto 0); + signal ddata_w : std_logic_vector(31 downto 0); + signal dmask : std_logic_vector(3 downto 0); + signal dcsel : std_logic_vector(1 downto 0); + signal d_we : std_logic := '0'; signal ddata_r_mem : std_logic_vector(31 downto 0); - signal d_rd : std_logic; - signal d_sig : std_logic; + signal d_rd : std_logic; + signal d_sig : std_logic; -- Modelsim debug signals - signal cpu_state : cpu_state_t; - signal debugString : string(1 to 40) := (others => '0'); + signal cpu_state : cpu_state_t; + signal debugString : string(1 to 40) := (others => '0'); -- I/O signals - signal interrupts : std_logic_vector(31 downto 0); + signal interrupts : std_logic_vector(31 downto 0); signal ddata_r_gpio : std_logic_vector(31 downto 0); - signal gpio_input : std_logic_vector(31 downto 0); - signal gpio_output : std_logic_vector(31 downto 0); + signal gpio_input : std_logic_vector(31 downto 0); + signal gpio_output : std_logic_vector(31 downto 0); - signal ddata_r_timer : std_logic_vector(31 downto 0); + signal ddata_r_timer : std_logic_vector(31 downto 0); signal timer_interrupt : std_logic_vector(5 downto 0); - signal ddata_r_periph : std_logic_vector(31 downto 0); - signal ddata_r_sdram : std_logic_vector(31 downto 0); + signal ddata_r_periph : std_logic_vector(31 downto 0); + signal ddata_r_sdram : std_logic_vector(31 downto 0); - signal gpio_interrupts : std_logic_vector(6 downto 0); + signal gpio_interrupts : std_logic_vector(6 downto 0); signal ddata_r_segments : std_logic_vector(31 downto 0); - signal ddata_r_uart : std_logic_vector(31 downto 0); - signal ddata_r_adc : std_logic_vector(31 downto 0); - signal ddata_r_i2c : std_logic_vector(31 downto 0); - signal ddata_r_stepmot : std_logic_vector(31 downto 0); - signal ddata_r_dif_fil : std_logic_vector(31 downto 0); - + signal ddata_r_uart : std_logic_vector(31 downto 0); + signal ddata_r_adc : std_logic_vector(31 downto 0); + signal ddata_r_i2c : std_logic_vector(31 downto 0); + begin clock_driver : process @@ -94,7 +94,7 @@ begin clk_32x <= '1'; wait for period / 2; end process clock_driver_32x; - + reset : process is begin rst <= '1'; @@ -102,40 +102,40 @@ begin rst <= '0'; wait; end process reset; - + -- Connect gpio data to output hardware - LEDR <= gpio_output(9 downto 0); + LEDR <= gpio_output(9 downto 0); -- Connect input hardware to gpio data - gpio_test : process + gpio_test: process begin gpio_input <= (others => '0'); wait for 500 us; - + -- Generate a input pulse (External IRQ 0 or pooling) gpio_input(0) <= '1'; wait for 1 us; gpio_input(0) <= '0'; - + -- Generate a input pulse (External IRQ 1 or pooling) wait for 200 us; gpio_input(1) <= '1'; wait for 1 us; gpio_input(1) <= '0'; - + wait; - end process; + end process; -- IMem shoud be read from instruction and data buses -- Not enough RAM ports for instruction bus, data bus and in-circuit programming - instr_mux : entity work.instructionbusmux + instr_mux: entity work.instructionbusmux port map( d_rd => d_rd, dcsel => dcsel, daddress => daddress, iaddress => iaddress, address => address - ); + ); -- 32-bits x 1024 words quartus RAM (dual port: portA -> riscV, portB -> In-System Mem Editor iram_quartus_inst : entity work.iram_quartus @@ -155,15 +155,15 @@ begin MEMORY_WORDS => DMEMORY_WORDS ) port map( - rst => rst, - clk => clk, - data => ddata_w, - address => daddress, - we => d_we, + rst => rst, + clk => clk, + data => ddata_w, + address => daddress, + we => d_we, signal_ext => d_sig, - csel => dcsel(0), - dmask => dmask, - q => ddata_r_mem + csel => dcsel(0), + dmask => dmask, + q => ddata_r_mem ); -- Adress space mux ((check sections.ld) -> Data chip select: @@ -171,7 +171,7 @@ begin -- 0x20000 -> Data memory -- 0x40000 -> Input/Output generic address space -- 0x60000 -> SDRAM address space - data_bus_mux : entity work.databusmux + data_bus_mux: entity work.databusmux port map( dcsel => dcsel, idata => idata, @@ -180,8 +180,8 @@ begin ddata_r_sdram => ddata_r_sdram, ddata_r => ddata_r ); - - io_data_bus_mux : entity work.iodatabusmux + + io_data_bus_mux: entity work.iodatabusmux port map( daddress => daddress, ddata_r_gpio => ddata_r_gpio, @@ -190,69 +190,69 @@ begin ddata_r_adc => ddata_r_adc, ddata_r_i2c => ddata_r_i2c, ddata_r_timer => ddata_r_timer, - ddata_r_periph => ddata_r_periph, - ddata_r_stepmot => ddata_r_stepmot, - ddata_r_dif_fil => ddata_r_dif_fil + ddata_r_periph => ddata_r_periph ); -- Softcore instatiation myRiscv : entity work.core port map( - clk => clk, - rst => rst, - clk_32x => clk_32x, - iaddress => iaddress, - idata => idata, - daddress => daddress, - ddata_r => ddata_r, - ddata_w => ddata_w, - d_we => d_we, - d_rd => d_rd, - d_sig => d_sig, - dcsel => dcsel, - dmask => dmask, - interrupts => interrupts, - state => cpu_state + clk => clk, + rst => rst, + clk_32x => clk_32x, + iaddress => iaddress, + idata => idata, + daddress => daddress, + ddata_r => ddata_r, + ddata_w => ddata_w, + d_we => d_we, + d_rd => d_rd, + d_sig => d_sig, + dcsel => dcsel, + dmask => dmask, + interrupts=>interrupts, + state => cpu_state ); - + -- Group IRQ signals. - irq_signals : process(timer_interrupt, gpio_interrupts) + irq_signals: process(timer_interrupt,gpio_interrupts) begin - interrupts <= (others => '0'); - interrupts(24 downto 18) <= gpio_interrupts(6 downto 0); - interrupts(30 downto 25) <= timer_interrupt; + interrupts <= (others => '0'); + interrupts(24 downto 18) <= gpio_interrupts(6 downto 0); + interrupts(30 downto 25) <= timer_interrupt; end process; -- Generic GPIO module instantiation - generic_gpio : entity work.gpio - generic map( - MY_CHIPSELECT => "10", - MY_WORD_ADDRESS => x"0010" - ) - port map( - clk => clk, - rst => rst, - daddress => daddress, - ddata_w => ddata_w, - ddata_r => ddata_r_gpio, - d_we => d_we, - d_rd => d_rd, - dcsel => dcsel, - dmask => dmask, - input => gpio_input, - output => gpio_output, - gpio_interrupts => gpio_interrupts - ); + generic_gpio: entity work.gpio + generic map( + MY_CHIPSELECT => "10", + MY_WORD_ADDRESS => x"0010" + ) + port map( + clk => clk, + rst => rst, + daddress => daddress, + ddata_w => ddata_w, + ddata_r => ddata_r_gpio, + d_we => d_we, + d_rd => d_rd, + dcsel => dcsel, + dmask => dmask, + input => gpio_input, + output => gpio_output, + gpio_interrupts => gpio_interrupts + ); + + -- FileOutput DEBUG debug : entity work.trace_debug - generic map( - MEMORY_WORDS => IMEMORY_WORDS - ) - port map( - pc => iaddress, - data => idata, - inst => debugString - ); + generic map( + MEMORY_WORDS => IMEMORY_WORDS + ) + port map( + pc => iaddress, + data => idata, + inst => debugString + ); end architecture RTL; diff --git a/peripherals/lcd/tb.do b/peripherals/lcd/tb.do deleted file mode 100644 index 7b8623a0..00000000 --- a/peripherals/lcd/tb.do +++ /dev/null @@ -1,33 +0,0 @@ -#Cria biblioteca do projeto -vlib work - -#compila projeto: todos os arquivos. Ordem é importante -vcom lcd.vhd lcd_tb.vhd - -#Simula (work é o diretório, testbench é o nome da entity) -vsim -voptargs="+acc" -t ns work.lcd_tb - -#Mostra forma de onda -view wave - -#Adiciona ondas específicas -# -radix: binary, hex, dec -# -label: nome da forma de onda - -add wave -height 15 -divider "Input" -add wave -radix binary /clk -add wave -radix binary /reset -add wave -radix ASCII /char -add wave -height 15 -divider "Output" -add wave -radix binary /rst -add wave -radix binary /ce -add wave -radix binary /dc -add wave -radix binary /din -add wave -radix binary /serial_clk -add wave -radix binary /light - -#Simula até uns 5400us -run 5400us - -wave zoomfull -write wave wave.ps diff --git a/software/Makefile b/software/Makefile index 400daa22..d1db440e 100644 --- a/software/Makefile +++ b/software/Makefile @@ -1,10 +1,10 @@ ifndef RISCV_TOOLS_PREFIX #RISCV_TOOLS_PREFIX=riscv-none-embed- # Para usar no LSC -RISCV_TOOLS_PREFIX = ~/.local/xPacks/@gnu-mcu-eclipse/riscv-none-gcc/8.2.0-2.2.1/.content/bin/riscv-none-embed- +RISCV_TOOLS_PREFIX = /home/rayanst/.local/xPacks/@xpack-dev-tools/riscv-none-embed-gcc/10.1.0-1.1.1/.content/bin/riscv-none-embed- endif -QUARTUS_DIR=~/intelFPGA_lite/21.1/quartus/bin/ +QUARTUS_DIR=/home/rayanst/intelFPGA_lite/20.1/quartus/bin/ CXX = $(RISCV_TOOLS_PREFIX)g++ -march=rv32im CC = $(RISCV_TOOLS_PREFIX)gcc -march=rv32im -O1 -fpack-struct AS = $(RISCV_TOOLS_PREFIX)gcc -march=rv32im @@ -13,7 +13,7 @@ AS = $(RISCV_TOOLS_PREFIX)gcc -march=rv32im #LDFLAGS = -Wl,--gc-sections,--no-relax LDFLAGS = -Wl LDLIBS = -MAIN = lcd +MAIN = blink #test: testbench.vvp $(MAIN)32.hex # # vvp -l testbench.log -N testbench.vvp diff --git a/software/blink.c b/software/blink.c index ac186d56..e2b22610 100644 --- a/software/blink.c +++ b/software/blink.c @@ -27,7 +27,7 @@ int main(){ /* Counter blink */ OUTBUS = data; SEGMENTS_BASE_ADDRESS = data; - delay_(10000); + // delay_(10000); data++; } diff --git a/software/quartus_blink.hex b/software/quartus_blink.hex index 8d14e513..3d1724a0 100644 --- a/software/quartus_blink.hex +++ b/software/quartus_blink.hex @@ -1,13 +1,13 @@ :0400000030047073e5 :040001000000029762 -:040002005d42829346 +:04000200570282938c :040003003072907354 :04000400000002975f -:04000500520282938e +:040005004bc28293d5 :040006007ec29073b3 :040007007ec0e07364 :04000800000002975b -:040009004482829318 +:040009003e4282935e :04000a00305290736d :04000b0002001137a7 :04000c00800101135b @@ -18,7 +18,7 @@ :0400110000012223a5 :0400120000012423a2 :04001300000126239f -:040014000f4000efaa +:040014000fc000ef2a :040015000010007364 :0400160000000000e6 :0400170000000000e5 @@ -64,315 +64,315 @@ :04003f0000000000bd :040040000200019722 :04004100f0018193b6 -:04004200434185139e -:04004300458186135a +:0400420042c185131f +:0400430045018613da :0400440040a6063399 :04004500000005931f -:040046001a0000efad -:040047000000051799 -:0400480059850513be -:04004900538000eff1 -:04004a005ec000efa5 -:04004b000001250388 -:04004c0000410593d7 -:04004d000000061396 -:04004e0000c000efff -:04004f005400006fea -:0400500000008067c5 -:04005100ff01011397 -:040052000011262350 -:0400530000812423e1 -:0400540000912223d2 -:040055000121202342 -:04005600000004138f -:04005700040004b7e6 -:040058000000293744 -:04005900710909130d -:04005a000004a78374 -:04005b000017b79340 -:04005c0040f007b3b6 -:04005d0000f4743304 -:04005e000084a22355 -:04005f000484a02352 -:04006000000905137b -:040061000e4000ef5e -:04006200001404136f -:04006300fddff06f5e -:040064000040006fe9 -:04006500000017b7c9 -:04006600b3c7879302 -:040067000550071326 -:04006800100006b7c7 -:040069000017879362 -:04006a0000e6a023e9 -:04006b000007c703c0 -:04006c00fe071ae38e -:04006d00001000730c -:04006e000000051376 -:04006f0000008067a6 -:0400700000c587330d -:0400710000e58c63b7 -:04007200100006b7bd -:04007300001585935c -:04007400fff5c7834a -:0400750000f6a023ce -:04007600feb71ae3d4 -:040077000006051367 -:04007800000080679d -:04007900000005136b +:040046001a8000ef2d +:040047000000151789 +:040048008485051393 +:040049000005086343 +:04004a000000051796 +:04004b007e85051396 +:04004c00035000ef6e +:04004d00500000ef70 +:04004e000001250385 +:04004f0000410593d4 +:040050000000061393 +:04005100008000ef3c +:040052004b80006f70 +:04005300ff01011395 +:04005400001126234e +:0400550000812423df +:0400560000912223d0 +:040057000121202340 +:04005800000004138d +:04005900040004b7e4 +:04005a000000293742 +:04005b00710909130b +:04005c000004a78372 +:04005d000017b7933e +:04005e0040f007b3b4 +:04005f0000f4743302 +:040060000084a22353 +:040061000484a02350 +:040062000009051379 +:040063000e4000ef5c +:04006400001404136d +:04006500fddff06f5c +:040066000040006fe7 +:04006700000017b7c7 +:04006800a187879352 +:040069000550071324 +:04006a00100006b7c5 +:04006b000017879360 +:04006c0000e6a023e7 +:04006d000007c703be +:04006e00fe071ae38c +:04006f00001000730a +:040070000000051374 +:0400710000008067a4 +:04007200000605136c +:0400730000c587330a +:0400740000e58c63b4 +:04007500100006b7ba +:040076000015859359 +:04007700fff5c78347 +:0400780000f6a023cb +:04007900feb71ae3d1 :04007a00000080679b -:04007b00ff0101136d -:04007c000011262326 -:04007d0047c000ef89 -:04007e0000200793c4 -:04007f0000f5202345 -:04008000fff0051375 -:0400810000c1208317 -:040082000101011364 -:040083000000806792 -:0400840000050793d9 -:0400850047c1a703c5 -:0400860000071663f6 -:040087004581871315 -:0400880046e1ae237c -:0400890047c1a503c3 -:04008a0000a787b391 -:04008b0046f1ae2369 -:04008c000000806789 -:04008d0000100073ec -:04008e00ff0101135a -:04008f000011262313 -:0400900000018613d2 -:0400910043418793cd -:0400920040c78633aa -:04009300000015b79d -:04009400b645859355 -:0400950000018513ce -:04009600554000efe2 -:0400970000c1208301 -:04009800010101134e -:04009900000080677c -:04009a00fff00793d9 -:04009b00fff5051355 -:04009c00fef51ee36c -:04009d000000806778 -:04009e00040007371c -:04009f00008727832c -:0400a00000a7e7b31b -:0400a10000f724231d -:0400a20000059e6354 -:0400a300040007b797 -:0400a40000c7a703e7 -:0400a500fff545130b -:0400a60000e57533c9 -:0400a70000a7a623e5 -:0400a800000080676d -:0400a9000400073711 -:0400aa0000c72783e1 -:0400ab0000a7e53392 -:0400ac0000a7262360 -:0400ad000000806768 -:0400ae0000f0031348 -:0400af00000507132e -:0400b00002c37e63a6 -:0400b10000f777934a -:0400b2000a07906346 -:0400b3000805926347 -:0400b400ff0676933a -:0400b50000f67613c8 -:0400b60000e686b327 -:0400b70000b720234b -:0400b80000b7222348 -:0400b90000b7242345 -:0400ba0000b7262342 -:0400bb00010707131f -:0400bc00fed766e322 -:0400bd0000061463c2 -:0400be000000806757 -:0400bf0040c306b381 -:0400c00000269693ed -:0400c10000000297a2 -:0400c200005686b3ab -:0400c30000c680678c -:0400c40000b7072357 -:0400c50000b706a3d7 -:0400c60000b7062356 -:0400c70000b705a3d6 -:0400c80000b7052355 -:0400c90000b704a3d5 -:0400ca0000b7042354 -:0400cb0000b703a3d4 -:0400cc0000b7032353 -:0400cd0000b702a3d3 -:0400ce0000b7022352 -:0400cf0000b701a3d2 -:0400d00000b7012351 -:0400d10000b700a3d1 -:0400d20000b7002350 -:0400d3000000806742 -:0400d4000ff5f5939c -:0400d5000085969379 -:0400d60000d5e5b3b9 -:0400d70001059693f6 +:04007b000000051369 +:04007c000000806799 +:04007d00ff0101136b +:04007e000011262324 +:04007f003fc000ef8f +:0400800000200793c2 +:0400810000f5202343 +:04008200fff0051373 +:0400830000c1208315 +:040084000101011362 +:040085000000806790 +:0400860000050793d7 +:040087004541a70345 +:0400880000071663f4 +:040089004501871393 +:04008a0044e1aa2380 +:04008b004541a50343 +:04008c0000a787b38f +:04008d0044f1aa236d +:04008e000000806787 +:04008f0000100073ea +:04009000ff01011358 +:040091000011262311 +:0400920000018613d0 +:0400930042c187934c +:0400940040c78633a8 +:04009500000015b79b +:04009600a4058593a5 +:0400970000018513cc +:04009800458000efb0 +:0400990000c12083ff +:04009a00010101134c +:04009b00000080677a +:04009c00fff00793d7 +:04009d00fff5051353 +:04009e00fef51ee36a +:04009f000000806776 +:0400a000040007371a +:0400a100008727832a +:0400a20000a7e7b319 +:0400a30000f724231b +:0400a40000059e6352 +:0400a500040007b795 +:0400a60000c7a703e5 +:0400a700fff5451309 +:0400a80000e57533c7 +:0400a90000a7a623e3 +:0400aa00000080676b +:0400ab00040007370f +:0400ac0000c72783df +:0400ad0000a7e53390 +:0400ae0000a726235e +:0400af000000806766 +:0400b00000f0031346 +:0400b100000507132c +:0400b20002c37e63a4 +:0400b30000f7779348 +:0400b4000a07906344 +:0400b5000805926345 +:0400b600ff06769338 +:0400b70000f67613c6 +:0400b80000e686b325 +:0400b90000b7202349 +:0400ba0000b7222346 +:0400bb0000b7242343 +:0400bc0000b7262340 +:0400bd00010707131d +:0400be00fed766e320 +:0400bf0000061463c0 +:0400c0000000806755 +:0400c10040c306b37f +:0400c20000269693eb +:0400c30000000297a0 +:0400c400005686b3a9 +:0400c50000c680678a +:0400c60000b7072355 +:0400c70000b706a3d5 +:0400c80000b7062354 +:0400c90000b705a3d4 +:0400ca0000b7052353 +:0400cb0000b704a3d3 +:0400cc0000b7042352 +:0400cd0000b703a3d2 +:0400ce0000b7032351 +:0400cf0000b702a3d1 +:0400d00000b7022350 +:0400d10000b701a3d0 +:0400d20000b701234f +:0400d30000b700a3cf +:0400d40000b700234e +:0400d5000000806740 +:0400d6000ff5f5939a +:0400d7000085969377 :0400d80000d5e5b3b7 -:0400d900f6dff06fef -:0400da0000279693d2 -:0400db000000029788 -:0400dc00005686b391 -:0400dd00000082930a -:0400de00fa0680e7b7 -:0400df000002809308 -:0400e000ff078793fc -:0400e10040f70733aa -:0400e20000f60633eb -:0400e300f6c378e305 -:0400e400f3dff06fe7 -:0400e50043418513fb -:0400e6004341879378 -:0400e70000a78a6381 -:0400e80000000317fa -:0400e900c603031334 -:0400ea0000030463a8 -:0400eb0000030067a7 -:0400ec000000806729 -:0400ed0043418513f3 -:0400ee004341859372 -:0400ef0040a585b3f0 -:0400f0004025d5933f -:0400f10001f5d793ab -:0400f20000b785b31b -:0400f3004015d5934c -:0400f40000058a6316 -:0400f50000000317ed -:0400f600c2c303136b -:0400f700000304639b -:0400f800000300679a -:0400f900000080671c -:0400fa004791c783e0 -:0400fb000407906303 -:0400fc00ff010113ec -:0400fd0000112623a5 -:0400fe00f9dff0ef47 -:0400ff00000007975f -:04010000c0478793da -:0401010000078a6306 -:0401020000000517dd -:040103007305051368 -:040104000000009760 -:04010500000000e70f -:0401060000c1208391 -:04010700001007934a -:0401080046f18ca38d -:0401090001010113dc -:04010a00000080670a -:04010b000000806709 -:04010c000000079751 -:04010d00bd07879310 -:04010e0002078663fb -:04010f00ff010113d8 -:04011000440185938e -:0401110000000517ce -:040112006f4505131d -:04011300001126238e -:040114000000009750 -:04011500000000e7ff -:0401160000c1208381 -:0401170001010113ce -:04011800f55ff06f30 -:04011900f51ff06f6f -:04011a00fb010113d1 -:04011b00001120238c -:04011c000041222359 -:04011d000051242346 -:04011e000061262333 -:04011f000071282320 -:0401200000a12a23ed -:0401210000b12c23da -:0401220000c12e23c7 -:0401230002d12023c2 -:0401240002e12223af -:0401250002f124239c -:040126000301262388 -:040127000311282375 -:0401280003c12a23c2 -:0401290003d12c23af -:04012a0003e12e239c -:04012b0005f1202397 -:04012c00341022f376 -:04012d000451202336 -:04012e00300022f388 -:04012f000451222332 -:040130007c4022f3fa -:04013100045124232e -:0401320034202573dd -:04013300000105932f -:04013400040122831d -:04013500341290737d -:0401360004412283db -:04013700300290738f -:040138000481228399 -:040139007c42907301 -:04013a00000120831d -:04013b00004122035a -:04013c000081228399 -:04013d0000c12303d7 -:04013e000101238315 -:04013f000141250352 -:040140000181258391 -:0401410001c12603cf -:04014200020126830d -:04014300024127034b -:04014400028127838a -:0401450002c12803c8 -:040146000301288306 -:0401470003412e033f -:0401480003812e837e -:0401490003c12f03bc -:04014a000501011397 -:04014b0030200073ed -:04014c00fb0101139f -:04014d00001120235a -:04014e000041222327 -:04014f000051242314 -:040150000061262301 -:0401510000712823ee -:0401520000a12a23bb -:0401530000b12c23a8 -:0401540000c12e2395 -:0401550002d1202390 -:0401560002e122237d -:0401570002f124236a -:040158000301262356 -:040159000311282343 -:04015a0003c12a2390 -:04015b0003d12c237d -:04015c0003e12e236a -:04015d0005f1202365 -:04015e0034202673b0 -:04015f003070277362 -:04016000002616134c -:0401610000c7073399 -:040162000007270368 -:04016300000700e7aa -:0401640000012083f3 -:040165000041220330 -:04016600008122836f -:0401670000c12303ad -:0401680001012383eb -:040169000141250328 -:04016a000181258367 -:04016b0001c12603a5 -:04016c0002012683e3 -:04016d000241270321 -:04016e000281278360 -:04016f0002c128039e -:0401700003012883dc -:0401710003412e0315 -:0401720003812e8354 -:0401730003c12f0392 -:04017400050101136d -:0401750030200073c3 -:04017600b29ff06fd5 +:0400d90001059693f4 +:0400da0000d5e5b3b5 +:0400db00f6dff06fed +:0400dc0000279693d0 +:0400dd000000029786 +:0400de00005686b38f +:0400df000000829308 +:0400e000fa0680e7b5 +:0400e1000002809306 +:0400e200ff078793fa +:0400e30040f70733a8 +:0400e40000f60633e9 +:0400e500f6c378e303 +:0400e600f3dff06fe5 +:0400e700ff01011301 +:0400e800008124234c +:0400e9004501841336 +:0400ea000004478344 +:0400eb0000112623b7 +:0400ec000207926312 +:0400ed000000079375 +:0400ee0000078a631a +:0400ef0000000517f1 +:0400f000658505130a +:0400f1000000009774 +:0400f200000000e723 +:0400f300001007935f +:0400f40000f40023f1 +:0400f50000c12083a3 +:0400f600008124035e +:0400f70001010113ef +:0400f800000080671d +:0400f9000000079369 +:0400fa0000078c630c +:0400fb004381859325 +:0400fc0000000517e4 +:0400fd006245051340 +:0400fe0000000317e4 +:0400ff000000006796 +:040100000000806714 +:04010100fb010113ea +:0401020000112023a5 +:040103000041222372 +:04010400005124235f +:04010500006126234c +:040106000071282339 +:0401070000a12a2306 +:0401080000b12c23f3 +:0401090000c12e23e0 +:04010a0002d12023db +:04010b0002e12223c8 +:04010c0002f12423b5 +:04010d0003012623a1 +:04010e00031128238e +:04010f0003c12a23db +:0401100003d12c23c8 +:0401110003e12e23b5 +:0401120005f12023b0 +:04011300341022f38f +:04011400045120234f +:04011500300022f3a1 +:04011600045122234b +:040117007c4022f313 +:040118000451242347 +:0401190034202573f6 +:04011a000001059348 +:04011b000401228336 +:04011c003412907396 +:04011d0004412283f4 +:04011e0030029073a8 +:04011f0004812283b2 +:040120007c4290731a +:040121000001208336 +:040122000041220373 +:0401230000812283b2 +:0401240000c12303f0 +:04012500010123832e +:04012600014125036b +:0401270001812583aa +:0401280001c12603e8 +:040129000201268326 +:04012a000241270364 +:04012b0002812783a3 +:04012c0002c12803e1 +:04012d00030128831f +:04012e0003412e0358 +:04012f0003812e8397 +:0401300003c12f03d5 +:0401310005010113b0 +:040132003020007306 +:04013300fb010113b8 +:040134000011202373 +:040135000041222340 +:04013600005124232d +:04013700006126231a +:040138000071282307 +:0401390000a12a23d4 +:04013a0000b12c23c1 +:04013b0000c12e23ae +:04013c0002d12023a9 +:04013d0002e1222396 +:04013e0002f1242383 +:04013f00030126236f +:04014000031128235c +:0401410003c12a23a9 +:0401420003d12c2396 +:0401430003e12e2383 +:0401440005f120237e +:0401450034202673c9 +:04014600307027737b +:040147000026161365 +:0401480000c70733b2 +:040149000007270381 +:04014a00000700e7c3 +:04014b00000120830c +:04014c000041220349 +:04014d000081228388 +:04014e0000c12303c6 +:04014f000101238304 +:040150000141250341 +:040151000181258380 +:0401520001c12603be +:0401530002012683fc +:04015400024127033a +:040155000281278379 +:0401560002c12803b7 +:0401570003012883f5 +:0401580003412e032e +:0401590003812e836d +:04015a0003c12f03ab +:04015b000501011386 +:04015c0030200073dc +:04015d00b8dff06fa8 +:04015e00000000009d +:04015f00000000009c +:04016000000000009b +:04016100000000009a +:040162000000000099 +:040163000000000098 +:040164000000000097 +:040165000000000096 +:040166000000000095 +:040167000000000094 +:040168000000000093 +:040169000000000092 +:04016a000000000091 +:04016b000000000090 +:04016c00000000008f +:04016d00000000008e +:04016e00000000008d +:04016f00000000008c +:04017000000000008b +:04017100000000008a +:040172000000000089 +:040173000000000088 +:040174000000000087 +:040175000000000086 +:040176000000000085 :040177000000000084 :040178000000000083 :040179000000000082 @@ -380,357 +380,357 @@ :04017b000000000080 :04017c00000000007f :04017d00000000007e -:04017e00000000007d -:04017f00000000007c -:04018000000000007b -:04018100000000007a -:040182000000000079 -:040183000000000078 -:040184000000000077 -:040185000000000076 -:040186000000000075 -:040187000000000074 -:040188000000000073 -:040189000000000072 -:04018a000000000071 -:04018b000000000070 -:04018c00000000006f -:04018d00000000006e -:04018e00000000006d -:04018f00000000006c -:04019000000000006b -:04019100000000006a -:040192000000000069 -:040193000000000068 -:040194000000000067 -:040195000000000066 -:040196000000000065 -:0401970000050593c7 -:0401980000000693ca -:040199000000061349 -:04019a000000051349 -:04019b0025c0006f0c -:04019c0042c1879342 -:04019d000007a503af -:04019e000000806776 -:04019f00ff01011348 -:0401a00000000593c3 -:0401a1000081242392 -:0401a20000112623ff -:0401a300000504133c -:0401a400340000ef34 -:0401a50000000797b8 -:0401a6004cc7879328 -:0401a7000007a503a5 -:0401a80003c52783e1 -:0401a9000007846364 -:0401aa00000780e7e3 -:0401ab000004051334 -:0401ac00b85ff0ef59 -:0401ad00ff0101133a -:0401ae000081242385 -:0401af0000000797ae -:0401b0009447879356 -:0401b100000004172f -:0401b20093c40413db -:0401b30040f40433dd -:0401b40000112623ed -:0401b5000091222370 -:0401b600402454137a -:0401b70002040263d9 -:0401b8000024149378 -:0401b900ffc4849368 -:0401ba0000f484b316 -:0401bb000004a78312 -:0401bc00fff4041335 -:0401bd00ffc4849364 -:0401be00000780e7cf -:0401bf00fe0418e33f -:0401c0000081240393 -:0401c10000c12083d6 -:0401c2000041248351 -:0401c3000101011322 -:0401c400a31ff06f16 -:0401c500ff01011322 -:0401c600008124236d -:0401c70001212023cf -:0401c8000000041718 -:0401c9008e04041389 -:0401ca000000091711 -:0401cb008d890913fe -:0401cc00408909332a -:0401cd0000112623d4 -:0401ce000091222357 -:0401cf004029591357 -:0401d00000090e63b1 -:0401d1000000049393 -:0401d200000427837b -:0401d30000148493fd -:0401d40000440413cc -:0401d500000780e7b8 -:0401d600fe9918e393 -:0401d7000000041709 -:0401d8008a4404133e -:0401d9000000091702 -:0401da0089c90913b3 -:0401db00408909331b -:0401dc00402959134a -:0401dd009cdff0efc4 -:0401de0000090e63a3 -:0401df000000049385 -:0401e000000427836d -:0401e10000148493ef -:0401e20000440413be -:0401e300000780e7aa -:0401e400fe9918e385 -:0401e50000c12083b2 -:0401e600008124036d -:0401e700004124832c -:0401e80000012903e6 -:0401e90001010113fc -:0401ea00000080672a -:0401eb0000a5c7b3f1 -:0401ec000037f7934e -:0401ed0000c508b38e -:0401ee00060792630b -:0401ef000030079342 -:0401f00004c7fe63df -:0401f10000357793cb -:0401f20000050713ea -:0401f3000607986300 -:0401f400ffc8f61337 -:0401f500fe06079368 -:0401f60008f76c6337 -:0401f70002c77c635c -:0401f80000058693e5 -:0401f9000007079361 -:0401fa000006a80350 -:0401fb00004787939f -:0401fc0000468693a0 -:0401fd00ff07ae2327 -:0401fe00fec7e8e36d -:0401ff00fff607936d -:0402000040e787b399 -:04020100ffc7f793a9 -:040202000047879397 -:0402030000f70733c6 -:0402040000f585b3c9 -:040205000117686312 -:04020600000080670d -:0402070000050713d4 -:04020800ff157ce37f -:040209000005c783a2 -:04020a0000170713bf -:04020b0000158593c2 -:04020c00fef70fa347 -:04020d00ff1768e38c -:04020e000000806705 -:04020f000005c6839d -:0402100000170713b9 -:0402110000377793a8 -:04021200fed70fa361 -:0402130000158593ba -:04021400f80780e384 -:040215000005c68397 -:0402160000170713b3 -:0402170000377793a2 -:04021800fed70fa35b -:0402190000158593b4 -:04021a00fc079ae360 -:04021b00f65ff06f2b -:04021c000005a683b0 -:04021d000045a28373 -:04021e000085af8325 -:04021f0000c5af0364 -:040220000105ae83a3 -:040221000145ae03e2 -:040222000185a303ac -:0402230001c5a80366 -:040224000245859377 -:0402250000d72023bb -:04022600ffc5a683e7 -:040227000057222337 -:0402280001f7242393 -:0402290001e72623a0 -:04022a0001d72823ad -:04022b0001c72a23ba -:04022c0000672c2318 -:04022d0001072e2374 -:04022e000247071369 -:04022f00fed72e23a5 -:04023000faf768e38e -:04023100f19ff06fda -:04023200fe010113b5 -:0402330000812c23f7 -:0402340043018413eb -:0402350000912a23e7 -:040236000005049328 -:040237000004250397 -:040238000121282355 -:040239000131262346 -:04023a000141242337 -:04023b0000112e235d -:04023c00000589131d -:04023d0000060a139a -:04023e00000689939a -:04023f00220000efaa -:04024000000007971c -:040241002607879372 -:040242000007a70307 -:040243001487278372 -:0402440008078663be -:040245000047a703c4 -:0402460001f00813a8 -:040247000004250387 -:0402480008e844631b -:04024900002718135f -:04024a0002049e63a9 -:04024b00001707137e -:04024c0000e7a22302 -:04024d00010787b36b -:04024e000127a423bd -:04024f001f8000ef1d -:040250000000051392 -:0402510001c1208344 -:0402520001812403ff -:0402530001412483be -:040254000101290378 -:0402550000c1298338 -:0402560000812a03f6 -:04025700020101138c +:04017e004281a50312 +:04017f000000806795 +:04018000ff01011367 +:0401810000000593e2 +:0401820000812423b1 +:04018300001126231e +:04018400000504135b +:040185001d8000efea +:040186000000051759 +:0401870042452503c5 +:0401880003c5278301 +:040189000007846384 +:04018a00000780e703 +:04018b000004051354 +:04018c00c0dff0eff1 +:04018d00ff0101135a +:04018e0000812423a5 +:04018f000121202307 +:040190000000041354 +:04019100000009134e +:040192004089093364 +:04019300001126230e +:040194000091222391 +:040195004029591391 +:0401960000090e63eb +:0401970000000493cd +:0401980000042783b5 +:040199000014849337 +:04019a000044041306 +:04019b00000780e7f2 +:04019c00fe9918e3cd +:04019d000000041347 +:04019e000000091341 +:04019f004089093357 +:0401a0004029591386 +:0401a10000090e63e0 +:0401a20000000493c2 +:0401a30000042783aa +:0401a400001484932c +:0401a50000440413fb +:0401a600000780e7e7 +:0401a700fe9918e3c2 +:0401a80000c12083ef +:0401a90000812403aa +:0401aa000041248369 +:0401ab000001290323 +:0401ac000101011339 +:0401ad000000806767 +:0401ae0000a5c7b32e +:0401af000037f7938b +:0401b00000c508b3cb +:0401b1000607926348 +:0401b200003007937f +:0401b30004c7fe631c +:0401b4000035779308 +:0401b5000005071327 +:0401b600060798633d +:0401b700ffc8f61374 +:0401b800fe060793a5 +:0401b90008f76c6374 +:0401ba0002c77c6399 +:0401bb000005869322 +:0401bc00000707939e +:0401bd000006a8038d +:0401be0000478793dc +:0401bf0000468693dd +:0401c000ff07ae2364 +:0401c100fec7e8e3aa +:0401c200fff60793aa +:0401c30040e787b3d7 +:0401c400ffc7f793e7 +:0401c50000478793d5 +:0401c60000f7073304 +:0401c70000f585b307 +:0401c8000117686350 +:0401c900000080674b +:0401ca000005071312 +:0401cb00ff157ce3bd +:0401cc000005c783e0 +:0401cd0000170713fd +:0401ce000015859300 +:0401cf00fef70fa385 +:0401d000ff1768e3ca +:0401d1000000806743 +:0401d2000005c683db +:0401d30000170713f7 +:0401d40000377793e6 +:0401d500fed70fa39f +:0401d60000158593f8 +:0401d700f80780e3c2 +:0401d8000005c683d5 +:0401d90000170713f1 +:0401da0000377793e0 +:0401db00fed70fa399 +:0401dc0000158593f2 +:0401dd00fc079ae39e +:0401de00f65ff06f69 +:0401df000045a683ae +:0401e0000005a283f1 +:0401e1000085af8363 +:0401e20000c5af03a2 +:0401e3000105ae83e1 +:0401e4000145ae0320 +:0401e5000185a303ea +:0401e60001c5a803a4 +:0401e70000d72223f8 +:0401e8000205a683e3 +:0401e9000057202378 +:0401ea0001f72423d2 +:0401eb0001e72623df +:0401ec0001d72823ec +:0401ed0001c72a23f9 +:0401ee0000672c2357 +:0401ef0001072e23b3 +:0401f00002d72023ef +:0401f10002470713a7 +:0401f20002458593aa +:0401f300faf768e3cc +:0401f400f19ff06f18 +:0401f500000007936c +:0401f6000007886313 +:0401f70000000517e8 +:0401f8001345051393 +:0401f9001800006f7b +:0401fa00000080671a +:0401fb00fd010113ee +:0401fc0001412c236e +:0401fd0000000a17dd +:0401fe00248a2a0322 +:0401ff000321202395 +:04020000148a290330 +:04020100021126239d +:04020200028124232e +:04020300029122231f +:0402040001312e2373 +:0402050001512a2356 +:040206000161282347 +:040207000171262338 +:040208000181242329 +:040209000409006381 +:04020a0000050b13cd +:04020b0000058b93cc +:04020c0000100a9341 +:04020d00fff0099362 +:04020e0000492483fc +:04020f00fff4841361 +:04021000020442633f +:04021100002494939e +:04021200009904b398 +:04021300040b8463f1 +:040214001044a78368 +:040215000577806386 +:04021600fff40413da +:04021700ffc4849309 +:04021800ff3416e3b6 +:0402190002c120837b +:04021a000281240336 +:04021b0002412483f5 +:04021c0002012903af +:04021d0001c129836f +:04021e0001812a032d +:04021f0001412a83ec +:0402200001012b03aa +:0402210000c12b836a +:0402220000812c0328 +:0402230003010113bf +:0402240000008067ef +:0402250000492783e2 +:040226000044a68367 +:04022700fff78793c3 +:0402280004878e6356 +:040229000004a22308 +:04022a00fa0688e365 +:04022b001889278384 +:04022c00008a97337a +:04022d0000492c0355 +:04022e0000f777b3ab +:04022f0002079263cd +:04023000000680e75d +:040231000049270356 +:04023200148a278380 +:0402330001871463c8 +:04023400f92784e33f +:04023500f80788e35b +:040236000007891321 +:04023700f5dff06f90 +:0402380018c9278337 +:040239000844a5834d +:04023a0000f777331f +:04023b0000071c6339 +:04023c00000b05139b +:04023d00000680e750 +:04023e00fcdff06f82 +:04023f0000892223ed +:04024000fa9ff06fc2 +:04024100000585131c +:04024200000680e74b +:04024300fb9ff06fbe +:04024400ff010113a2 +:0402450000812423ed +:04024600000007931a +:04024700000004139c +:04024800408787b3b1 +:0402490000912223db +:04024a000011262356 +:04024b004027d493e1 +:04024c0002048063c5 +:04024d00ffc78793cd +:04024e00008784336e +:04024f0000042783fd +:04025000fff48493a0 +:04025100ffc40413cf +:04025200000780e73a +:04025300fe0498e32a +:0402540000c1208342 +:0402550000812403fd +:0402560000412483bc +:04025700010101138d :0402580000008067bb -:04025900010785b361 -:04025a000945a4238b -:04025b001887a683d7 -:04025c000010061375 -:04025d0000e616336e -:04025e0000c6e6b33d -:04025f0018d7a423e5 -:040260001135a4238d -:0402610000200693e0 -:04026200fad492e355 -:0402630018c7a6838f -:0402640000c6e633b7 -:0402650018c7a623ed -:04026600f95ff06fdd -:0402670014c707931e -:0402680014f7242340 -:04026900f71ff06f1c -:04026a0018c000efc9 -:04026b00fff0051388 -:04026c00f95ff06fd7 -:04026d00fffff79701 -:04026e0064c7879347 -:04026f000007886399 -:04027000000005176e -:04027100cf4505135d -:04027200c95ff06f01 -:0402730000008067a0 -:04027400fd01011374 -:0402750001612823d8 -:0402760043018b13a2 -:0402770001512a23e4 -:0402780000050a93e0 -:04027900000b25034e -:04027a0001312e23fd -:04027b0001412c23ee -:04027c0001712623c3 -:04027d0001912223a6 -:04027e000211262320 -:04027f0002812423b1 -:0402800002912223a2 -:040281000321202312 -:0402820001812423af -:0402830000058b9354 -:0402840010c000efb7 -:0402850000000797d7 -:0402860014c787937f -:040287000007ac833d -:0402880000100a1345 -:04028900fff00993e6 -:04028a00148ca90324 -:04028b0002090863f9 -:04028c00004924837e -:04028d00fff48413e3 -:04028e0002044263c1 -:04028f000024949320 -:04029000009904b31a -:04029100040b88636f -:040292001044a783ea -:040293000577846304 -:04029400fff404135c -:04029500ffc484938b -:04029600ff3416e338 -:0402970002812403b9 -:04029800000b25032f -:0402990002c12083fb -:04029a000241248376 -:04029b000201290330 -:04029c0001c12983f0 -:04029d0001812a03ae -:04029e0001412a836d -:04029f0001012b032b -:0402a00000c12b83eb -:0402a10000812c03a9 -:0402a20000412c8368 -:0402a300030101133f -:0402a4000a40006f9d -:0402a5000049278362 -:0402a6000044a683e7 -:0402a700fff7879343 -:0402a80004878a63da -:0402a9000004a22388 -:0402aa00fa0684e3e9 -:0402ab001889278304 -:0402ac00008a17337a -:0402ad0000492c03d5 -:0402ae0000f777b32b -:0402af0000079e6343 -:0402b000000680e7dd -:0402b1000049278356 -:0402b200f78790e357 -:0402b300148ca7837d -:0402b400f92780e3c3 -:0402b500f55ff06f92 -:0402b60018c92783b9 -:0402b7000844a583cf -:0402b80000f77733a1 -:0402b90000071c63bb -:0402ba00000a85139e -:0402bb00000680e7d2 -:0402bc00fd5ff06f83 -:0402bd00008922236f -:0402be00fb1ff06fc3 -:0402bf00000585139e -:0402c000000680e7cd -:0402c100fc1ff06fbf -:0402c2000000806751 -:0402c3000000806750 -:0402c400000080674f -:0402c500000080674e -:0402c600000080674d -:0402c700000080674c -:0402c800001005130a -:0402c900000080674a -:0402ca000010051308 -:0402cb000000806748 -:0402cc000000806747 -:0402cd000000806746 +:040259000005059304 +:04025a000000069307 +:04025b000000061386 +:04025c000000051386 +:04025d000040006fee +:04025e00000007177e +:04025f000c4727031e +:040260001487278355 +:0402610004078c639f +:040262000047a703a7 +:0402630001f008138b +:0402640006e84e63f7 +:040265000027181343 +:040266000205066324 +:0402670001078333d5 +:0402680008c3242380 +:040269001887a883c7 +:04026a000010061367 +:04026b0000e6163360 +:04026c0000c8e8b32b +:04026d001917a42396 +:04026e0010d3242362 +:04026f0000200693d2 +:0402700002d504634c +:040271000017071358 +:0402720000e7a223dc +:04027300010787b345 +:0402740000b7a42308 +:04027500000005136d +:04027600000080679d +:0402770014c707930e +:0402780014f7242330 +:04027900fa5ff06fc9 +:04027a0018c7a68378 +:04027b00001707134e +:04027c0000e7a223d2 +:04027d0000c6e6339e +:04027e0018c7a623d4 +:04027f00010787b339 +:0402800000b7a423fc +:040281000000051361 +:040282000000806791 +:04028300fff0051370 +:04028400000080678f +:040285000000000075 +:040286006d696e55db +:040287006d656c70c5 +:0402880065746e65c6 +:040289007973206401 +:04028a006d657473b7 +:04028b006c6163201f +:04028c006163206c1e +:04028d0064656c6ccc +:04028e0000000a2141 +:04028f000200000069 +:04029000000000006a +:04029100020002ec79 +:04029200020003540f +:04029300020003bca6 +:040294000000000066 +:040295000000000065 +:040296000000000064 +:040297000000000063 +:040298000000000062 +:040299000000000061 +:04029a000000000060 +:04029b00000000005f +:04029c00000000005e +:04029d00000000005d +:04029e00000000005c +:04029f00000000005b +:0402a000000000005a +:0402a1000000000059 +:0402a2000000000058 +:0402a3000000000057 +:0402a4000000000056 +:0402a5000000000055 +:0402a6000000000054 +:0402a7000000000053 +:0402a8000000000052 +:0402a9000000000051 +:0402aa000000000050 +:0402ab00000000004f +:0402ac00000000004e +:0402ad00000000004d +:0402ae00000000004c +:0402af00000000004b +:0402b000000000004a +:0402b1000000000049 +:0402b2000000000048 +:0402b3000000000047 +:0402b4000000000046 +:0402b5000000000045 +:0402b6000000000044 +:0402b7000000000043 +:0402b8000000000042 +:0402b9000000000041 +:0402ba00000000013f +:0402bb00000000003f +:0402bc00abcd330e85 +:0402bd00e66d1234a4 +:0402be000005deec6d +:0402bf000000000b30 +:0402c000000000003a +:0402c1000000000039 +:0402c2000000000038 +:0402c3000000000037 +:0402c4000000000036 +:0402c5000000000035 +:0402c6000000000034 +:0402c7000000000033 +:0402c8000000000032 +:0402c9000000000031 +:0402ca000000000030 +:0402cb00000000002f +:0402cc00000000002e +:0402cd00000000002d :0402ce00000000002c -:0402cf006d696e5592 -:0402d0006d656c707c -:0402d10065746e657d -:0402d20079732064b8 -:0402d3006d6574736e -:0402d4006c616320d6 -:0402d5006163206cd5 -:0402d60064656c6c83 -:0402d70000000a21f8 -:0402d8000200000020 +:0402cf00000000002b +:0402d000000000002a +:0402d1000000000029 +:0402d2000000000028 +:0402d3000000000027 +:0402d4000000000026 +:0402d5000000000025 +:0402d6000000000024 +:0402d7000000000023 +:0402d8000000000022 :0402d9000000000021 -:0402da00020002ec30 -:0402db0002000354c6 -:0402dc00020003bc5d +:0402da000000000020 +:0402db00000000001f +:0402dc00000000001e :0402dd00000000001d :0402de00000000001c :0402df00000000001b @@ -769,12 +769,12 @@ :0403000000000000f9 :0403010000000000f8 :0403020000000000f7 -:0403030000000001f5 +:0403030000000000f6 :0403040000000000f5 -:04030500abcd330e3b -:04030600e66d12345a -:040307000005deec23 -:040308000000000be6 +:0403050000000000f4 +:0403060000000000f3 +:0403070000000000f2 +:0403080000000000f1 :0403090000000000f0 :04030a0000000000ef :04030b0000000000ee @@ -920,83 +920,8 @@ :040397000000000062 :040398000000000061 :040399000000000060 -:04039a00000000005f -:04039b00000000005e -:04039c00000000005d -:04039d00000000005c -:04039e00000000005b -:04039f00000000005a -:0403a0000000000059 -:0403a1000000000058 -:0403a2000000000057 -:0403a3000000000056 -:0403a4000000000055 -:0403a5000000000054 -:0403a6000000000053 -:0403a7000000000052 -:0403a8000000000051 -:0403a9000000000050 -:0403aa00000000004f -:0403ab00000000004e -:0403ac00000000004d -:0403ad00000000004c -:0403ae00000000004b -:0403af00000000004a -:0403b0000000000049 -:0403b1000000000048 -:0403b2000000000047 -:0403b3000000000046 -:0403b4000000000045 -:0403b5000000000044 -:0403b6000000000043 -:0403b7000000000042 -:0403b8000000000041 -:0403b9000000000040 -:0403ba00000000003f -:0403bb00000000003e -:0403bc00000000003d -:0403bd00000000003c -:0403be00000000003b -:0403bf00000000003a -:0403c0000000000039 -:0403c1000000000038 -:0403c2000000000037 -:0403c3000000000036 -:0403c4000000000035 -:0403c5000000000034 -:0403c6000000000033 -:0403c7000000000032 -:0403c8000000000031 -:0403c9000000000030 -:0403ca00000000002f -:0403cb00000000002e -:0403cc00000000002d -:0403cd00000000002c -:0403ce00000000002b -:0403cf00000000002a -:0403d0000000000029 -:0403d1000000000028 -:0403d2000000000027 -:0403d3000000000026 -:0403d4000000000025 -:0403d5000000000024 -:0403d6000000000023 -:0403d7000000000022 -:0403d8000000000021 -:0403d9000000000020 -:0403da00000000001f -:0403db00000000001e -:0403dc00000000001d -:0403dd00000000001c -:0403de00000000001b -:0403df00000000001a -:0403e0000000000019 -:0403e1000000000018 -:0403e2000000000017 -:0403e3000000000016 -:0403e4000200000013 -:0403e50002000458b6 -:0403e600000003e828 -:0403e70000000430de -:0403e800000009b454 +:04039a00020000005d +:04039b000000039cbf +:04039c00000003e476 +:04039d00000007d481 :00000001FF diff --git a/testbench.do b/testbench.do index 60ba1e85..76230008 100644 --- a/testbench.do +++ b/testbench.do @@ -40,7 +40,7 @@ vcom ./core/txt_util.vhdl vcom ./core/trace_debug.vhd vcom testbench.vhd -vsim -voptargs="+acc" -t ns work.coretestbench +vsim -t ns work.coretestbench view wave add wave -radix binary /clk diff --git a/testbench.vhd b/testbench.vhd index 506f0bff..a805de8c 100644 --- a/testbench.vhd +++ b/testbench.vhd @@ -6,6 +6,7 @@ -- ------------------------------------------------------- + library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; @@ -13,183 +14,184 @@ use ieee.numeric_std.all; use work.decoder_types.all; entity coretestbench is - generic( - --! Num of 32-bits memory words - IMEMORY_WORDS : integer := 1024; --!= 4K (1024 * 4) bytes - DMEMORY_WORDS : integer := 1024 --!= 2k (512 * 2) bytes - ); - - port( - ----------- SEG7 ------------ - HEX0 : out std_logic_vector(7 downto 0); - HEX1 : out std_logic_vector(7 downto 0); - HEX2 : out std_logic_vector(7 downto 0); - HEX3 : out std_logic_vector(7 downto 0); - HEX4 : out std_logic_vector(7 downto 0); - HEX5 : out std_logic_vector(7 downto 0); - ----------- SW ------------ + generic( + --! Num of 32-bits memory words + IMEMORY_WORDS : integer := 1024; --!= 4K (1024 * 4) bytes + DMEMORY_WORDS : integer := 1024 --!= 2k (512 * 2) bytes + ); + + port( + ----------- SEG7 ------------ + HEX0 : out std_logic_vector(7 downto 0); + HEX1 : out std_logic_vector(7 downto 0); + HEX2 : out std_logic_vector(7 downto 0); + HEX3 : out std_logic_vector(7 downto 0); + HEX4 : out std_logic_vector(7 downto 0); + HEX5 : out std_logic_vector(7 downto 0); + ----------- SW ------------ + + SW: in std_logic_vector(9 downto 0); + LEDR: out std_logic_vector(9 downto 0); + + ---------- ARDUINO IO ----- + ARDUINO_IO: inout std_logic_vector(15 downto 0) + ); - SW : in std_logic_vector(9 downto 0); - LEDR : out std_logic_vector(9 downto 0); - ---------- ARDUINO IO ----- - ARDUINO_IO : inout std_logic_vector(15 downto 0) - ); end entity coretestbench; architecture RTL of coretestbench is -- Clocks and reset - signal clk : std_logic; - signal clk_32x : std_logic; - signal rst : std_logic; - - -- Instruction bus and instruction memory - signal address : std_logic_vector(9 downto 0); - signal iaddress : unsigned(15 downto 0); - signal idata : std_logic_vector(31 downto 0); - + signal clk : std_logic; + signal clk_32x : std_logic; + signal rst : std_logic; + + -- Instruction bus and instruction memory + signal address : std_logic_vector(9 downto 0); + signal iaddress : unsigned(15 downto 0); + signal idata : std_logic_vector(31 downto 0); + -- Data bus - signal daddress : unsigned(31 downto 0); - signal ddata_r : std_logic_vector(31 downto 0); - signal ddata_w : std_logic_vector(31 downto 0); - signal dmask : std_logic_vector(3 downto 0); - signal dcsel : std_logic_vector(1 downto 0); - signal d_we : std_logic := '0'; - signal ddata_r_mem : std_logic_vector(31 downto 0); - signal d_rd : std_logic; - signal d_sig : std_logic; - - -- Modelsim debug signals - signal cpu_state : cpu_state_t; - signal debugString : string(1 to 40) := (others => '0'); - - -- I/O signals - signal interrupts : std_logic_vector(31 downto 0); - signal ddata_r_gpio : std_logic_vector(31 downto 0); - signal gpio_input : std_logic_vector(31 downto 0); - signal gpio_output : std_logic_vector(31 downto 0); - - signal ddata_r_timer : std_logic_vector(31 downto 0); - signal timer_interrupt : std_logic_vector(5 downto 0); - signal ddata_r_periph : std_logic_vector(31 downto 0); - signal ddata_r_sdram : std_logic_vector(31 downto 0); - - signal gpio_interrupts : std_logic_vector(6 downto 0); - signal ddata_r_segments : std_logic_vector(31 downto 0); - signal ddata_r_uart : std_logic_vector(31 downto 0); - signal ddata_r_adc : std_logic_vector(31 downto 0); - signal ddata_r_i2c : std_logic_vector(31 downto 0); - signal ddata_r_dif_fil : std_logic_vector(31 downto 0); - signal ddata_r_stepmot : std_logic_vector(31 downto 0); - + signal daddress : unsigned(31 downto 0); + signal ddata_r : std_logic_vector(31 downto 0); + signal ddata_w : std_logic_vector(31 downto 0); + signal dmask : std_logic_vector(3 downto 0); + signal dcsel : std_logic_vector(1 downto 0); + signal d_we : std_logic := '0'; + signal ddata_r_mem : std_logic_vector(31 downto 0); + signal d_rd : std_logic; + signal d_sig : std_logic; + + -- Modelsim debug signals + signal cpu_state : cpu_state_t; + signal debugString : string(1 to 40) := (others => '0'); + + -- I/O signals + signal interrupts : std_logic_vector(31 downto 0); + signal ddata_r_gpio : std_logic_vector(31 downto 0); + signal gpio_input : std_logic_vector(31 downto 0); + signal gpio_output : std_logic_vector(31 downto 0); + + signal ddata_r_timer : std_logic_vector(31 downto 0); + signal timer_interrupt : std_logic_vector(5 downto 0); + signal ddata_r_periph : std_logic_vector(31 downto 0); + signal ddata_r_sdram : std_logic_vector(31 downto 0); + + signal gpio_interrupts : std_logic_vector(6 downto 0); + signal ddata_r_segments : std_logic_vector(31 downto 0); + signal ddata_r_uart : std_logic_vector(31 downto 0); + signal ddata_r_adc : std_logic_vector(31 downto 0); + signal ddata_r_i2c : std_logic_vector(31 downto 0); + signal ddata_r_dif_fil : std_logic_vector(31 downto 0); + begin - clock_driver : process - constant period : time := 1000 ns; - begin - clk <= '0'; - wait for period / 2; - clk <= '1'; - wait for period / 2; - end process clock_driver; - - --! Division unit clock - clock_driver_32x : process - constant period : time := 20 ns; - begin - clk_32x <= '0'; - wait for period / 2; - clk_32x <= '1'; - wait for period / 2; - end process clock_driver_32x; - - reset : process is - begin - rst <= '1'; - wait for 150 ns; - rst <= '0'; - wait; - end process reset; - - -- Connect gpio data to output hardware - LEDR <= gpio_output(9 downto 0); + clock_driver : process + constant period : time := 1000 ns; + begin + clk <= '0'; + wait for period / 2; + clk <= '1'; + wait for period / 2; + end process clock_driver; + + --! Division unit clock + clock_driver_32x : process + constant period : time := 20 ns; + begin + clk_32x <= '0'; + wait for period / 2; + clk_32x <= '1'; + wait for period / 2; + end process clock_driver_32x; + + reset : process is + begin + rst <= '1'; + wait for 150 ns; + rst <= '0'; + wait; + end process reset; + + -- Connect gpio data to output hardware + LEDR <= gpio_output(9 downto 0); -- Connect input hardware to gpio data - gpio_test : process + gpio_test: process begin gpio_input <= (others => '0'); wait for 500 us; - + -- Generate a input pulse (External IRQ 0 or pooling) gpio_input(0) <= '1'; wait for 1 us; gpio_input(0) <= '0'; - + -- Generate a input pulse (External IRQ 1 or pooling) wait for 200 us; gpio_input(1) <= '1'; wait for 1 us; gpio_input(1) <= '0'; - + wait; - end process; + end process; - -- IMem shoud be read from instruction and data buses + -- IMem shoud be read from instruction and data buses -- Not enough RAM ports for instruction bus, data bus and in-circuit programming - instr_mux : entity work.instructionbusmux + instr_mux: entity work.instructionbusmux port map( d_rd => d_rd, dcsel => dcsel, daddress => daddress, iaddress => iaddress, address => address - ); - - -- 32-bits x 1024 words quartus RAM (dual port: portA -> riscV, portB -> In-System Mem Editor - iram_quartus_inst : entity work.iram_quartus - port map( - address => address(9 downto 0), - byteena => "1111", - clock => clk, - data => (others => '0'), - wren => '0', - q => idata - ); - - -- dmemory_address <= daddress; - -- Data Memory RAM - dmem : entity work.dmemory - generic map( - MEMORY_WORDS => DMEMORY_WORDS - ) - port map( - rst => rst, - clk => clk, - data => ddata_w, - address => daddress, - we => d_we, - signal_ext => d_sig, - csel => dcsel(0), - dmask => dmask, - q => ddata_r_mem - ); - - -- Adress space mux ((check sections.ld) -> Data chip select: - -- 0x00000 -> Instruction memory - -- 0x20000 -> Data memory - -- 0x40000 -> Input/Output generic address space - -- 0x60000 -> SDRAM address space - data_bus_mux : entity work.databusmux - port map( - dcsel => dcsel, - idata => idata, - ddata_r_mem => ddata_r_mem, - ddata_r_periph => ddata_r_periph, - ddata_r_sdram => ddata_r_sdram, - ddata_r => ddata_r - ); + ); - io_data_bus_mux : entity work.iodatabusmux + -- 32-bits x 1024 words quartus RAM (dual port: portA -> riscV, portB -> In-System Mem Editor + iram_quartus_inst : entity work.iram_quartus + port map( + address => address(9 downto 0), + byteena => "1111", + clock => clk, + data => (others => '0'), + wren => '0', + q => idata + ); + + -- dmemory_address <= daddress; + -- Data Memory RAM + dmem : entity work.dmemory + generic map( + MEMORY_WORDS => DMEMORY_WORDS + ) + port map( + rst => rst, + clk => clk, + data => ddata_w, + address => daddress, + we => d_we, + signal_ext => d_sig, + csel => dcsel(0), + dmask => dmask, + q => ddata_r_mem + ); + + -- Adress space mux ((check sections.ld) -> Data chip select: + -- 0x00000 -> Instruction memory + -- 0x20000 -> Data memory + -- 0x40000 -> Input/Output generic address space + -- 0x60000 -> SDRAM address space + data_bus_mux: entity work.databusmux + port map( + dcsel => dcsel, + idata => idata, + ddata_r_mem => ddata_r_mem, + ddata_r_periph => ddata_r_periph, + ddata_r_sdram => ddata_r_sdram, + ddata_r => ddata_r + ); + + io_data_bus_mux: entity work.iodatabusmux port map( daddress => daddress, ddata_r_gpio => ddata_r_gpio, @@ -199,75 +201,75 @@ begin ddata_r_i2c => ddata_r_i2c, ddata_r_timer => ddata_r_timer, ddata_r_dif_fil => ddata_r_dif_fil, - ddata_r_periph => ddata_r_periph, - ddata_r_stepmot => ddata_r_stepmot - ); - - -- Softcore instatiation - myRiscv : entity work.core - port map( - clk => clk, - rst => rst, - clk_32x => clk_32x, - iaddress => iaddress, - idata => idata, - daddress => daddress, - ddata_r => ddata_r, - ddata_w => ddata_w, - d_we => d_we, - d_rd => d_rd, - d_sig => d_sig, - dcsel => dcsel, - dmask => dmask, - interrupts => interrupts, - state => cpu_state + ddata_r_periph => ddata_r_periph ); + -- Softcore instatiation + myRiscv : entity work.core + port map( + clk => clk, + rst => rst, + clk_32x => clk_32x, + iaddress => iaddress, + idata => idata, + daddress => daddress, + ddata_r => ddata_r, + ddata_w => ddata_w, + d_we => d_we, + d_rd => d_rd, + d_sig => d_sig, + dcsel => dcsel, + dmask => dmask, + interrupts=>interrupts, + state => cpu_state + ); + -- Group IRQ signals. - irq_signals : process(timer_interrupt, gpio_interrupts) - begin - interrupts <= (others => '0'); - interrupts(24 downto 18) <= gpio_interrupts(6 downto 0); - interrupts(30 downto 25) <= timer_interrupt; + irq_signals: process(timer_interrupt,gpio_interrupts) + begin + interrupts <= (others => '0'); + interrupts(24 downto 18) <= gpio_interrupts(6 downto 0); + interrupts(30 downto 25) <= timer_interrupt; end process; - -- Timer instantiation - timer : entity work.Timer - generic map( - prescaler_size => 16, - compare_size => 32 - ) - port map( - clock => clk, - reset => rst, - daddress => daddress, - ddata_w => ddata_w, - ddata_r => ddata_r_timer, - d_we => d_we, - d_rd => d_rd, - dcsel => dcsel, - dmask => dmask, - timer_interrupt => timer_interrupt - ); - - -- Generic GPIO module instantiation - generic_gpio : entity work.gpio - port map( - clk => clk, - rst => rst, - daddress => daddress, - ddata_w => ddata_w, - ddata_r => ddata_r_gpio, - d_we => d_we, - d_rd => d_rd, - dcsel => dcsel, - dmask => dmask, - input => gpio_input, - output => gpio_output, - gpio_interrupts => gpio_interrupts - ); + + -- Timer instantiation + timer : entity work.Timer + generic map( + prescaler_size => 16, + compare_size => 32 + ) + port map( + clock => clk, + reset => rst, + daddress => daddress, + ddata_w => ddata_w, + ddata_r => ddata_r_timer, + d_we => d_we, + d_rd => d_rd, + dcsel => dcsel, + dmask => dmask, + timer_interrupt => timer_interrupt + ); + + -- Generic GPIO module instantiation + generic_gpio: entity work.gpio + port map( + clk => clk, + rst => rst, + daddress => daddress, + ddata_w => ddata_w, + ddata_r => ddata_r_gpio, + d_we => d_we, + d_rd => d_rd, + dcsel => dcsel, + dmask => dmask, + input => gpio_input, + output => gpio_output, + gpio_interrupts => gpio_interrupts + ); - generic_displays : entity work.led_displays + generic_displays : entity work.led_displays port map( clk => clk, rst => rst, @@ -288,15 +290,15 @@ begin hex7 => open ); - -- FileOutput DEBUG - debug : entity work.trace_debug - generic map( - MEMORY_WORDS => IMEMORY_WORDS - ) - port map( - pc => iaddress, - data => idata, - inst => debugString - ); + -- FileOutput DEBUG + debug : entity work.trace_debug + generic map( + MEMORY_WORDS => IMEMORY_WORDS + ) + port map( + pc => iaddress, + data => idata, + inst => debugString + ); end architecture RTL;