рдкреАрд╕реАрдЖрдИ рдмрд╕ рдкрд░ рд▓реЗрдирджреЗрди рдирд┐рд╖реНрдкрд╛рджрдиред VHDL рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЗрддрдирд╛ рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВрдиреЗ рдкреАрд╕реАрдЖрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛ ред рдореБрдЭреЗ рдиреМрдХрд░реА рдорд┐рд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛, рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдм рдХреБрдЫ рдпрд╛рдж рд░рдЦрдирд╛ рдкрдбрд╝рд╛, рдЙрд╕реА рд╕рдордп рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдкреАрд╕реАрдЖрдИ рдмрд╕ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдирджреЗрди рд╣реИрдВ, рдХреЗрд╡рд▓ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:


рд▓реЗрдирджреЗрди рдХрд░рддреЗ рд╕рдордп, 2 рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ:

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рд╣реБрдЖ, рдкреАрд╕реАрдЖрдИ рдмрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдорд╛рд╕реНрдЯрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдорд╛рд╕реНрдЯрд░ рдХрд╣реВрдБрдЧрд╛, рджрд╛рд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд▓рдХреНрд╖реНрдп (рд▓рдХреНрд╖реНрдп)ред
рдпрд╣ рд▓реЗрдЦ рдХреЗрд╡рд▓ рд▓реЗрдирджреЗрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬрдм рдорд╛рд╕реНрдЯрд░ рджрдХреНрд╖рд┐рдг рдкреБрд▓ рд╣реИ, рд▓реЗрдирджреЗрди рдХреЗ рдмрд╛рдж рд╕реЗ рдЬрдм рдорд╛рд╕реНрдЯрд░ рдкреАрд╕реАрдЖрдИ рдмрд╕ рд╕реЗ рдЬреБрдбрд╝рд╛ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ, рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд╣рдХрджрд╛рд░ рд╣реИрдВред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдмрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХреЗрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
entity main is Port ( clk : in std_logic; AD : inout std_logic_vector(31 downto 0); IDSEL : in std_logic; CBE : in std_logic_vector(3 downto 0); FRAME : in std_logic; IRDY : in std_logic; TRDY : inout std_logic; STOP : inout std_logic; PAR : inout std_logic; RST : in std_logic; DEVSEL : inout std_logic ); end main; 


clk (рдХреНрд▓реЙрдХ) - PCI рдкрд░ рд╕рднреА рд▓реЗрдирджреЗрди рдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ PCI рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдирдкреБрдЯ рднреА рд╣реИред
AD (рдкрддрд╛ рдФрд░ рдбреЗрдЯрд╛) - рдмрд╕ рдХрд╛ рдкрддрд╛ рдФрд░ рдбреЗрдЯрд╛ рдмрд╣реБрд╕рдВрдХреЗрддрдиред
IDSEL (рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдбрд┐рд╡рд╛рдЗрд╕ рд╕рд┐рд▓реЗрдХреНрдЯ) - рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдЪрдпрди, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди рдЪрд┐рдк рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
CBE (рдмрд╕ рдХрдорд╛рдВрдб рдФрд░ рдмрд╛рдЗрдЯ рд╕рдХреНрд╖рдо) - рдмрд╕ рдХрдорд╛рдВрдб рдФрд░ рдмрд╛рдЗрдЯ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рдиред
рдлреНрд░реЗрдо (рдлреНрд░реЗрдо) - рд╕рдВрдХреЗрдд рд▓реЗрдирджреЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдорд╛рд╕реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЕрд╡рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХрд▓-рдЪрд░рдг рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП, FRAME рд╣рдореЗрд╢рд╛ рдПрдХ рдШрдбрд╝реА рдЪрдХреНрд░ рддрдХ рд░рд╣рддрд╛ рд╣реИред рдорд▓реНрдЯреАрдлрд╝реЗрдЬрд╝ рд▓реЗрдирджреЗрди рдореЗрдВ, рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ FRAME рдХреЛ рдПрдХ рдЪрдХреНрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
IRDY (рдкрд╣рд▓ рддреИрдпрд╛рд░) - рдЧреБрд░реБ рдХреА рддрддреНрдкрд░рддрд╛ рдХрд╛ рд╕рдВрдХреЗрддред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛ рдЪрд░рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
TRDY (рд▓рдХреНрд╖реНрдп рддреИрдпрд╛рд░) - рд▓рдХреНрд╖реНрдп рдХреА рддрддреНрдкрд░рддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд, рдбреЗрдЯрд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рдЪрд░рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдХреА рддрддреНрдкрд░рддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред
STOP (рд░реЛрдХ) - рдпрд╣ рд╕рдВрдХреЗрдд рдПрдХ рд▓рдХреНрд╖реНрдп рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╡рд╣ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред
PAR (рд╕рдорд╛рдирддрд╛) - AD рдФрд░ CBE рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╕рдорд╛рдирддрд╛ред
RST (рд░реАрд╕реЗрдЯ) - рд╕рдВрдХреЗрдд рд░реАрд╕реЗрдЯ рдХрд░реЗрдВред рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред
DEVSEL (рдбрд┐рд╡рд╛рдЗрд╕ рдЪрдпрди) - рдбрд┐рд╡рд╛рдЗрд╕ рдЪрдпрди рд╕рдВрдХреЗрддред

рдХрд┐рд╕реА рднреА рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрдирджреЗрди рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрдирджреЗрди рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реАред


OS рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрдирджреЗрди рдХрд╛ рджреГрд╢реНрдп
рдкреАрд╕реА рдкрд░ рдкреАрд╕реАрдЖрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрди-рджреЗрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрдирдлрд┐рдб_рдПрдбреАрдЖрд░рдбреАрдПрд╕ рдФрд░ CONFIG_DATA рдирд╛рдо рдХреЗ рджреЛ I / O рдкреЛрд░реНрдЯ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрд░рдорд╢рдГ 0CF8h рдФрд░ 0CFCh рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде, рдФрд░ рд╣реЛрд╕реНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ - PCI рдкреАрд╕реА рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреАрд╕реАрдЖрдИ рдмрд╕ рд╕реАрдзреЗ рдпрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рдЬреБрдбрд╝рддреА рд╣реИред
CONFIG_ADDRESS рдкреЛрд░реНрдЯ рдЖрдХрд╛рд░ рдореЗрдВ рдПрдХ рдбрдмрд▓ рд╢рдмреНрдж рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкрддреЛрдВ рдкрд░ рдЫреЛрдЯреА рдХреЙрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп I / O рд▓реЗрдирджреЗрди рдХреЗ рд░реВрдк рдореЗрдВ PCI рдмрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреЛрд░реНрдЯ рдкрдврд╝рд╛ рдФрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рдореНрди рдкреНрд░рд╛рд░реВрдк рд╣реИрдВ:

рдЬрдм рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрдирджреЗрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреАрд╕реАрдЖрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реНрдкреЗрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдкрддрд╛ рдЗрд╕ рдкреЛрд░реНрдЯ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрд╕ рдирдВрдмрд░ (рдмрд┐рдЯреНрд╕ реирей-резрем), рдбрд┐рд╡рд╛рдЗрд╕ (резрел-резрез), рдлрд╝рдВрдХреНрд╢рдВрд╕ (резреж-,), рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реНрд╡рдпрдВ (2-реи) рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдмрд┐рдЯреНрд╕ 1 рдФрд░ 0 рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдореЗрдВ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрдирджреЗрди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛ рд╕рдХреЗред рдЕрдВрдХ 30-24 рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рджрд░рдЕрд╕рд▓, CONFIG_DATA рдкреЛрд░реНрдЯ рдХреЛ рдкрдврд╝рддреЗ рдпрд╛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрди-рджреЗрди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рд╣реЛрд╕реНрдЯ-рдкреАрд╕реАрдЖрдИ рдкреБрд▓ рд╕реЗ рдЬреБрдбрд╝реА рдмрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЙрдЪреНрдЪ рдмрд┐рдЯ рдФрд░ рдмрд╕ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдкрддрд╛, рдпрд╛ рдЗрд╕ рдмрд╕ рдХреЗ рдиреАрдЪреЗ рд╕реНрдерд┐рдд рдХрд┐рд╕реА рднреА рдкреАрд╕реАрдЖрдИ рдмрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ CONFIG_ADDRESS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдПрдХ рдпрд╛ рдХрдИ рдкреАрд╕реАрдЖрдИ - рдкреАрд╕реАрдЖрдИ рдкреБрд▓ (рдмрд╕ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╡реИрдз рд╕реАрдорд╛ рдЗрд╕рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╣реЛрд╕реНрдЯ - рдкреАрд╕реАрдЖрдИ рдкреБрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ)ред CONFIG_DATA рдкреЛрд░реНрдЯ рдкрд░ рдкрд╣реБрдВрдЪ рдХрд╛ рдЖрдХрд╛рд░ рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдкрддрд╛ CONFIG_ADDRESS рдореЗрдВ рд╣реИред
рдпрджрд┐ CONFIG_ADDRESS рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд╕ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрд╕реНрдЯ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рдмрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ - PCI рдмреНрд░рд┐рдЬ, рдЯрд╛рдЗрдк 0 рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрдирджреЗрди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ CONFIG_ADDRESS рдкреЛрд░реНрдЯ рдХреЗ 15-12 рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╕реНрдерд┐рдд рдбрд┐рд╡рд╛рдЗрд╕ рдирдВрдмрд░ IDSEL рд╕рдВрдХреЗрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрдирджреЗрди рдХреЗ рдкрддрд╛ рдЪрд░рдг рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдП рдЧрдП рдбрд┐рд╡рд╛рдЗрд╕ рдирдВрдмрд░ (рдПрдХ рдЗрдХрд╛рдИ рдФрд░ рд╢реЗрд╖ рд╢реВрдиреНрдп рдмрд┐рдЯреНрд╕) рдкрддреЗ рдХреЗ 31-11 рдмрд┐рдЯреНрд╕ рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдпрджрд┐ CONFIG_ADDRESS рдореЗрдВ рдкрддрд╛ рд╣реЛрд╕реНрдЯ рд╕реЗ рд╕реАрдзреЗ рдЬреБрдбрд╝реА рдЧрд▓рдд рдмрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ - PCI рдкреБрд▓, рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЯрд╛рдЗрдк 1 рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрдирджреЗрди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ PCI - PCI рдкреБрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдкрддреЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рдмрд╕ рдирдВрдмрд░ рдХреЛ рдкрд╣рдЪрд╛рди рд▓реЗрдЧрд╛ред рдпрд╣ рдкреБрд▓ рдпрд╛ рддреЛ рдЯрд╛рдЗрдк 0 рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЗрдирджреЗрди рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдЧрд╛ (рдпрджрд┐ рд╕рдВрдмреЛрдзрд┐рдд рдбрд┐рд╡рд╛рдЗрд╕ рдЗрд╕ рдкреБрд▓ рд╕реЗ рд╕реАрдзреЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ), рдпрд╛ рдпрд╣ рдЯрд╛рдЗрдк 1 рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде рд▓реЗрдирджреЗрди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЕрдЧрд▓реЗ рдкреБрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХрд╛ рдорд╛рд░реНрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд▓рдВрдмрд╛рдИ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдмрд╕ рд╕рдВрдЦреНрдпрд╛ (8 рдмрд┐рдЯреНрд╕) рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреА рдереЛрдбрд╝реА рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕реАрдорд┐рдд рд╣реИред

рдпрджрд┐ рд▓реЗрди-рджреЗрди рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдкрддрд╛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ (рдмрд╕, рдбрд┐рд╡рд╛рдЗрд╕, рдлрд╝рдВрдХреНрд╢рди, рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ), рддреЛ рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рди рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рд░реАрдб рдСрдкрд░реЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рдЗрдХрд╛рдЗрдпреЛрдВ рд╡рд╛рд▓реЗ рдПрдХ рдореВрд▓реНрдпред

рд▓реЗрдирджреЗрди рдкреНрд░рдХрд╛рд░ 1 рдХреЗ рд▓рд┐рдП рдкрддрд╛ рдкреНрд░рд╛рд░реВрдкред

рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдкрддрд╛ рдкреНрд░рд╛рд░реВрдк 0 рд╣реИред

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдкреНрд░рд╛рд░реВрдк:

рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ:

рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдФрд░ рдкреЛрд░реНрдЯ рд╡рд┐рд╡рд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ:

рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИред 0xFFFFFFFF рдмрд╛рд░ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдорд╛рди BAR рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ 0xFFFFFFFF рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред рдХрдо рдмрд┐рдЯ рдореЗрдВ рдЗрдХрд╛рдИ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдирджреЗрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рдорд╛рд╕реНрдЯрд░ AD рдмрд╕ рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдкрддреЗ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ, CBE рдмрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрдорд╛рдВрдб, FRAME рд╕рд┐рдЧреНрдирд▓ рдХреЛ 0 рдФрд░ IRDY рд╕рд┐рдЧреНрдирд▓ рдХреЛ 0. рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдорд╛рд╕реНрдЯрд░ TRDY рдФрд░ DEVEL рд╕рд┐рдЧреНрдирд▓ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рдХреНрд╖реНрдп AD рдмрд╕ рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред IRDY, TRDY, рдФрд░ DEVSEL рддрд░реНрдХ рд╢реВрдиреНрдп рдкрд░ рд╣реЛрдиреЗ рдкрд░ рдбреЗрдЯрд╛ рд╡реИрдз рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


FPGA рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: I / O рдмрдлрд░ рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рддреЛ, AD рдмрд╕ рдХреЗ рд▓рд┐рдП, рдХрдиреЗрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 signal AD_I: std_logic_vector (AD'range); signal AD_O: std_logic_vector (AD'range); signal AD_T: std_logic; AD_BUF: for iCount in AD'low to AD'high generate begin IOBUF_AD : IOBUF generic map ( DRIVE => 12, IOSTANDARD => "PCI33_3", SLEW => "SLOW") port map ( O => AD_I(iCount), IO => AD(iCount), I => AD_O(iCount), T => AD_T ); end generate; 

рдЬрд╣рд╛рдВ,

рд╢реЗрд╖ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕реА рддрд░рд╣, рдореИрдВ рдЗрд╕реЗ рдЙрджреНрдзреГрдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рд▓реЗрдЦ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛, рдПрдХ рд▓реЗрди-рджреЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЬрдм рдХреЛрдИ рдкрддрд╛ AD рдмрд╕ рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ FRAME рд╕рд┐рдЧреНрдирд▓ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИред рдиреАрдЪреЗ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ AdrPhASE рд╕рд┐рдЧреНрдирд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдЖрдкрдХреЛ рдмрд╛рдж рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдПрдбреНрд░реЗрд╕ рдмрд╕ рдФрд░ рдХрдорд╛рдВрдб рдмрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, AdrPhASE рд╕рд┐рдЧреНрдирд▓ FRAME рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдЧрд┐рд░рддреЗ рдЫреЛрд░ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЗрдирджреЗрди рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИред
 signal AdrPhASE: std_logic; signal FRAME_D: std_logic; signal Addres: std_logic_vector(AD_I'range); signal Command: std_logic_vector(CBE'range); signal bCfgTr: boolean; process (clk_i, RST_I) begin if (RST_I = '0') then FRAME_D <= '1' after cTCQ; elsif (rising_edge(clk_I)) then FRAME_D <= FRAME_I after cTCQ; end if; end process; AdrPhASE <= not FRAME_I and FRAME_D; process (clk_I, RST_I) begin if (RST_I = '0') then Address <= (others => '0') after cTCQ; Command <= (others => '0') after cTCQ; bCfgTr <= false after cTCQ; elsif (rising_edge(clk_I)) then if (AdrPhASE = '1') then Address <= AD_I after cTCQ; Command <= CBE_I after cTCQ; bCfgTr <= (IDSEL_I = '1') after cTCQ; end if; end if; end process; 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдорд╢реАрди рдХреЛрдб
 type TSM_PCI_T is (sIDLE, sDECODE, sCFG_READ, sCFG_WRITE, sIO_READ, sIO_WRITE, sMEM_READ, sMEM_WRITE); signal smPCI_T: TSM_PCI_T; process(clk_I, RST_I) begin if (RST_I = '0') then smPCI_T <= sIDLE after cTCQ; elsif (rising_edge(clk_I)) then case (smPCI_T) is when sIDLE => if (AdrPhASE = '1') then smPCI_T <= sDECODE after cTCQ; end if; when sDECODE => if (bCfgTr and Address(10 downto 8) = b"000" and Command(3 downto 1) = b"101") then if (Command(0) = '0') then smPCI_T <= sCFG_READ after cTCQ; else smPCI_T <= sCFG_WRITE after cTCQ; end if; elsif (Command(3 downto 1)= b"001") and (Addres(31 downto 8) = BAR0(31 downto 8))then if (Command(0) = '0') then smPCI_T <= sIO_READ after cTCQ; else smPCI_T <= sIO_WRITE after cTCQ; end if; elsif (Command(3 downto 1) = b"011") and (Addres(31 downto 16) = BAR1(31 downto 16)) then if (Command(0) = '0') then smPCI_T <= sMEM_READ after cTCQ; else smPCI_T <= sMEM_WRITE after cTCQ; end if; else smPCI_T <= sIDLE after cTCQ; end if; when sCFG_READ => if (IRDY_I = '0') then smPCI_T <= sIDLE after cTCQ; end if; when sCFG_WRITE => if (IRDY_I = '0') then smPCI_T <= sIDLE after cTCQ; end if; when sIO_WRITE => if (IRDY_I = '0') then smPCI_T <= sIDLE after cTCQ; end if; when sIO_READ => if (IRDY_I = '0') then smPCI_T <= sIDLE after cTCQ; end if; when sMEM_READ => if (IRDY_I = '0') then smPCI_T <= sIDLE after cTCQ; end if; when sMEM_WRITE => if (IRDY_I = '0') then smPCI_T <= sIDLE after cTCQ; end if; when others => smPCI_T <= sIDLE after cTCQ; end case; end if; end process; 

рдЙрдкрд░реЛрдХреНрдд рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реАрдмреАрдИ рдмрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рд╕рдВрднрд╛рд╡рд┐рдд рдЖрджреЗрд╢ рджреЗрдЧрд╛ред

рдкреНрд░рддреНрдпреЗрдХ рдЯреАрдо рдХреА рдорд╢реАрди рдХреА рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рд╣реИред рдореЗрдореЛрд░реА рдФрд░ I / O рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП CBE рдмрд╕ рдФрд░ AD рдмрд╕ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ, рдорд╛рд╕реНрдЯрд░ рд╕реЗ IRDY рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрдврд╝реЗрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЯрд╛рдЗрдк 0 рдХреЗ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рд╡рд╛рдЗрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдПрдХрд▓-рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдЦреНрдпрд╛ 000 рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдорд╢реАрди рдореЗрдВ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрдкрд░реЛрдХреНрдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд░рдЬрд┐рд╕реНрдЯрд░ рд╕рдВрдЦреНрдпрд╛ (рдмрд┐рдЯреНрд╕ AD.0 рдХреА рдмрд┐рдЯреНрд╕) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, AD рдмрд╕ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛрдб рдкрдврд╝реЗрдВ
 signal CfgRData: std_logic_vector(31 downto 0):=x"00000000"; signal CommandReg: std_logic_vector(15 downto 0) := x"0000"; signal StatusReg: std_logic_vector(15 downto 0) := x"0200"; signal LatencyTimer: std_logic_vector(7 downto 0) := x"00"; signal CacheLineSize: std_logic_vector(7 downto 0) := x"00"; signal BAR0: std_logic_vector(31 downto 0) := x"00000001"; signal BAR1: std_logic_vector(31 downto 0) := x"00000000"; signal InterruptLine: std_logic_vector(7 downto 0); process (clk_I) begin if (rising_edge(clk_I)) then case (Address(7 downto 0)) is when x"00" => CfgRData <= x"00017788" ; --Device ID and Vendor ID when x"04" => CfgRData <= StatusReg & CommandReg; --Status Register, Command Register when x"08" => CfgRData <= x"10000001"; -- Class Code and Revision ID when x"0C" => CfgRData <= x"0000" & LatencyTimer & CacheLineSize; -- BIST, Header Type(bit 7 = 0, single, bits 6-0 = 0, type0), Latency Timer(for masters), Cache Line Size (bit 2 in 1) when x"10" => CfgRData <= BAR0; -- Base Adress 0 (Register IO address decoder) when x"14" => CfgRData <= BAR1; -- Base Adress 1 when x"28" => CfgRData <= x"00000000"; -- CarfdBus CIS Pointer when x"2C" => CfgRData <= x"00017788"; -- Subsystem ID, Subsystem Vendor ID when x"30" => CfgRData <= x"00000000"; -- Expanxion Rom Base Address when x"34" => CfgRData <= x"00000000"; -- Reserved, Capabilitis Pointer when x"38" => CfgRData <= x"00000000"; -- Reserved when x"3C" => CfgRData <= x"004001" & InterruptLine; -- Max_Lat(only bus master), Min_Gnt, Interrupt Pin, Interrupt Line when others => CfgRData <= (others => '0'); end case; end if; end process; 

рдпрд╣ рдХреИрд╕реЗ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрдврд╝рдиреЗ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ:


рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд░рд┐рдХреЙрд░реНрдб

AD рдмрд╕ рдореЗрдВ, рдорд╛рд╕реНрдЯрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░ рдкрддрд╛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓реЗ рдШрдбрд╝реА рдЪрдХреНрд░ рдореЗрдВ, рд▓рд┐рдЦрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред BAR0 рдореЗрдВ, рдмрд┐рдЯреНрд╕ 7..0 рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ, BAR1 рдореЗрдВ, рдмрд┐рдЯреНрд╕ 15..0 рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ / рдУ 256 рдкрддреЗ, рд╕реНрдореГрддрд┐ рдкрддреЗ 4,294,967,296ред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд░рд┐рдХреЙрд░реНрдб рдХреЛрдб
 process(clk_I, RST_I) begin if(RST_I = '0')then CommandReg <= x"0000" after cTCQ; StatusReg <= x"0200" after cTCQ; LatencyTimer <= x"00" after cTCQ; CacheLineSize <= x"00" after cTCQ; BAR0 <= x"00000001" after cTCQ; BAR1 <= x"00000000" after cTCQ; elsif(rising_edge(clk_I)) then if (smPCI_T = sCFG_WRITE) then case(Address(7 downto 0)) is when x"04" => if (CBE_I(1) = '0') then CommandReg(15 downto 8) <= AD_I(15 downto 8) after cTCQ; end if; if (CBE_I(0) = '0') then CommandReg(7 downto 0) <= AD_I(7 downto 0) after cTCQ; end if; when x"0C" => if (CBE_I(1) = '0') then LatencyTimer <= AD_I(15 downto 8) after cTCQ; end if; if (CBE_I(0) = '0') then CacheLineSize <= AD_I(7 downto 0) after cTCQ; end if; when x"10" => if (CBE_I(3) = '0') then BAR0(31 downto 24) <= AD_I(31 downto 24) after cTCQ; end if; if (CBE_I(2) = '0') then BAR0(23 downto 16) <= AD_I(23 downto 16) after cTCQ; end if; if (CBE_I(1) = '0') then BAR0(15 downto 8) <= AD_I(15 downto 8) after cTCQ; end if; when x"14" => if (CBE_I(3) = '0') then BAR1(31 downto 24) <= AD_I(31 downto 24) after cTCQ; end if; if (CBE_I(2) = '0') then BAR1(23 downto 16) <= AD_I(23 downto 16) after cTCQ; end if; when x"3C" => if (CBE_I(0) = '0') then InterruptLine <= AD_I(7 downto 0) after cTCQ; end if; when others => null; end case; end if; end if; end process; 


рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВ

AD рдмрд╕ рдореЗрдВ, рдорд╛рд╕реНрдЯрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░ рдирдВрдмрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд▓реА рдШрдбрд╝реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВ, рдмрд╛рдХреА рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред
 signal IOReg0: std_logic_vector (31 downto 0); process(clk_I, RST_I) begin if(RST_I = '0') then IOReg0 <= x"00000000" after cTCQ; elsif (rising_edge(clk_I)) then if (smPCI_T = sIO_WRITE and Address(7 downto 0) = x"00") then if (CBE_I(0) = '0') then IOReg0( 7 downto 0) <= AD_I( 7 downto 0) after cTCQ; end if; if (CBE_I(1) = '0') then IOReg0(15 downto 8) <= AD_I(15 downto 8) after cTCQ; end if; if (CBE_I(2) = '0') then IOReg0(23 downto 16) <= AD_I(23 downto 16) after cTCQ; end if; if (CBE_I(3) = '0') then IOReg0(31 downto 24) <= AD_I(31 downto 24) after cTCQ; end if; end if; end if; end process; 

рдкреЛрд░реНрдЯ рдкрдврд╝реЗрдВ

AD рдмрд╕ рдореЗрдВ, рдорд╛рд╕реНрдЯрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░ рдирдВрдмрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдбрд┐рд╡рд╛рдЗрд╕ рддрдм AD рдмрд╕ рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рдбреЗрдЯрд╛ рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред
рдкреЛрд░реНрдЯ рд░реАрдб рдХреЛрдб
 signal IORDate: std_logic_vector (31 downto 0); process (clk_I, RST_I) begin if (RST_I = '0') then IORDate <= x"00000000"; elsif (rising_edge(clk_I)) then case (Address(7 downto 0)) is when x"00" => IORDate <= IOReg0 after cTCQ; when x"04" => IORDate <= IOReg1 after cTCQ; when x"08" => IORDate <= IOReg2 after cTCQ; when x"0C" => IORDate <= IOReg3 after cTCQ; when x"10" => IORDate <= IOReg4 after cTCQ; when x"14" => IORDate <= IOReg5 after cTCQ; when x"18" => IORDate <= IOReg6 after cTCQ; when x"1C" => IORDate <= IOReg7 after cTCQ; when x"20" => IORDate <= IOReg8 after cTCQ; when x"24" => IORDate <= IOReg9 after cTCQ; when others => IORDate <= (others => '0'); end case; end if; end process; 

рдЗрд╕ рддрд░рд╣ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд░реНрдЯ рд▓рд┐рдЦрдирд╛ рдФрд░ рдкрдврд╝рдирд╛ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


рд▓реЗрдЦрди рдФрд░ рд╕реНрдореГрддрд┐ рдкрдврд╝рдирд╛

AD рдмрд╕ рдореЗрдВ, рдорд╛рд╕реНрдЯрд░ рдкрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдбреЗрдЯрд╛ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрдЧрд▓реА рдШрдбрд╝реА рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрд╡рдпрдВред рдЬрдм рдПрдбреА рдмрд╕ рдкрд░ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рд╕реНрдЯрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрддрд╛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдбреЗрдЯрд╛ рдЦреБрдж рдПрдбреА рдмрд╕ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдкреЛрд░реНрдЯ рдП рдореЗрдВ рд░реИрдо рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдкреЛрд░реНрдЯ рдмреА рд╕реЗ рдкрдврд╝рд╛ рдЧрдпрд╛ред
рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреЛрдб
 signal RamWrEn: std_logic; signal RamOutputDate: std_logic_vector (31 downto 0); signal RamInputDate: std_logic_vector (31 downto 0); signal RamRst: std_logic := '0'; RAMB16_S36_S36_inst : RAMB16_S36_S36 port map ( DOA => open, -- Port A 32-bit Data Output DOB => RamOutputDate, -- Port B 32-bit Data Output DOPA => open, -- Port A 4-bit Parity Output DOPB => open, -- Port B 4-bit Parity Output ADDRA => Address(8 downto 0), -- Port A 9-bit Address Input ADDRB => Address(8 downto 0), -- Port B 9-bit Address Input CLKA => clk_I, -- Port A Clock CLKB => clk_I, -- Port B Clock DIA => RamInputDate, -- Port A 32-bit Data Input DIB => x"00000000", -- Port B 32-bit Data Input DIPA => x"0", -- Port A 4-bit parity Input DIPB => x"0", -- Port-B 4-bit parity Input ENA => '1', -- Port A RAM Enable Input ENB => '1', -- PortB RAM Enable Input SSRA => '0', -- Port A Synchronous Set/Reset Input SSRB => '0', -- Port B Synchronous Set/Reset Input WEA => RamWrEn, -- Port A Write Enable Input WEB => '0' -- Port B Write Enable Input ); process(clk_I) begin if (rising_edge(clk_I)) then if (RST_I = '1') then RamRst <= '0'; else RamRst <= '1'; end if; end if; end process; process(clk_I, RST_I) begin if(RST_I = '0') then RamInputDate <= (others => '0') after cTCQ; RamWrEn <= '0' after cTCQ; elsif (rising_edge(clk_I)) then if (smPCI_T = sMEM_WRITE) then if (CBE_I(0) = '0') then RamInputDate(7 downto 0) <= AD_I( 7 downto 0) after cTCQ; end if; if (CBE_I(1) = '0') then RamInputDate(15 downto 8) <= AD_I(15 downto 8) after cTCQ; end if; if (CBE_I(2) = '0') then RamInputDate(23 downto 16) <= AD_I(23 downto 16) after cTCQ; end if; if (CBE_I(3) = '0') then RamInputDate(31 downto 24) <= AD_I(31 downto 24) after cTCQ; end if; RamWrEn <= '1' after cTCQ; else RamWrEn <= '0' after cTCQ; end if; end if; end process; 

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореЗрдореЛрд░реА рд▓рд┐рдЦрдирд╛ рдФрд░ рдкрдврд╝рдирд╛ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ:


AD рдмрд╕ рдкрд░ рдбреЗрдЯрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рдорд╢реАрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рдВрдмрдВрдзрд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
 process (clk_I, RST_I) begin if (RST_I = '0') then AD_O <= (others => '0') after cTCQ; elsif (rising_edge(clk_I)) then if (smPCI_T = sCFG_READ) then AD_O <= CfgRData after cTCQ; elsif (smPCI_T = sIO_READ) then AD_O <= IORDate after cTCQ; elsif (smPCI_T = sMEM_READ) then AD_O <= RamOutputDate after cTCQ; end if; end if; end process; 

AD рдмрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рд╕рдВрдХреЗрдд рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ:
 process (clk_I, RST_I) begin if (RST_I = '0') then AD_T <= '1' after cTCQ; elsif (rising_edge(clk_I)) then AD_T <= not b2l(smPCI_T = sCFG_READ or smPCI_T = sIO_READ or smPCI_T = sMEM_READ) after cTCQ; end if; end process; 


рдЕрд▓рдЧ рд╕реЗ, рдореИрдВ DEVSEL рд╕рдВрдХреЗрдд рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ STS рдШрдЯрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛
 DEVSEL_STS : entity WORK.componentIO(Behavioral) port map (iD => DEVSEL_O, oT => DEVSEL_T, clk => clk_I, rst => RST_I) 

рдЪреВрдВрдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рдХреНрд░рд┐рдп рд╕реНрддрд░ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ, рдлрд┐рд░ рдЬреЗрдб - рд░рд╛рдЬреНрдп рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдФрд░ рд▓рд╛рдЗрди рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рддрд╛рд░реНрдХрд┐рдХ рдЗрдХрд╛рдИ рдХрд╛ рд╕реНрддрд░ рдЬрд╛рд░реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕реЗ рдЬреЗрдб рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкреАрд╕реАрдЖрдИ рдмрд╕ рдореЗрдВ рд▓реЗрдирджреЗрди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЙрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рд▓рдЧрддрд╛ рд╣реИред рд╡рд┐рдХрд╕рд┐рдд рдлрд░реНрдорд╡реЗрдпрд░ рдХреЛ FPGA рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред FPGA рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб рдХреЛ PCI рд╕реНрд▓реЙрдЯ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдЪрд╛рд▓реВ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдиреЗ рдмреЛрд░реНрдб рдкрд╛рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ред


рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! :)

рдбреНрд░рд╛рдЗрд╡ . google.com/file/d/0B-i4aT8Q0ZNxc1VkV3J2b0dTRlU/view?usp=sharing рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрд╡рдпрдВред рдУрдкрди xilinx ise 14.2ред

Source: https://habr.com/ru/post/In182152/


All Articles