TWiki
>
P1076 Web
>
Vhdl2019CollectedRequirements
>
InterfaceAndBundleEnhancements
>
SpiFutureUseCase
(revision 3) (raw view)
Edit
Attach
---+ SPI Interface - exploring what is next Use Cases %TOC% ---++ Introduction Continuing with the SPI interface with * One QSPI bus master * 8 QSPI Slaves * 8 SPI Slaves Explore what additional syntax we may need to add in a future revision. Based on: [[SpiWithPortViewSpaceShip][SPI with Port View and Space ship]]%BR% Based on LCS: [[LCS2016_045a][LCS 2016 45a]] Port Views plus [[LCS2016_070][LCS 2016 70 Space Ship]] ---++ Alternative 1: Abstracting connections with map procedures * A map procedure is a callable container of concurrent code. * Issues: cannot be used on interface * A little better than an entity, but not a lot <pre> map procedure qspi_master_spi_slave_exch is parameter ( index : integer ; signal slave : view spi_slave_view; signal master : view qspi_master_view ) is begin slave.mosi <=> master.mosi(0); slave.miso <=> master.miso(0); slave.sclk <=> master.sclk; slave.ssel <=> master.ssel(index); end map procedure qspi_master_spi_slave_exch ; gen_spi_slave_bus : for i in spi_slave_bus'range generate begin qspi_master_spi_slave_exch ( index => i+8, slave => spi_slave_bus(i), master => qspi_master_bus ) ; end generate gen_spi_slave_bus ; </pre> ---++ Alternative 2: Abstracting connections with conversion like map function * Create a map function that works like a conversion. * Potentially usable in a port map. * Issues: 2 functions <pre> package SpiPkg is -- . . . map function s_to_qm (signal slave : view spi_slave_view) return qspi_master_view is begin return ( mosi => unaffected, miso(0) => slave.miso, miso(3 downto 1) => unaffected, sclk => unaffected, ssel => unaffected ) ; end map function s_to_qm ; map function qm_to_s(signal master : view qspi_master_view; i : integer ) return spi_slave_view is return ( mosi => master.mosi(0), miso => unaffected, sclk => master.sclk, ssel => master.ssel(i) ) ; end map function qm_to_s ; end package SpiPkg ; -- creating connections gen_spi_slave_bus : for i in spi_slave_bus'range generate s_to_qm(spi_slave_bus(i)) <=> qm_to_s(qspi_master_bus, i) ; end generate gen_spi_slave_bus ; </pre> ---++ Alternative 2b: Using the conversion like map function on a component instance <pre> -- Alternately no need to create connections, do mapping on component instances qspi_master_1 : qspi_master port map (qspi_master_bus => qspi_master_bus) ; gen_qspi_slaves : for i in qspi_slave_bus'range generate qspi_slave_1 : qspi_slave port map (qs_to_qm(qspi_slave_bus) => qm_to_s(qspi_master_bus, i)) ; end generate gen_spi_slaves ; gen_spi_slaves : for i in spi_slave_bus'range generate spi_slave_1 : spi_slave port map (s_to_qm(spi_slave_bus) => qm_to_s(qspi_master_bus, i)) ; end generate gen_spi_slaves ; </pre> ---++ Alternative 2c: Does a map conversion require a designation on the interface since it is different <pre> -- Alternately no need to create connections, do mapping on component instances ... gen_qspi_slaves : for i in qspi_slave_bus'range generate qspi_slave_1 : qspi_slave port map (map qs_to_qm(qspi_slave_bus) => map qm_to_s(qspi_master_bus, i)) ; end generate gen_spi_slaves ; ... </pre> ---++ Alternative 2d: Allowing others in a map function <pre> package SpiPkg is -- . . . map function s_to_qm (signal slave : view spi_slave_view) return qspi_master_view is begin return ( miso(0) => slave.miso, miso(3 downto 1) => unaffected, others => unaffected ) ; end map function s_to_qm ; map function qm_to_s(signal master : view qspi_master_view ; i : integer) return spi_slave_view is begin return ( mosi => master.mosi(0), miso => unaffected, sclk => master.sclk, ssel => master.ssel(i) ) ; end map function qm_to_s ; end package SpiPkg ; </pre> ---++ Alternative 3: Map function that connects actual to formal. * Specifies how the parameters of the map function connects to the formal * One function specified on an actual <pre> -- Definition in a package: map function qm_to_qs(signal master : view qspi_master_view ; i : integer ) to qspi_slave_view is begin map ( mosi <= master.mosi, miso => master.miso, sclk <= master.sclk, ssel <= master.ssel(i) ) ; end map function qm_to_s ; map function qm_to_s(signal master : view qspi_master_view ; i : integer ) to spi_slave_view is begin map ( mosi <= master.mosi(0), miso => master.miso(0), sclk <= master.sclk, ssel <= master.ssel(i) ) ; end map function qm_to_s ; -- Usage in an entity: qspi_master_1 : qspi_master (qspi_master_bus => qspi_master_bus) ; gen_qspi_slaves : for i in qspi_slave_bus'range generate qspi_slave_1 : qspi_slave port map (qspi_slave_bus => map qm_to_qs(qspi_master_bus, i)) ; end generate gen_spi_slaves ; gen_spi_slaves : for i in spi_slave_bus'range generate spi_slave_1 : spi_slave port map (spi_slave_bus => map qm_to_s(qspi_master_bus, i)) ; end generate gen_spi_slaves ; </pre> ---++ Alternative 4: Create a map function that overloads spaceship * Requires additional static parameters as generics * Issues: cannot be used on entity interface <pre> map function "<=>" generic (index : integer) parameter (signal slave : view slave_view ; signal master : view master_view) is begin slave.mosi <=> master.mosi(0); slave.miso <=> master.miso(0); slave.sclk <=> master.sclk; slave.ssel <=> master.ssel(index); end function "<=>" ; gen_spi_slave_bus : for i in spi_slave_bus'range generate spi_slave_bus(i) <=> qspi_master_bus generic map (index => i) ; end generate gen_spi_slave_bus ; </pre> ---++ Alternative 5: Extending capability of spaceship with map () * Currently a separate LCS 70a <pre> -- create the interconnect. 1 bit in ssel per slave gen_qspi_slave_bus : for i in qspi_slave_bus'range generate qspi_slave_bus(i) <=> map ( mosi => qspi_master_bus.mosi, miso => qspi_master_bus.miso, sclk => qspi_master_bus.sclk, ssel => qspi_master_bus.ssel(i) ); end generate gen_qspi_slave_bus ; </pre> ---++ Alternative 6: A silly alternative as an abbreviated map () * <pre> for qspi_slave_bus(i) map ( mosi => qspi_master_bus.mosi, miso => qspi_master_bus.miso, sclk => qspi_master_bus.sclk, ssel => ssel ); </pre>
Edit
|
Attach
|
P
rint version
|
H
istory
:
r6
<
r5
<
r4
<
r3
<
r2
|
B
acklinks
|
V
iew topic
|
Raw edit
|
More topic actions...
Topic revision: r1 - 2017-04-02 - 16:07:50 -
TWikiGuest
P1076
Log In
or
Register
P1076 Web
Create New Topic
Index
Search
Changes
Notifications
RSS Feed
Statistics
Preferences
Webs
Main
P1076
Ballots
LCS2016_080
P10761
P1647
P16661
P1685
P1734
P1735
P1778
P1800
P1801
Sandbox
TWiki
VIP
VerilogAMS
Copyright © 2008-2026 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback