Forum: FPGA, VHDL & Co. EMBEDDED SYSTEM


von Peter M. (whitsha)


Lesenswert?

Hallo zusammen,

ich beschäftige mich schon seit langem mit der FSL Verbindung und komme 
nicht weiter.

1) zuerst habe ich eine FSL-Verbindung aufgebaut und direkt vom

EDK ins FPGA geladen. Das hat soweit geklappt.

2) jetzt habe ich das ganze als submodul in ISE eingebunden. In ISE

schicke ich ein Testsignal und binde diesen an FSL_S_Data ein.

3) In meiner C Applikation lese ich die Daten aus. Da bekomme ich als

Ergebniss 0.




Habe schon verschiedene Konfigurationen versucht: FSL Bus verschieden 
konfiguriert, in vhdl datei rumprobiert und auch im C programm.

Ich vermute, der Fehler liegt in der Konfiguration des FSL Buses, aber 
ich weiss nicht was ich noch alles umstellen muss.

Brauche da unbedingt Hilfe,... es ist dringend.

Hier noch meine top.vhd datei:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity top is
PORT(

    fpga_0_RS232_Uart_1_RX_pin : IN std_logic;
    fpga_0_DDR2_SDRAM_DDR2_DQS_Div_I_pin : IN std_logic;
    sys_clk_pin : IN std_logic;
    sys_rst_pin : IN std_logic;
    fpga_0_DDR2_SDRAM_DDR2_DQS : INOUT std_logic_vector(3 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_DQS_n : INOUT std_logic_vector(3 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_DQ : INOUT std_logic_vector(31 downto 0);
    fpga_0_FLASH_Mem_DQ_pin : INOUT std_logic_vector(0 to 7);
    fpga_0_RS232_Uart_1_TX_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_ODT_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_Addr_pin : OUT std_logic_vector(12 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_BankAddr_pin : OUT std_logic_vector(1 downto 
0);
    fpga_0_DDR2_SDRAM_DDR2_CAS_n_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_CE_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_CS_n_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_RAS_n_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_WE_n_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_Clk_pin : OUT std_logic_vector(1 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_Clk_n_pin : OUT std_logic_vector(1 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_DM_pin : OUT std_logic_vector(3 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_DQS_Div_O_pin : OUT std_logic;
    fpga_0_FLASH_Mem_A_pin : OUT std_logic_vector(8 to 31);
    fpga_0_FLASH_Mem_WEN_pin : OUT std_logic;
    fpga_0_FLASH_Mem_RPN_pin : OUT std_logic;
    fpga_0_FLASH_Mem_OEN_pin : OUT std_logic;
    fpga_0_FLASH_Mem_CEN_pin : OUT std_logic;
    fpga_core_0_FSL_S_Data_pin : IN std_logic_vector(0 to 31));

end top;

architecture Behavioral of top is

COMPONENT system
  PORT(
    fpga_0_RS232_Uart_1_RX_pin : IN std_logic;
    fpga_0_DDR2_SDRAM_DDR2_DQS_Div_I_pin : IN std_logic;
    sys_clk_pin : IN std_logic;
    sys_rst_pin : IN std_logic;
    fpga_0_DDR2_SDRAM_DDR2_DQS : INOUT std_logic_vector(3 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_DQS_n : INOUT std_logic_vector(3 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_DQ : INOUT std_logic_vector(31 downto 0);
    fpga_0_FLASH_Mem_DQ_pin : INOUT std_logic_vector(0 to 7);
    fpga_0_RS232_Uart_1_TX_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_ODT_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_Addr_pin : OUT std_logic_vector(12 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_BankAddr_pin : OUT std_logic_vector(1 downto 
0);
    fpga_0_DDR2_SDRAM_DDR2_CAS_n_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_CE_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_CS_n_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_RAS_n_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_WE_n_pin : OUT std_logic;
    fpga_0_DDR2_SDRAM_DDR2_Clk_pin : OUT std_logic_vector(1 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_Clk_n_pin : OUT std_logic_vector(1 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_DM_pin : OUT std_logic_vector(3 downto 0);
    fpga_0_DDR2_SDRAM_DDR2_DQS_Div_O_pin : OUT std_logic;
    fpga_0_FLASH_Mem_A_pin : OUT std_logic_vector(8 to 31);
    fpga_0_FLASH_Mem_WEN_pin : OUT std_logic;
    fpga_0_FLASH_Mem_RPN_pin : OUT std_logic;
    fpga_0_FLASH_Mem_OEN_pin : OUT std_logic;
    fpga_0_FLASH_Mem_CEN_pin : OUT std_logic;
    fpga_core_0_FSL_S_Data_pin : IN std_logic_vector(0 to 31)
    );
  END COMPONENT;

signal test :   std_logic_vector(0 to 31) := 
"00001111111111111111111111111111" ;



begin

IInst_system: system PORT MAP(
    fpga_0_RS232_Uart_1_RX_pin =>  fpga_0_RS232_Uart_1_RX_pin,
    fpga_0_RS232_Uart_1_TX_pin =>  fpga_0_RS232_Uart_1_TX_pin,
    fpga_0_DDR2_SDRAM_DDR2_ODT_pin =>  fpga_0_DDR2_SDRAM_DDR2_ODT_pin,
    fpga_0_DDR2_SDRAM_DDR2_Addr_pin =>  fpga_0_DDR2_SDRAM_DDR2_Addr_pin,
    fpga_0_DDR2_SDRAM_DDR2_BankAddr_pin => 
fpga_0_DDR2_SDRAM_DDR2_BankAddr_pin,
    fpga_0_DDR2_SDRAM_DDR2_CAS_n_pin => 
fpga_0_DDR2_SDRAM_DDR2_CAS_n_pin,
    fpga_0_DDR2_SDRAM_DDR2_CE_pin =>  fpga_0_DDR2_SDRAM_DDR2_CE_pin,
    fpga_0_DDR2_SDRAM_DDR2_CS_n_pin =>  fpga_0_DDR2_SDRAM_DDR2_CS_n_pin,
    fpga_0_DDR2_SDRAM_DDR2_RAS_n_pin => 
fpga_0_DDR2_SDRAM_DDR2_RAS_n_pin,
    fpga_0_DDR2_SDRAM_DDR2_WE_n_pin =>  fpga_0_DDR2_SDRAM_DDR2_WE_n_pin,
    fpga_0_DDR2_SDRAM_DDR2_Clk_pin =>  fpga_0_DDR2_SDRAM_DDR2_Clk_pin,
    fpga_0_DDR2_SDRAM_DDR2_Clk_n_pin => 
fpga_0_DDR2_SDRAM_DDR2_Clk_n_pin,
    fpga_0_DDR2_SDRAM_DDR2_DM_pin =>  fpga_0_DDR2_SDRAM_DDR2_DM_pin,
    fpga_0_DDR2_SDRAM_DDR2_DQS =>  fpga_0_DDR2_SDRAM_DDR2_DQS,
    fpga_0_DDR2_SDRAM_DDR2_DQS_n => fpga_0_DDR2_SDRAM_DDR2_DQS_n,
    fpga_0_DDR2_SDRAM_DDR2_DQ => fpga_0_DDR2_SDRAM_DDR2_DQ ,
    fpga_0_DDR2_SDRAM_DDR2_DQS_Div_I_pin => 
fpga_0_DDR2_SDRAM_DDR2_DQS_Div_I_pin,
    fpga_0_DDR2_SDRAM_DDR2_DQS_Div_O_pin => 
fpga_0_DDR2_SDRAM_DDR2_DQS_Div_O_pin,
    fpga_0_FLASH_Mem_A_pin => fpga_0_FLASH_Mem_A_pin,
    fpga_0_FLASH_Mem_DQ_pin => fpga_0_FLASH_Mem_DQ_pin,
    fpga_0_FLASH_Mem_WEN_pin => fpga_0_FLASH_Mem_WEN_pin,
    fpga_0_FLASH_Mem_RPN_pin => fpga_0_FLASH_Mem_RPN_pin,
    fpga_0_FLASH_Mem_OEN_pin => fpga_0_FLASH_Mem_OEN_pin,
    fpga_0_FLASH_Mem_CEN_pin => fpga_0_FLASH_Mem_CEN_pin,
    sys_clk_pin => sys_clk_pin,
    sys_rst_pin => sys_rst_pin,
    fpga_core_0_FSL_S_Data_pin => test
  );



end Behavioral;

****************************************

und die mhs-datei:

PARAMETER VERSION = 2.1.0


 PORT fpga_0_RS232_Uart_1_RX_pin = fpga_0_RS232_Uart_1_RX, DIR = I
 PORT fpga_0_RS232_Uart_1_TX_pin = fpga_0_RS232_Uart_1_TX, DIR = O
 PORT fpga_0_DDR2_SDRAM_DDR2_ODT_pin = fpga_0_DDR2_SDRAM_DDR2_ODT, DIR = 
O
 PORT fpga_0_DDR2_SDRAM_DDR2_Addr_pin = fpga_0_DDR2_SDRAM_DDR2_Addr, DIR 
= O, VEC = [12:0]
 PORT fpga_0_DDR2_SDRAM_DDR2_BankAddr_pin = 
fpga_0_DDR2_SDRAM_DDR2_BankAddr, DIR = O, VEC = [1:0]
 PORT fpga_0_DDR2_SDRAM_DDR2_CAS_n_pin = fpga_0_DDR2_SDRAM_DDR2_CAS_n, 
DIR = O
 PORT fpga_0_DDR2_SDRAM_DDR2_CE_pin = fpga_0_DDR2_SDRAM_DDR2_CE, DIR = O
 PORT fpga_0_DDR2_SDRAM_DDR2_CS_n_pin = fpga_0_DDR2_SDRAM_DDR2_CS_n, DIR 
= O
 PORT fpga_0_DDR2_SDRAM_DDR2_RAS_n_pin = fpga_0_DDR2_SDRAM_DDR2_RAS_n, 
DIR = O
 PORT fpga_0_DDR2_SDRAM_DDR2_WE_n_pin = fpga_0_DDR2_SDRAM_DDR2_WE_n, DIR 
= O
 PORT fpga_0_DDR2_SDRAM_DDR2_Clk_pin = fpga_0_DDR2_SDRAM_DDR2_Clk, DIR = 
O, VEC = [1:0]
 PORT fpga_0_DDR2_SDRAM_DDR2_Clk_n_pin = fpga_0_DDR2_SDRAM_DDR2_Clk_n, 
DIR = O, VEC = [1:0]
 PORT fpga_0_DDR2_SDRAM_DDR2_DM_pin = fpga_0_DDR2_SDRAM_DDR2_DM, DIR = 
O, VEC = [3:0]
 PORT fpga_0_DDR2_SDRAM_DDR2_DQS = fpga_0_DDR2_SDRAM_DDR2_DQS, DIR = IO, 
VEC = [3:0]
 PORT fpga_0_DDR2_SDRAM_DDR2_DQS_n = fpga_0_DDR2_SDRAM_DDR2_DQS_n, DIR = 
IO, VEC = [3:0]
 PORT fpga_0_DDR2_SDRAM_DDR2_DQ = fpga_0_DDR2_SDRAM_DDR2_DQ, DIR = IO, 
VEC = [31:0]
 PORT fpga_0_DDR2_SDRAM_DDR2_DQS_Div_I_pin = 
fpga_0_DDR2_SDRAM_DDR2_DQS_Div_I, DIR = I
 PORT fpga_0_DDR2_SDRAM_DDR2_DQS_Div_O_pin = 
fpga_0_DDR2_SDRAM_DDR2_DQS_Div_O, DIR = O
 PORT fpga_0_FLASH_Mem_A_pin = fpga_0_FLASH_Mem_A, DIR = O, VEC = [8:31]
 PORT fpga_0_FLASH_Mem_DQ_pin = fpga_0_FLASH_Mem_DQ, DIR = IO, VEC = 
[0:7]
 PORT fpga_0_FLASH_Mem_WEN_pin = fpga_0_FLASH_Mem_WEN, DIR = O
 PORT fpga_0_FLASH_Mem_RPN_pin = fpga_0_FLASH_Mem_RPN, DIR = O
 PORT fpga_0_FLASH_Mem_OEN_pin = fpga_0_FLASH_Mem_OEN, DIR = O
 PORT fpga_0_FLASH_Mem_CEN_pin = fpga_0_FLASH_Mem_CEN, DIR = O
 PORT sys_clk_pin = dcm_clk_s, DIR = I, SIGIS = CLK, CLK_FREQ = 
125000000
 PORT sys_rst_pin = sys_rst_s, DIR = I, RST_POLARITY = 0, SIGIS = RST
 PORT fpga_core_0_FSL_S_Data_pin = fpga_core_0_FSL_S_Data, DIR = I, VEC 
= [0:31]


BEGIN microblaze
 PARAMETER INSTANCE = microblaze_0
 PARAMETER C_INTERCONNECT = 1
 PARAMETER HW_VER = 7.10.a
 PARAMETER C_DEBUG_ENABLED = 1
 PARAMETER C_AREA_OPTIMIZED = 1
 PARAMETER C_FSL_LINKS = 1
 BUS_INTERFACE DLMB = dlmb
 BUS_INTERFACE ILMB = ilmb
 BUS_INTERFACE DPLB = mb_plb
 BUS_INTERFACE IPLB = mb_plb
 BUS_INTERFACE DEBUG = microblaze_0_dbg
 BUS_INTERFACE SFSL0 = fpga_core_0_to_microblaze_0
 BUS_INTERFACE MFSL0 = microblaze_0_to_fpga_core_0
 PORT MB_RESET = mb_reset
END

BEGIN plb_v46
 PARAMETER INSTANCE = mb_plb
 PARAMETER HW_VER = 1.02.a
 PORT PLB_Clk = sys_clk_s
 PORT SYS_Rst = sys_bus_reset
END

BEGIN lmb_v10
 PARAMETER INSTANCE = ilmb
 PARAMETER HW_VER = 1.00.a
 PORT LMB_Clk = sys_clk_s
 PORT SYS_Rst = sys_bus_reset
END

BEGIN lmb_v10
 PARAMETER INSTANCE = dlmb
 PARAMETER HW_VER = 1.00.a
 PORT LMB_Clk = sys_clk_s
 PORT SYS_Rst = sys_bus_reset
END

BEGIN lmb_bram_if_cntlr
 PARAMETER INSTANCE = dlmb_cntlr
 PARAMETER HW_VER = 2.10.a
 PARAMETER C_BASEADDR = 0x00000000
 PARAMETER C_HIGHADDR = 0x00001fff
 BUS_INTERFACE SLMB = dlmb
 BUS_INTERFACE BRAM_PORT = dlmb_port
END

BEGIN lmb_bram_if_cntlr
 PARAMETER INSTANCE = ilmb_cntlr
 PARAMETER HW_VER = 2.10.a
 PARAMETER C_BASEADDR = 0x00000000
 PARAMETER C_HIGHADDR = 0x00001fff
 BUS_INTERFACE SLMB = ilmb
 BUS_INTERFACE BRAM_PORT = ilmb_port
END

BEGIN bram_block
 PARAMETER INSTANCE = lmb_bram
 PARAMETER HW_VER = 1.00.a
 BUS_INTERFACE PORTA = ilmb_port
 BUS_INTERFACE PORTB = dlmb_port
END

BEGIN xps_uartlite
 PARAMETER INSTANCE = RS232_Uart_1
 PARAMETER HW_VER = 1.00.a
 PARAMETER C_BAUDRATE = 9600
 PARAMETER C_DATA_BITS = 8
 PARAMETER C_ODD_PARITY = 0
 PARAMETER C_USE_PARITY = 0
 PARAMETER C_SPLB_CLK_FREQ_HZ = 62500000
 PARAMETER C_BASEADDR = 0x84000000
 PARAMETER C_HIGHADDR = 0x8400ffff
 BUS_INTERFACE SPLB = mb_plb
 PORT RX = fpga_0_RS232_Uart_1_RX
 PORT TX = fpga_0_RS232_Uart_1_TX
END

BEGIN mpmc
 PARAMETER INSTANCE = DDR2_SDRAM
 PARAMETER HW_VER = 4.00.a
 PARAMETER C_NUM_PORTS = 1
 PARAMETER C_MEM_PARTNO = MT47H32M16-5E
 PARAMETER C_DDR2_DQSN_ENABLE = 1
 PARAMETER C_MEM_DATA_WIDTH = 32
 PARAMETER C_MEM_CLK_WIDTH = 2
 PARAMETER C_MEM_DM_WIDTH = 4
 PARAMETER C_MEM_DQS_WIDTH = 4
 PARAMETER C_PIM0_BASETYPE = 2
 PARAMETER C_MPMC_CLK0_PERIOD_PS = 8000
 PARAMETER C_MPMC_BASEADDR = 0x88000000
 PARAMETER C_MPMC_HIGHADDR = 0x8fffffff
 BUS_INTERFACE SPLB0 = mb_plb
 PORT DDR2_ODT = fpga_0_DDR2_SDRAM_DDR2_ODT
 PORT DDR2_Addr = fpga_0_DDR2_SDRAM_DDR2_Addr
 PORT DDR2_BankAddr = fpga_0_DDR2_SDRAM_DDR2_BankAddr
 PORT DDR2_CAS_n = fpga_0_DDR2_SDRAM_DDR2_CAS_n
 PORT DDR2_CE = fpga_0_DDR2_SDRAM_DDR2_CE
 PORT DDR2_CS_n = fpga_0_DDR2_SDRAM_DDR2_CS_n
 PORT DDR2_RAS_n = fpga_0_DDR2_SDRAM_DDR2_RAS_n
 PORT DDR2_WE_n = fpga_0_DDR2_SDRAM_DDR2_WE_n
 PORT DDR2_Clk = fpga_0_DDR2_SDRAM_DDR2_Clk
 PORT DDR2_Clk_n = fpga_0_DDR2_SDRAM_DDR2_Clk_n
 PORT DDR2_DM = fpga_0_DDR2_SDRAM_DDR2_DM
 PORT DDR2_DQS = fpga_0_DDR2_SDRAM_DDR2_DQS
 PORT DDR2_DQS_n = fpga_0_DDR2_SDRAM_DDR2_DQS_n
 PORT DDR2_DQ = fpga_0_DDR2_SDRAM_DDR2_DQ
 PORT DDR2_DQS_Div_I = fpga_0_DDR2_SDRAM_DDR2_DQS_Div_I
 PORT DDR2_DQS_Div_O = fpga_0_DDR2_SDRAM_DDR2_DQS_Div_O
 PORT MPMC_Clk0 = DDR2_SDRAM_mpmc_clk_s
 PORT MPMC_Clk90 = DDR2_SDRAM_mpmc_clk_90_s
 PORT MPMC_Rst = sys_periph_reset
END

BEGIN xps_mch_emc
 PARAMETER INSTANCE = FLASH
 PARAMETER HW_VER = 1.00.a
 PARAMETER C_MCH_PLB_CLK_PERIOD_PS = 16000
 PARAMETER C_NUM_BANKS_MEM = 1
 PARAMETER C_MAX_MEM_WIDTH = 8
 PARAMETER C_MEM0_WIDTH = 8
 PARAMETER C_INCLUDE_DATAWIDTH_MATCHING_0 = 1
 PARAMETER C_SYNCH_MEM_0 = 0
 PARAMETER C_TCEDV_PS_MEM_0 = 70000
 PARAMETER C_TAVDV_PS_MEM_0 = 70000
 PARAMETER C_TWC_PS_MEM_0 = 70000
 PARAMETER C_TWP_PS_MEM_0 = 45000
 PARAMETER C_THZOE_PS_MEM_0 = 25000
 PARAMETER C_THZCE_PS_MEM_0 = 25000
 PARAMETER C_TLZWE_PS_MEM_0 = 5000
 PARAMETER C_MEM0_BASEADDR = 0x82000000
 PARAMETER C_MEM0_HIGHADDR = 0x82ffffff
 BUS_INTERFACE SPLB = mb_plb
 PORT Mem_A = fpga_0_FLASH_Mem_A_split
 PORT Mem_WEN = fpga_0_FLASH_Mem_WEN
 PORT Mem_DQ = fpga_0_FLASH_Mem_DQ
 PORT Mem_OEN = fpga_0_FLASH_Mem_OEN
 PORT Mem_CEN = fpga_0_FLASH_Mem_CEN
 PORT Mem_RPN = fpga_0_FLASH_Mem_RPN
END

BEGIN util_bus_split
 PARAMETER INSTANCE = FLASH_util_bus_split_1
 PARAMETER HW_VER = 1.00.a
 PARAMETER C_SIZE_IN = 32
 PARAMETER C_LEFT_POS = 0
 PARAMETER C_SPLIT = 8
 PORT Sig = fpga_0_FLASH_Mem_A_split
 PORT Out2 = fpga_0_FLASH_Mem_A
END

BEGIN clock_generator
 PARAMETER INSTANCE = clock_generator_0
 PARAMETER HW_VER = 2.00.a
 PARAMETER C_EXT_RESET_HIGH = 1
 PARAMETER C_CLKIN_FREQ = 125000000
 PARAMETER C_CLKOUT0_FREQ = 62500000
 PARAMETER C_CLKOUT0_BUF = TRUE
 PARAMETER C_CLKOUT0_PHASE = 0
 PARAMETER C_CLKOUT0_GROUP = NONE
 PARAMETER C_CLKOUT1_FREQ = 125000000
 PARAMETER C_CLKOUT1_BUF = TRUE
 PARAMETER C_CLKOUT1_PHASE = 0
 PARAMETER C_CLKOUT1_GROUP = DCM0
 PARAMETER C_CLKOUT2_FREQ = 125000000
 PARAMETER C_CLKOUT2_BUF = TRUE
 PARAMETER C_CLKOUT2_PHASE = 90
 PARAMETER C_CLKOUT2_GROUP = DCM0
 PORT CLKOUT0 = sys_clk_s
 PORT CLKOUT1 = DDR2_SDRAM_mpmc_clk_s
 PORT CLKOUT2 = DDR2_SDRAM_mpmc_clk_90_s
 PORT CLKIN = dcm_clk_s
 PORT LOCKED = Dcm_all_locked
 PORT RST = net_gnd
END

BEGIN mdm
 PARAMETER INSTANCE = debug_module
 PARAMETER HW_VER = 1.00.b
 PARAMETER C_MB_DBG_PORTS = 1
 PARAMETER C_USE_UART = 1
 PARAMETER C_UART_WIDTH = 8
 PARAMETER C_BASEADDR = 0x84400000
 PARAMETER C_HIGHADDR = 0x8440ffff
 BUS_INTERFACE SPLB = mb_plb
 BUS_INTERFACE MBDEBUG_0 = microblaze_0_dbg
 PORT Debug_SYS_Rst = Debug_SYS_Rst
END

BEGIN proc_sys_reset
 PARAMETER INSTANCE = proc_sys_reset_0
 PARAMETER HW_VER = 2.00.a
 PARAMETER C_EXT_RESET_HIGH = 0
 PORT Slowest_sync_clk = sys_clk_s
 PORT Dcm_locked = Dcm_all_locked
 PORT Ext_Reset_In = sys_rst_s
 PORT MB_Reset = mb_reset
 PORT Bus_Struct_Reset = sys_bus_reset
 PORT MB_Debug_Sys_Rst = Debug_SYS_Rst
 PORT Peripheral_Reset = sys_periph_reset
END

BEGIN fsl_v20
 PARAMETER INSTANCE = fpga_core_0_to_microblaze_0
 PARAMETER HW_VER = 2.11.a
 PARAMETER C_USE_CONTROL = 0
 PARAMETER C_FSL_DEPTH = 1
 PARAMETER C_EXT_RESET_HIGH = 0
 PORT FSL_Clk = sys_clk_s
 PORT SYS_Rst = sys_rst_s
END

BEGIN fpga_core
 PARAMETER INSTANCE = fpga_core_0
 PARAMETER HW_VER = 1.00.a
 BUS_INTERFACE MFSL = fpga_core_0_to_microblaze_0
 BUS_INTERFACE SFSL = microblaze_0_to_fpga_core_0
 PORT FSL_Clk = sys_clk_s
 PORT FSL_M_Full = net_gnd
 PORT FSL_S_Exists = net_vcc
 PORT FSL_S_Data = fpga_core_0_FSL_S_Data
 PORT FSL_Rst = net_gnd
END

BEGIN fsl_v20
 PARAMETER INSTANCE = microblaze_0_to_fpga_core_0
 PARAMETER HW_VER = 2.11.a
 PARAMETER C_USE_CONTROL = 0
 PARAMETER C_FSL_DEPTH = 1
 PARAMETER C_EXT_RESET_HIGH = 0
 PORT FSL_Clk = sys_clk_s
 PORT SYS_Rst = sys_rst_s
END

***********************************************

und die C Applikation ( der auskommentierte Teil diente zur Umwandlung 
in HEX):

#include "xparameters.h"
#include "fsl.h"
#include "mb_interface.h"
#include "xutil.h"

int main()
{
  unsigned int output_0[1] = {1};
  signed int i;
  signed int j=7;
  int k;
  char digit[8];




      getfslx(output_0[0], 0, FSL_DEFAULT);

//      for (i = 28; i >= 0; i -= 4)
//{
//
//
//    digit[j] = (output_0[0] >> i) & 0x0000000f;
//    if  (digit[j] > 9)
//      {digit[j] = (digit[j] + 'A' - 10);
//      j--;
//      }
//    else
//      digit[j] = (digit[j] + '0');
//      j--;
//}
//
//   for (k = 7; k >= 0; k--)
//
//
//    {
//      xil_printf("%c", digit[k]);
//    }
//
//    xil_printf("\n");

    xil_printf(" %d ", output_0[0]);

  return 0;
}

Vielen Dank, Peter

von Peter M. (whitsha)


Lesenswert?

ich will auf jeden Fall 32 Bit vom top.vhd Design in Ise ins Microblaze 
übertragen.

gibt es vielleicht eine Alternative zu FSL?

von Duke Scarring (Gast)


Lesenswert?

@Peter M.:
>gibt es vielleicht eine Alternative zu FSL?
Z.B.: OPB und PLB

Duke

von Peter M. (whitsha)


Lesenswert?

soweit so gut, danke für die Antwort.

aber man sagt doch FSL soll einfach sein.

wenns geht würde ich bei dieser bleiben, wenn die Daten übertragen 
werden.

kann mir jemand bei diesem Problem helfen?

von Christian R. (supachris)


Lesenswert?

Also mit dem FSL ist es wirklich am einfachsten. Wir haben das mal 
gemacht, und zwar vom ML405 eine FSL Verbindung zu einer externen 
Hardware aufgebaut. Auf der ext. Hardware gabs zwei FIFOs, einer für 
jede Richtung. Dann mussten quasi nur die FIFO-Signale an den FSL 
gebunden werden, was ja sehr einfach ist, da das ja ein FIFO-Interface 
ist. Und dann musst du halt auf dem MicroBlaze das FSL Status-Register 
pollen, schauen, ob FSL_Exist High ist und wenn ja, ein Wort auslesen. 
Danach wieder schauen, ob Exist, usw.
Ist halt sehr ineffektiv die Geschichte. Aber ich denke mal, du bekommst 
nix sinnvolles, weil du vor dem Lesen gar nicht schaust, ob überhaupt 
was da ist.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Es reicht nicht einfach nur Data uf irgeneinen Wert zu legen...
Du mußt auch noch die FSL Steuersignale bedienen sonst kommt nix an.
Lad dir am besten mal das Datenblatt zum FSL runter da steht drinn wie 
es gemacht wird.

Einfach bedeutet nicht das es leicht ist, oder das man irgenwie durch 
ausprobieren zum Ziel kommt.

von Christian R. (supachris)


Lesenswert?

Genau. Der FSL ist ein doppelter FIFO. Da gibts genau wie an normalen 
FIFOs einen Takt, weil das ganze synchron ist, ein Write, ein Full zum 
Schreiben in Richtung des Prozessors und ein Exist, Read und Takt zum 
Lesen vom Prozessor. Im Datenblatt des FSL ist das Timing ja exakt 
beschrieben. Und dann halt immer das Status-Register pollen, ob Daten 
verfügbar sind.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Christian R. schrieb:
> beschrieben. Und dann halt immer das Status-Register pollen, ob Daten
> verfügbar sind.
Oder einfach blokierend lesen ;)

von Christian R. (supachris)


Lesenswert?

Kommt diese Register-Lesen Funktion nicht immer zurück, auch wenn keine 
neuen Daten da sind? Ich müsste mal in den alten Quellcodes wühlen, aber 
ich hab das noch so in Erinnerung....Oder hat Xilinx da eine 
Unterfunktion irgendwo, die auf das Exist wartet und solange blockiert?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Es gibt definitiv drei "funktionen":
- blockierend ohne interupts
- blockierend mit interupts
- nicht blockierend

Die blockierenden funktionen halten dein Programm auch solange auf bis 
ein Wort vom FSL gelesen werden konnte.

von Peter M. (whitsha)


Lesenswert?

danke für so viele Antworten!

ich dachte die ganzen Steuersignale wie FSL_Exist werden automatisch per 
VHDL im FSL Bus gesteuert. Ich arbeite zwar schon eine Weile mit VHDL, 
aber mit C auf Register zugreifen usw., mit dem bin ich noch nicht 
vertraut.

hier noch mein File von generierten fpga_core, da weise ich eben nur 
eine Bitfolge dem signal sum zu:

entity fpga_core is
  port
  (
    -- DO NOT EDIT BELOW THIS LINE ---------------------
    -- Bus protocol ports, do not add or delete.
    FSL_Clk  : in  std_logic;
    FSL_Rst  : in  std_logic;
    FSL_S_Clk  : out  std_logic;
    FSL_S_Read  : out  std_logic;
    FSL_S_Data  : in  std_logic_vector(0 to 31);
    FSL_S_Control  : in  std_logic;
    FSL_S_Exists  : in  std_logic;
    FSL_M_Clk  : out  std_logic;
    FSL_M_Write  : out  std_logic;
    FSL_M_Data  : out  std_logic_vector(0 to 31);
    FSL_M_Control  : out  std_logic;
    FSL_M_Full  : in  std_logic
    -- DO NOT EDIT ABOVE THIS LINE ---------------------
  );

attribute SIGIS : string;
attribute SIGIS of FSL_Clk : signal is "Clk";
attribute SIGIS of FSL_S_Clk : signal is "Clk";
attribute SIGIS of FSL_M_Clk : signal is "Clk";

end fpga_core;

------------------------------------------------------------------------ 
------
-- Architecture Section
------------------------------------------------------------------------ 
------

-- In this section, we povide an example implementation of ENTITY 
fpga_core
-- that does the following:
--
-- 1. Read all inputs
-- 2. Add each input to the contents of register 'sum' which
--    acts as an accumulator
-- 3. After all the inputs have been read, write out the
--    content of 'sum' into the output FSL bus NUMBER_OF_OUTPUT_WORDS 
times
--
-- You will need to modify this example or implement a new architecture 
for
-- ENTITY fpga_core to implement your coprocessor

architecture EXAMPLE of fpga_core is

   -- Total number of input data.
   constant NUMBER_OF_INPUT_WORDS  : natural := 1;

   -- Total number of output data
   constant NUMBER_OF_OUTPUT_WORDS : natural := 1;

   type STATE_TYPE is (Idle, Read_Inputs, Write_Outputs);

   signal state        : STATE_TYPE;

   -- Accumulator to hold sum of inputs read at any point in time
   signal sum          : std_logic_vector(0 to 31);

   -- Counters to store the number inputs read & outputs written
   signal nr_of_reads  : natural range 0 to NUMBER_OF_INPUT_WORDS - 1;
   signal nr_of_writes : natural range 0 to NUMBER_OF_OUTPUT_WORDS - 1;

begin
   FSL_S_Read  <= FSL_S_Exists   when state = Read_Inputs   else '0';
   FSL_M_Write <= not FSL_M_Full when state = Write_Outputs else '0';

   FSL_M_Data <= sum;

   The_SW_accelerator : process (FSL_Clk) is
   begin  -- process The_SW_accelerator
    if FSL_Clk'event and FSL_Clk = '1' then     -- Rising clock edge
      if FSL_Rst = '1' then               -- Synchronous reset (active 
high)
        -- CAUTION: make sure your reset polarity is consistent with the
        -- system reset polarity
        state        <= Idle;
        nr_of_reads  <= 0;
        nr_of_writes <= 0;
        sum          <= (others => '0');
      else
        case state is
          when Idle =>
            if (FSL_S_Exists = '1') then
              state       <= Read_Inputs;
              nr_of_reads <= NUMBER_OF_INPUT_WORDS - 1;
              sum         <= (others => '0');
            end if;

          when Read_Inputs =>
            if (FSL_S_Exists = '1') then
              -- Coprocessor function (Adding) happens here
              sum         <= "10101100101011001010110010101100";
              if (nr_of_reads = 0) then
                state        <= Write_Outputs;
                nr_of_writes <= NUMBER_OF_OUTPUT_WORDS - 1;
              else
                nr_of_reads <= nr_of_reads - 1;
              end if;
            end if;

          when Write_Outputs =>
            if (nr_of_writes = 0) then
              state <= Idle;
            else
              if (FSL_M_Full = '0') then
                nr_of_writes <= nr_of_writes - 1;
              end if;
            end if;
        end case;
      end if;
    end if;
   end process The_SW_accelerator;
end architecture EXAMPLE;

von Peter M. (whitsha)


Lesenswert?

es wird mehrmals erwähnt, dass man die Daten pollen kann.

Was genau bedeutet das?

von Christian R. (supachris)


Lesenswert?

Naja, es gibt bei jedem FSL ein Status-Register, da kann man schauen, ob 
neue Daten anliegen, bzw. die anliegenden Daten gültig sind. Aber Läubi 
schrieb ja, es geht auch ohne Pollen. Musst mal die FSL Register 
suchen...

von Peter M. (whitsha)


Lesenswert?

ich möchte noch eins klarstellen:

in meinem generierten core, der an FSL angebunden ist, werden die 
Statusregister ja überprüft.

und zu meinem Problem nochmal:

ich habe ein projekt in ise generiert. In diesem Projekt gibt es ein 
zähler signal, dass ich an den microblaze schicken möchte. Dazu wurde im 
EDK per "Create Peripheral" ein Core generiert und das ganze EDK-Projekt 
in ISE eingebunden.

Das FSL_S_Data von diesem Core wird external gemacht, damit die 
Verbindung zwischen dem ISE und EDK Projekt hergestellt werden kann.

nun, wenn sich der zähler ändert soll es an den microblaze geschickt 
werden.

wie kann man das realisieren?

Wie kann ich im C die FSL Ports vom Microblaze abfragen?

...Gute nacht, Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.