mirror of
https://github.com/wfjm/w11.git
synced 2026-03-09 04:30:39 +00:00
initial source upload (no docs yet)
This commit is contained in:
32
.cvsignore
Normal file
32
.cvsignore
Normal file
@@ -0,0 +1,32 @@
|
||||
*.dep_ghdl
|
||||
*.dep_isim
|
||||
*.dep_xst
|
||||
work-obj93.cf
|
||||
*.vcd
|
||||
*.ghw
|
||||
*.sav
|
||||
*.tmp
|
||||
*.exe
|
||||
ise
|
||||
xflow.his
|
||||
*.ngc
|
||||
*.ncd
|
||||
*.pcf
|
||||
*.bit
|
||||
*.msk
|
||||
isim
|
||||
isim.log
|
||||
isim.wdb
|
||||
fuse.log
|
||||
*_[sft]sim.vhd
|
||||
*_tsim.sdf
|
||||
*_xst.log
|
||||
*_tra.log
|
||||
*_twr.log
|
||||
*_map.log
|
||||
*_par.log
|
||||
*_pad.log
|
||||
*_bgn.log
|
||||
*_svn.log
|
||||
*_sum.log
|
||||
*_[dsft]sim.log
|
||||
16
COPYING.txt
Normal file
16
COPYING.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
This package is released under the GPL V2 or higher, all files
|
||||
contain the disclaimer:
|
||||
|
||||
This program is free software; you may redistribute and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation, either version 2 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for complete details.
|
||||
|
||||
The full text of the GPL licenses is in this directory as
|
||||
LICENSE_gpl_v2.txt
|
||||
LICENSE_gpl_v3.txt
|
||||
339
LICENSE_gpl_v2.txt
Normal file
339
LICENSE_gpl_v2.txt
Normal file
@@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
674
LICENSE_gpl_v3.txt
Normal file
674
LICENSE_gpl_v3.txt
Normal file
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
19
rtl/bplib/issi/Makefile
Normal file
19
rtl/bplib/issi/Makefile
Normal file
@@ -0,0 +1,19 @@
|
||||
# $Id: Makefile 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2007-12-14 101 1.0 Initial version
|
||||
#
|
||||
#
|
||||
.phony : clean
|
||||
#
|
||||
clean : ghdl_clean
|
||||
#
|
||||
#-----
|
||||
#
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.ghdl
|
||||
#
|
||||
VBOM_all = $(wildcard *.vbom)
|
||||
#
|
||||
include $(VBOM_all:.vbom=.dep_ghdl)
|
||||
#
|
||||
5
rtl/bplib/issi/is61lv25616al.vbom
Normal file
5
rtl/bplib/issi/is61lv25616al.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
# components
|
||||
# design
|
||||
is61lv25616al.vhd
|
||||
169
rtl/bplib/issi/is61lv25616al.vhd
Normal file
169
rtl/bplib/issi/is61lv25616al.vhd
Normal file
@@ -0,0 +1,169 @@
|
||||
-- $Id: is61lv25616al.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2008 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: is61lv25616al - sim
|
||||
-- Description: ISSI 61LV25612AL SRAM model
|
||||
-- Currently a truely minimalistic functional model, without
|
||||
-- any timing checks. It assumes, that addr/data is stable at
|
||||
-- the trailing edge of we.
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2008-05-12 145 1.0.1 BUGFIX: Output now 'Z' if byte enables deasserted
|
||||
-- 2007-12-14 101 1.0 Initial version (written on warsaw airport)
|
||||
------------------------------------------------------------------------------
|
||||
-- Truth table accoring to data sheet:
|
||||
--
|
||||
-- Mode WE_N CE_N OE_N LB_N UB_N D(7:0) D(15:8)
|
||||
-- Not selected X H X X X high-Z high-Z
|
||||
-- Output disabled H L H X X high-Z high-Z
|
||||
-- X L X H H high-Z high-Z
|
||||
-- Read H L L L H D_out high-Z
|
||||
-- H L L H L high-Z D_out
|
||||
-- H L L L L D_out D_out
|
||||
-- Write L L X L H D_in high-Z
|
||||
-- L L X H L high-Z D_in
|
||||
-- L L X L L D_in D_in
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
entity is61lv25616al is -- ISSI 61LV25612AL SRAM model
|
||||
port (
|
||||
CE_N : in slbit; -- chip enable (act.low)
|
||||
OE_N : in slbit; -- output enable (act.low)
|
||||
WE_N : in slbit; -- write enable (act.low)
|
||||
UB_N : in slbit; -- upper byte enable (act.low)
|
||||
LB_N : in slbit; -- lower byte enable (act.low)
|
||||
ADDR : in slv18; -- address lines
|
||||
DATA : inout slv16 -- data lines
|
||||
);
|
||||
end is61lv25616al;
|
||||
|
||||
|
||||
architecture sim of is61lv25616al is
|
||||
|
||||
signal CE : slbit := '0';
|
||||
signal OE : slbit := '0';
|
||||
signal WE : slbit := '0';
|
||||
signal BE_L : slbit := '0';
|
||||
signal BE_U : slbit := '0';
|
||||
|
||||
component is61lv25616al_bank is -- ISSI 61LV25612AL bank
|
||||
port (
|
||||
CE : in slbit; -- chip enable (act.high)
|
||||
OE : in slbit; -- output enable (act.high)
|
||||
WE : in slbit; -- write enable (act.high)
|
||||
BE : in slbit; -- byte enable (act.high)
|
||||
ADDR : in slv18; -- address lines
|
||||
DATA : inout slv8 -- data lines
|
||||
);
|
||||
end component;
|
||||
|
||||
begin
|
||||
|
||||
CE <= not CE_N;
|
||||
OE <= not OE_N;
|
||||
WE <= not WE_N;
|
||||
BE_L <= not LB_N;
|
||||
BE_U <= not UB_N;
|
||||
|
||||
BANK_L : is61lv25616al_bank port map (
|
||||
CE => CE,
|
||||
OE => OE,
|
||||
WE => WE,
|
||||
BE => BE_L,
|
||||
ADDR => ADDR,
|
||||
DATA => DATA(7 downto 0));
|
||||
|
||||
BANK_U : is61lv25616al_bank port map (
|
||||
CE => CE,
|
||||
OE => OE,
|
||||
WE => WE,
|
||||
BE => BE_U,
|
||||
ADDR => ADDR,
|
||||
DATA => DATA(15 downto 8));
|
||||
|
||||
end sim;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
entity is61lv25616al_bank is -- ISSI 61LV25612AL bank
|
||||
port (
|
||||
CE : in slbit; -- chip enable (act.high)
|
||||
OE : in slbit; -- output enable (act.high)
|
||||
WE : in slbit; -- write enable (act.high)
|
||||
BE : in slbit; -- byte enable (act.high)
|
||||
ADDR : in slv18; -- address lines
|
||||
DATA : inout slv8 -- data lines
|
||||
);
|
||||
end is61lv25616al_bank;
|
||||
|
||||
architecture sim of is61lv25616al_bank is
|
||||
|
||||
constant T_rc : time := 10 ns; -- read cycle time (min)
|
||||
constant T_aa : time := 10 ns; -- address access time (max)
|
||||
constant T_oha : time := 2 ns; -- output hold time (min)
|
||||
constant T_ace : time := 10 ns; -- ce access time (max)
|
||||
constant T_doe : time := 4 ns; -- oe access time (max)
|
||||
constant T_hzoe : time := 4 ns; -- oe to high-Z output (max)
|
||||
constant T_lzoe : time := 0 ns; -- oe to low-Z output (min)
|
||||
constant T_hzce : time := 4 ns; -- ce to high-Z output (min=0,max=4)
|
||||
constant T_lzce : time := 3 ns; -- ce to low-Z output (min)
|
||||
constant T_ba : time := 4 ns; -- lb,ub access time (max)
|
||||
constant T_hzb : time := 3 ns; -- lb,ub to high-Z output (min=0,max=3)
|
||||
constant T_lzb : time := 0 ns; -- lb,ub low-Z output (min)
|
||||
|
||||
constant memsize : positive := 2**(ADDR'length);
|
||||
constant datzero : slv(DATA'range) := (others=>'0');
|
||||
type ram_type is array (0 to memsize-1) of slv(DATA'range);
|
||||
|
||||
signal WE_EFF : slbit := '0';
|
||||
|
||||
begin
|
||||
|
||||
WE_EFF <= CE and WE and BE;
|
||||
|
||||
proc_sram: process (CE, OE, WE, BE, WE_EFF, ADDR, DATA)
|
||||
variable ram : ram_type := (others=>datzero);
|
||||
begin
|
||||
|
||||
if WE_EFF'event and WE_EFF='0' then -- end of write cycle
|
||||
-- note: to_x01 used below to prevent
|
||||
-- that 'z' a written into mem.
|
||||
ram(conv_integer(unsigned(ADDR))) := to_x01(DATA);
|
||||
end if;
|
||||
|
||||
if CE='1' and OE='1' and BE='1' and WE='0' then -- output driver
|
||||
DATA <= ram(conv_integer(unsigned(ADDR)));
|
||||
else
|
||||
DATA <= (others=>'Z');
|
||||
end if;
|
||||
|
||||
end process proc_sram;
|
||||
|
||||
end sim;
|
||||
5
rtl/bplib/micron/mt45w8mw16b.vbom
Normal file
5
rtl/bplib/micron/mt45w8mw16b.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
# components
|
||||
# design
|
||||
mt45w8mw16b.vhd
|
||||
242
rtl/bplib/micron/mt45w8mw16b.vhd
Normal file
242
rtl/bplib/micron/mt45w8mw16b.vhd
Normal file
@@ -0,0 +1,242 @@
|
||||
-- $Id: mt45w8mw16b.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: mt45w8mw16b - sim
|
||||
-- Description: Micron MT45W8MW16B CellularRAM model
|
||||
-- Currently a much simplified model
|
||||
-- - only async accesses
|
||||
-- - ignores CLK and CRE
|
||||
-- - simple model for response of DATA lines, but no
|
||||
-- check for timing violations of control lines
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-03 299 1.3.1 improved timing model (WE cycle, robust T_apa)
|
||||
-- 2010-06-03 298 1.3 add timing model again
|
||||
-- 2010-05-28 295 1.2 drop timing (was incorrect), pure functional now
|
||||
-- 2010-05-21 293 1.1 add BCR (only read of default so far)
|
||||
-- 2010-05-16 291 1.0 Initial version (inspired by is61lv25616al)
|
||||
------------------------------------------------------------------------------
|
||||
-- Truth table accoring to data sheet:
|
||||
--
|
||||
-- Asynchronous Mode (BCR(15)=1)
|
||||
-- Operation CLK ADV_N CE_N OE_N WE_N CRE xB_N WT DATA
|
||||
-- Read L L L L H L L act data-out
|
||||
-- Write L L L X L L L act data-in
|
||||
-- Standby L X H X X L X 'z' 'z'
|
||||
-- CRE write L L L H L H X act 'z'
|
||||
-- CRE read L L L L H H L act conf-out
|
||||
--
|
||||
-- Burst Mode (BCR(15)=0)
|
||||
-- Operation CLK ADV_N CE_N OE_N WE_N CRE xB_N WT DATA
|
||||
-- Async read L L L L H L L act data-out
|
||||
-- Async write L L L X L L L act data-in
|
||||
-- Standby L X H X X L X 'z' 'z'
|
||||
-- Initial burst read 0-1 L L X H L L act X
|
||||
-- Initial burst write 0-1 L L H L L X act X
|
||||
-- Burst continue 0-1 H L X X X X act data-in/out
|
||||
-- CRE write 0-1 L L H L H X act 'z'
|
||||
-- CRE read 0-1 L L L H H L act conf-out
|
||||
--
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
entity mt45w8mw16b is -- Micron MT45W8MW16B CellularRAM model
|
||||
port (
|
||||
CLK : in slbit; -- clock for synchonous operation
|
||||
CE_N : in slbit; -- chip enable (act.low)
|
||||
OE_N : in slbit; -- output enable (act.low)
|
||||
WE_N : in slbit; -- write enable (act.low)
|
||||
UB_N : in slbit; -- upper byte enable (act.low)
|
||||
LB_N : in slbit; -- lower byte enable (act.low)
|
||||
ADV_N : in slbit; -- address valid (act.low)
|
||||
CRE : in slbit; -- control register enable
|
||||
MWAIT : out slbit; -- wait (for burst read/write)
|
||||
ADDR : in slv23; -- address lines
|
||||
DATA : inout slv16 -- data lines
|
||||
);
|
||||
end mt45w8mw16b;
|
||||
|
||||
|
||||
architecture sim of mt45w8mw16b is
|
||||
|
||||
-- timing constants for -701 speed grade (70 ns; 104 MHz)
|
||||
constant T_aa : time := 70 ns; -- address access time (max)
|
||||
constant T_apa : time := 20 ns; -- page acess time (max)
|
||||
constant T_oh : time := 5 ns; -- output hold from addr change (max)
|
||||
constant T_oe : time := 20 ns; -- output enable to valid output (max)
|
||||
constant T_ohz : time := 8 ns; -- output disable to high-z output (max)
|
||||
constant T_olz : time := 3 ns; -- output enable to low-z output (min)
|
||||
constant T_lz : time := 10 ns; -- chip enable to low-z output (min)
|
||||
constant T_hz : time := 8 ns; -- chip disable to high-z output (max)
|
||||
|
||||
constant memsize : positive := 2**(ADDR'length);
|
||||
constant datzero : slv(DATA'range) := (others=>'0');
|
||||
type ram_type is array (0 to memsize-1) of slv(DATA'range);
|
||||
|
||||
constant bcr_f_mode : integer := 15; -- operating mode
|
||||
constant bcr_f_ilat : integer := 14; -- initial latency
|
||||
subtype bcr_f_lc is integer range 13 downto 11; -- latency counter
|
||||
constant bcr_f_wp : integer := 10; -- wait polarity
|
||||
constant bcr_f_wc : integer := 8; -- wait configuration
|
||||
subtype bcr_f_drive is integer range 5 downto 4; -- drive strength
|
||||
constant bcr_f_bw : integer := 3; -- burst wrap
|
||||
subtype bcr_f_bl is integer range 2 downto 0; -- burst length
|
||||
|
||||
subtype f_byte1 is integer range 15 downto 8;
|
||||
subtype f_byte0 is integer range 7 downto 0;
|
||||
|
||||
signal CE : slbit := '0';
|
||||
signal OE : slbit := '0';
|
||||
signal WE : slbit := '0';
|
||||
signal BE_L : slbit := '0';
|
||||
signal BE_U : slbit := '0';
|
||||
signal ADV : slbit := '0';
|
||||
signal WE_L_EFF : slbit := '0';
|
||||
signal WE_U_EFF : slbit := '0';
|
||||
|
||||
signal R_BCR_MODE : slbit := '1'; -- mode: def: async
|
||||
signal R_BCR_ILAT : slbit := '0'; -- ilat: def: variable
|
||||
signal R_BCR_LC : slv3 := "011"; -- lc: def: code 3
|
||||
signal R_BCR_WP : slbit := '1'; -- wp: def: active high
|
||||
signal R_BCR_WC : slbit := '1'; -- wc: def: assert one before
|
||||
signal R_BCR_DRIVE : slv2 := "01"; -- drive:def: 1/2
|
||||
signal R_BCR_BW : slbit := '1'; -- bw: def: no wrap
|
||||
signal R_BCR_BL : slv3 := "111"; -- bl: def: continuous
|
||||
|
||||
signal L_ADDR : slv23 := (others=>'0');
|
||||
signal DOUT_VAL_EN : slbit := '0';
|
||||
signal DOUT_VAL_AA : slbit := '0';
|
||||
signal DOUT_VAL_PA : slbit := '0';
|
||||
signal DOUT_VAL_OE : slbit := '0';
|
||||
signal DOUT_LZ_CE : slbit := '0';
|
||||
signal DOUT_LZ_OE : slbit := '0';
|
||||
|
||||
signal OEWE : slbit := '0';
|
||||
signal DOUT : slv16 := (others=>'0');
|
||||
begin
|
||||
|
||||
CE <= not CE_N;
|
||||
OE <= not OE_N;
|
||||
WE <= not WE_N;
|
||||
BE_L <= not LB_N;
|
||||
BE_U <= not UB_N;
|
||||
ADV <= not ADV_N;
|
||||
|
||||
WE_L_EFF <= CE and WE and BE_L;
|
||||
WE_U_EFF <= CE and WE and BE_U;
|
||||
|
||||
-- address valid logic, latch ADDR when ADV true
|
||||
proc_adv: process (ADV, ADDR)
|
||||
begin
|
||||
if ADV = '1' then
|
||||
L_ADDR <= ADDR;
|
||||
end if;
|
||||
end process proc_adv;
|
||||
|
||||
proc_dout_val: process (CE, OE, WE, BE_L, BE_U, ADV, L_ADDR)
|
||||
variable addr_last : slv23 := (others=>'1');
|
||||
begin
|
||||
if (CE'event and CE='1') or
|
||||
(BE_L'event and BE_L='1') or
|
||||
(BE_U'event and BE_U='1') or
|
||||
(WE'event and WE='0') or
|
||||
(ADV'event and ADV='1') then
|
||||
DOUT_VAL_EN <= '0', '1' after T_aa;
|
||||
end if;
|
||||
if L_ADDR'event then
|
||||
DOUT_VAL_PA <= '0', '1' after T_apa;
|
||||
if L_ADDR(22 downto 4) /= addr_last(22 downto 4) then
|
||||
DOUT_VAL_AA <= '0', '1' after T_aa;
|
||||
end if;
|
||||
addr_last := L_ADDR;
|
||||
end if;
|
||||
if OE'event and OE='1' then
|
||||
DOUT_VAL_OE <= '0', '1' after T_oe;
|
||||
end if;
|
||||
end process proc_dout_val;
|
||||
|
||||
-- to simplify things assume that OE and (not WE) have same effect on output
|
||||
-- drivers. The timing rules are very similar indeed...
|
||||
OEWE <= OE and (not WE);
|
||||
|
||||
proc_dout_lz: process (CE, OEWE)
|
||||
begin
|
||||
if (CE'event) then
|
||||
if CE = '1' then
|
||||
DOUT_LZ_CE <= '1' after T_lz;
|
||||
else
|
||||
DOUT_LZ_CE <= '0' after T_hz;
|
||||
end if;
|
||||
end if;
|
||||
if (OEwe'event) then
|
||||
if OEWE = '1' then
|
||||
DOUT_LZ_OE <= '1' after T_olz;
|
||||
else
|
||||
DOUT_LZ_OE <= '0' after T_ohz;
|
||||
end if;
|
||||
end if;
|
||||
end process proc_dout_lz;
|
||||
|
||||
proc_cram: process (CE, OE, WE, WE_L_EFF, WE_U_EFF, L_ADDR, DATA)
|
||||
variable ram : ram_type := (others=>datzero);
|
||||
begin
|
||||
|
||||
-- end of write cycle
|
||||
-- note: to_x01 used below to prevent that 'z' a written into mem.
|
||||
if WE_L_EFF'event and WE_L_EFF='0' then
|
||||
ram(conv_integer(unsigned(L_ADDR)))(f_byte0) := to_x01(DATA(f_byte0));
|
||||
end if;
|
||||
if WE_U_EFF'event and WE_U_EFF='0' then
|
||||
ram(conv_integer(unsigned(L_ADDR)))(f_byte1) := to_x01(DATA(f_byte1));
|
||||
end if;
|
||||
|
||||
DOUT <= ram(conv_integer(unsigned(L_ADDR)));
|
||||
|
||||
end process proc_cram;
|
||||
|
||||
proc_data: process (DOUT, DOUT_VAL_EN, DOUT_VAL_AA, DOUT_VAL_PA, DOUT_VAL_OE,
|
||||
DOUT_LZ_CE, DOUT_LZ_OE)
|
||||
variable idout : slv16 := (others=>'0');
|
||||
begin
|
||||
idout := DOUT;
|
||||
if DOUT_VAL_EN='0' or DOUT_VAL_AA='0' or
|
||||
DOUT_VAL_PA='0' or DOUT_VAL_OE='0' then
|
||||
idout := (others=>'X');
|
||||
end if;
|
||||
if DOUT_LZ_CE='0' or DOUT_LZ_OE='0' then
|
||||
idout := (others=>'Z');
|
||||
end if;
|
||||
DATA <= idout;
|
||||
end process proc_data;
|
||||
|
||||
proc_mwait: process (CE)
|
||||
begin
|
||||
-- WT driver (just a dummy)
|
||||
if CE = '1' then
|
||||
MWAIT <= '1';
|
||||
else
|
||||
MWAIT <= 'Z';
|
||||
end if;
|
||||
end process proc_mwait;
|
||||
|
||||
end sim;
|
||||
23
rtl/bplib/nexys2/Makefile
Normal file
23
rtl/bplib/nexys2/Makefile
Normal file
@@ -0,0 +1,23 @@
|
||||
# $Id: Makefile 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2010-05-23 293 1.0 Initial version (cloned..)
|
||||
#
|
||||
VBOM_all = $(wildcard *.vbom)
|
||||
NGC_all = $(VBOM_all:.vbom=.ngc)
|
||||
#
|
||||
ISE_PATH = xc3s1200e-fg320-4
|
||||
#
|
||||
.phony : all clean
|
||||
#
|
||||
all : $(NGC_all)
|
||||
#
|
||||
clean : ise_clean
|
||||
#
|
||||
#----
|
||||
#
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.xflow
|
||||
#
|
||||
include $(VBOM_all:.vbom=.dep_xst)
|
||||
#
|
||||
5
rtl/bplib/nexys2/n2_cram_dummy.vbom
Normal file
5
rtl/bplib/nexys2/n2_cram_dummy.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
# components
|
||||
# design
|
||||
n2_cram_dummy.vhd
|
||||
65
rtl/bplib/nexys2/n2_cram_dummy.vhd
Normal file
65
rtl/bplib/nexys2/n2_cram_dummy.vhd
Normal file
@@ -0,0 +1,65 @@
|
||||
-- $Id: n2_cram_dummy.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: n2_cram_dummy - syn
|
||||
-- Description: nexys2: CRAM protection dummy
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-28 295 1.0.1 use _ADV_N
|
||||
-- 2010-05-21 292 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
entity n2_cram_dummy is -- CRAM protection dummy
|
||||
port (
|
||||
O_MEM_CE_N : out slbit; -- cram: chip enable (act.low)
|
||||
O_MEM_BE_N : out slv2; -- cram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- cram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- cram: output enable (act.low)
|
||||
O_MEM_ADV_N : out slbit; -- cram: address valid (act.low)
|
||||
O_MEM_CLK : out slbit; -- cram: clock
|
||||
O_MEM_CRE : out slbit; -- cram: command register enable
|
||||
I_MEM_WAIT : in slbit; -- cram: mem wait
|
||||
O_FLA_CE_N : out slbit; -- flash ce.. (act.low)
|
||||
O_MEM_ADDR : out slv23; -- cram: address lines
|
||||
IO_MEM_DATA : inout slv16 -- cram: data lines
|
||||
);
|
||||
end n2_cram_dummy;
|
||||
|
||||
|
||||
architecture syn of n2_cram_dummy is
|
||||
begin
|
||||
|
||||
O_MEM_CE_N <= '1'; -- disable cram chip
|
||||
O_MEM_BE_N <= "11";
|
||||
O_MEM_WE_N <= '1';
|
||||
O_MEM_OE_N <= '1';
|
||||
O_MEM_ADV_N <= '1';
|
||||
O_MEM_CLK <= '0';
|
||||
O_MEM_CRE <= '0';
|
||||
O_FLA_CE_N <= '1';
|
||||
O_MEM_ADDR <= (others=>'0');
|
||||
IO_MEM_DATA <= (others=>'0');
|
||||
|
||||
end syn;
|
||||
9
rtl/bplib/nexys2/n2_cram_memctl_as.vbom
Normal file
9
rtl/bplib/nexys2/n2_cram_memctl_as.vbom
Normal file
@@ -0,0 +1,9 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
../../vlib/xlib/xlib.vhd
|
||||
# components
|
||||
../../vlib/xlib/iob_reg_o.vbom
|
||||
../../vlib/xlib/iob_reg_o_gen.vbom
|
||||
../../vlib/xlib/iob_reg_io_gen.vbom
|
||||
# design
|
||||
n2_cram_memctl_as.vhd
|
||||
562
rtl/bplib/nexys2/n2_cram_memctl_as.vhd
Normal file
562
rtl/bplib/nexys2/n2_cram_memctl_as.vhd
Normal file
@@ -0,0 +1,562 @@
|
||||
-- $Id: n2_cram_memctl_as.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: n2_cram_memctl_as - syn
|
||||
-- Description: nexys2: CRAM driver - async and page mode
|
||||
--
|
||||
-- Dependencies: vlib/xlib/iob_reg_o
|
||||
-- vlib/xlib/iob_reg_o_gen
|
||||
-- vlib/xlib/iob_reg_io_gen
|
||||
-- Test bench: tb/tb_n2_cram_memctl
|
||||
-- fw_gen/tst_sram/nexys2/tb/tb_tst_sram_n2
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2010-06-03 299 11.4 L68 xc3s1200e-4 91 100 0 96 s 6.7
|
||||
-- 2010-05-24 294 11.4 L68 xc3s1200e-4 91 99 0 95 s 6.7
|
||||
-- 2010-05-23 293 11.4 L68 xc3s1200e-4 91 139 0 99 s 6.7
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-03 299 1.0.3 add "KEEP" for data iob; MEM_OE='1' on first read
|
||||
-- cycle;
|
||||
-- 2010-05-30 297 1.0.2 use READ(0|1)DELAY generic
|
||||
-- 2010-05-24 294 1.0.1 more compact n.memdi logic; extra wait in s_rdwait1
|
||||
-- 2010-05-23 293 1.0 Initial version
|
||||
--
|
||||
-- Notes:
|
||||
-- 1. READ1DELAY of 2 is needed even though the timing of the memory suggests
|
||||
-- that 1 cycle is enough (T_apa is 20 ns, so 40 ns round trip is ok). A
|
||||
-- short READ1 delay works in sim, but not on fpga where the data od the
|
||||
-- ADDR(0)=0 cycle is re-read (see notes_tst_sram_n2.txt).
|
||||
-- tb_n2_cram_memctl_as_ISim_tsim works with full sdf even when T_apa is
|
||||
-- 40ns or 50 ns, only T_apa 60 ns fails !
|
||||
-- Unclear what is wrong here, the timing of the memory model seems ok.
|
||||
-- 2. There is no 'bus-turn-around' cycle needed for a write->read change
|
||||
-- FPGA_OE goes 1->0 and MEM_OE goes 0->1 on the s_wrput1->s_rdinit
|
||||
-- transition simultaneously. The FPGA will go high-Z quickly, the memory
|
||||
-- low-Z delay by the IOB and internal memory delays. No clash.
|
||||
-- 3. There is a hidden 'bus-turn-around' cycle for a read->write change.
|
||||
-- MEM_OE goes 1->0 on s_rdget1->s_wrinit and the memory will go high-z with
|
||||
-- some dekal. FPGA_OE goes 0->1 in the next cycle at s_wrinit->s_wrwait0.
|
||||
-- Again no clash due to the 1 cycle delay.
|
||||
--
|
||||
-- Timing of some signals:
|
||||
--
|
||||
-- single read request:
|
||||
--
|
||||
-- state |_idle |_rdinit|_rdwt0 |_rdwt0 |_rdget0|_rdwt1 |_rdget1|
|
||||
-- 0 20 40 60 80 100 120
|
||||
-- CLK __|^^^|___|^^^|___|^^^|___|^^^|___|^^^|___|^^^|___|^^^|___|^^^|___|
|
||||
--
|
||||
-- REQ _______|^^^^^|_____________________________________________
|
||||
-- WE ___________________________________________________________
|
||||
--
|
||||
-- IOB_CE __________|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|_
|
||||
-- IOB_OE _________|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|_
|
||||
--
|
||||
-- DO oooooooooooooooooooooooooooooooooooooooooo|lllllll|lllllll|h
|
||||
-- BUSY __________|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|________________
|
||||
-- ACK_R ___________________________________________________________|^^^^^^^|_
|
||||
--
|
||||
-- single write request:
|
||||
--
|
||||
-- state |_idle |_wrinit|_wrwt0 |_wrwt0 |_wrwt0 |_wrput0|_idle |
|
||||
-- 0 20 40 60 80 100 120
|
||||
-- CLK __|^^^|___|^^^|___|^^^|___|^^^|___|^^^|___|^^^|___|^^^|___|^^^|___|
|
||||
--
|
||||
-- REQ _______|^^^^^|______________________________________
|
||||
-- WE _______|^^^^^|______________________________________
|
||||
--
|
||||
-- IOB_CE __________|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|_
|
||||
-- IOB_BE __________|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|_
|
||||
-- IOB_OE ____________________________________________________
|
||||
-- IOB_WE ______________|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|_____
|
||||
--
|
||||
-- BUSY __________|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|_________
|
||||
-- ACK_W __________________________________________|^^^^^^^|_
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.xlib.all;
|
||||
|
||||
entity n2_cram_memctl_as is -- CRAM driver (async+page mode)
|
||||
generic (
|
||||
READ0DELAY : positive := 2; -- read word 0 delay in clock cycles
|
||||
READ1DELAY : positive := 2; -- read word 1 delay in clock cycles
|
||||
WRITEDELAY : positive := 3); -- write delay in clock cycles
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
REQ : in slbit; -- request
|
||||
WE : in slbit; -- write enable
|
||||
BUSY : out slbit; -- controller busy
|
||||
ACK_R : out slbit; -- acknowledge read
|
||||
ACK_W : out slbit; -- acknowledge write
|
||||
ACT_R : out slbit; -- signal active read
|
||||
ACT_W : out slbit; -- signal active write
|
||||
ADDR : in slv22; -- address (32 bit word address)
|
||||
BE : in slv4; -- byte enable
|
||||
DI : in slv32; -- data in (memory view)
|
||||
DO : out slv32; -- data out (memory view)
|
||||
O_MEM_CE_N : out slbit; -- cram: chip enable (act.low)
|
||||
O_MEM_BE_N : out slv2; -- cram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- cram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- cram: output enable (act.low)
|
||||
O_MEM_ADV_N : out slbit; -- cram: address valid (act.low)
|
||||
O_MEM_CLK : out slbit; -- cram: clock
|
||||
O_MEM_CRE : out slbit; -- cram: command register enable
|
||||
I_MEM_WAIT : in slbit; -- cram: mem wait
|
||||
O_FLA_CE_N : out slbit; -- flash ce.. (act.low)
|
||||
O_MEM_ADDR : out slv23; -- cram: address lines
|
||||
IO_MEM_DATA : inout slv16 -- cram: data lines
|
||||
);
|
||||
end n2_cram_memctl_as;
|
||||
|
||||
|
||||
architecture syn of n2_cram_memctl_as is
|
||||
|
||||
type state_type is (
|
||||
s_idle, -- s_idle: wait for req
|
||||
s_rdinit, -- s_rdinit: read init cycle
|
||||
s_rdwait0, -- s_rdwait0: read wait low word
|
||||
s_rdget0, -- s_rdget0: read get low word
|
||||
s_rdwait1, -- s_rdwait1: read wait high word
|
||||
s_rdget1, -- s_rdget1: read get high word
|
||||
s_wrinit, -- s_wrinit: write init cycle
|
||||
s_wrwait0, -- s_rdwait0: write wait 1st word
|
||||
s_wrput0, -- s_rdput0: write put 1st word
|
||||
s_wrini1, -- s_wrini1: write init 2nd word
|
||||
s_wrwait1, -- s_wrwait1: write wait 2nd word
|
||||
s_wrput1 -- s_wrput1: write put 2nd word
|
||||
);
|
||||
|
||||
type regs_type is record
|
||||
state : state_type; -- state
|
||||
ackr : slbit; -- signal ack_r
|
||||
addr0 : slbit; -- current addr0
|
||||
be2nd : slv2; -- be's of 2nd write cycle
|
||||
cntdly : slv2; -- wait delay counter
|
||||
cntce : slv7; -- ce counter
|
||||
fidle : slbit; -- force idle flag
|
||||
memdo0 : slv16; -- mem data out, low word
|
||||
memdi : slv32; -- mem data in
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
s_idle, --
|
||||
'0', -- ackr
|
||||
'0', -- addr0
|
||||
"00", -- be2nd
|
||||
(others=>'0'), -- cntdly
|
||||
(others=>'0'), -- cntce
|
||||
'0', -- fidle
|
||||
(others=>'0'), -- memdo0
|
||||
(others=>'0') -- memdi
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init; -- state registers
|
||||
signal N_REGS : regs_type := regs_init; -- next value state regs
|
||||
|
||||
signal CLK_180 : slbit := '0';
|
||||
signal MEM_CE_N : slbit := '1';
|
||||
signal MEM_BE_N : slv2 := "11";
|
||||
signal MEM_WE_N : slbit := '1';
|
||||
signal MEM_OE_N : slbit := '1';
|
||||
signal BE_CE : slbit := '0';
|
||||
signal ADDRH_CE : slbit := '0';
|
||||
signal ADDR0_CE : slbit := '0';
|
||||
signal ADDR0 : slbit := '0';
|
||||
signal DATA_CEI : slbit := '0';
|
||||
signal DATA_CEO : slbit := '0';
|
||||
signal DATA_OE : slbit := '0';
|
||||
signal MEM_DO : slv16 := (others=>'0');
|
||||
signal MEM_DI : slv16 := (others=>'0');
|
||||
|
||||
-- these attributes aren't accepted by ghdl 0.26
|
||||
-- attribute s : string;
|
||||
-- attribute s of I_MEM_WAIT : signal is "true";
|
||||
|
||||
begin
|
||||
|
||||
CLK_180 <= not CLK;
|
||||
|
||||
IOB_MEM_CE : iob_reg_o
|
||||
generic map (
|
||||
INIT => '1')
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE => '1',
|
||||
DO => MEM_CE_N,
|
||||
PAD => O_MEM_CE_N
|
||||
);
|
||||
|
||||
IOB_MEM_BE : iob_reg_o_gen
|
||||
generic map (
|
||||
DWIDTH => 2,
|
||||
INIT => '1')
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE => BE_CE,
|
||||
DO => MEM_BE_N,
|
||||
PAD => O_MEM_BE_N
|
||||
);
|
||||
|
||||
IOB_MEM_WE : iob_reg_o
|
||||
generic map (
|
||||
INIT => '1')
|
||||
port map (
|
||||
CLK => CLK_180,
|
||||
CE => '1',
|
||||
DO => MEM_WE_N,
|
||||
PAD => O_MEM_WE_N
|
||||
);
|
||||
|
||||
IOB_MEM_OE : iob_reg_o
|
||||
generic map (
|
||||
INIT => '1')
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE => '1',
|
||||
DO => MEM_OE_N,
|
||||
PAD => O_MEM_OE_N
|
||||
);
|
||||
|
||||
IOB_MEM_ADDRH : iob_reg_o_gen
|
||||
generic map (
|
||||
DWIDTH => 22)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE => ADDRH_CE,
|
||||
DO => ADDR,
|
||||
PAD => O_MEM_ADDR(22 downto 1)
|
||||
);
|
||||
|
||||
IOB_MEM_ADDR0 : iob_reg_o
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE => ADDR0_CE,
|
||||
DO => ADDR0,
|
||||
PAD => O_MEM_ADDR(0)
|
||||
);
|
||||
|
||||
IOB_MEM_DATA : iob_reg_io_gen
|
||||
generic map (
|
||||
DWIDTH => 16,
|
||||
PULL => "KEEP")
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CEI => DATA_CEI,
|
||||
CEO => DATA_CEO,
|
||||
OE => DATA_OE,
|
||||
DI => MEM_DO,
|
||||
DO => MEM_DI,
|
||||
PAD => IO_MEM_DATA
|
||||
);
|
||||
|
||||
O_MEM_ADV_N <= '0';
|
||||
O_MEM_CLK <= '0';
|
||||
O_MEM_CRE <= '0';
|
||||
O_FLA_CE_N <= '1';
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
|
||||
if CLK'event and CLK='1' then
|
||||
if RESET = '1' then
|
||||
R_REGS <= regs_init;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
end process proc_regs;
|
||||
|
||||
proc_next: process (R_REGS, REQ, WE, BE, DI, MEM_DO)
|
||||
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable ibusy : slbit := '0';
|
||||
variable iackw : slbit := '0';
|
||||
variable iactr : slbit := '0';
|
||||
variable iactw : slbit := '0';
|
||||
variable imem_ce : slbit := '0';
|
||||
variable imem_be : slv2 := "00";
|
||||
variable imem_we : slbit := '0';
|
||||
variable imem_oe : slbit := '0';
|
||||
variable ibe_ce : slbit := '0';
|
||||
variable iaddrh_ce : slbit := '0';
|
||||
variable iaddr0_ce : slbit := '0';
|
||||
variable iaddr0 : slbit := '0';
|
||||
variable idata_cei : slbit := '0';
|
||||
variable idata_ceo : slbit := '0';
|
||||
variable idata_oe : slbit := '0';
|
||||
|
||||
procedure do_dispatch(nstate : out state_type;
|
||||
iaddrh_ce : out slbit;
|
||||
iaddr0_ce : out slbit;
|
||||
iaddr0 : out slbit;
|
||||
ibe_ce : out slbit;
|
||||
imem_be : out slv2;
|
||||
imem_ce : out slbit;
|
||||
imem_oe : out slbit;
|
||||
nbe2nd : out slv2) is
|
||||
begin
|
||||
iaddrh_ce := '1'; -- latch address (high part)
|
||||
iaddr0_ce := '1'; -- latch address 0 bit
|
||||
ibe_ce := '1'; -- latch be's
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
nbe2nd := "00"; -- assume no 2nd write cycle
|
||||
if WE = '0' then -- if READ requested
|
||||
iaddr0 := '0'; -- go first for low word
|
||||
imem_be := "11"; -- on read always on
|
||||
imem_oe := '1'; -- oe CRAM next cycle
|
||||
nstate := s_rdinit; -- next: read init part
|
||||
else -- if WRITE requested
|
||||
if BE(1 downto 0) /= "00" then -- low word write
|
||||
iaddr0 := '0'; -- access word 0
|
||||
imem_be := BE(1 downto 0); -- set be's for 1st cycle
|
||||
nbe2nd := BE(3 downto 2); -- keep be's for 2nd cycle
|
||||
else -- high word write
|
||||
iaddr0 := '1'; -- access word 1
|
||||
imem_be := BE(3 downto 2); -- set be's for 1st cycle
|
||||
end if;
|
||||
nstate := s_wrinit; -- next: write init part
|
||||
end if;
|
||||
end procedure do_dispatch;
|
||||
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
n.ackr := '0';
|
||||
|
||||
ibusy := '0';
|
||||
iackw := '0';
|
||||
iactr := '0';
|
||||
iactw := '0';
|
||||
|
||||
imem_ce := '0';
|
||||
imem_be := "11";
|
||||
imem_we := '0';
|
||||
imem_oe := '0';
|
||||
ibe_ce := '0';
|
||||
iaddrh_ce := '0';
|
||||
iaddr0_ce := '0';
|
||||
iaddr0 := '0';
|
||||
idata_cei := '0';
|
||||
idata_ceo := '0';
|
||||
idata_oe := '0';
|
||||
|
||||
if unsigned(r.cntdly) /= 0 then
|
||||
n.cntdly := unsigned(r.cntdly) - 1;
|
||||
end if;
|
||||
|
||||
case r.state is
|
||||
when s_idle => -- s_idle: wait for req
|
||||
if REQ = '1' then -- if IO requested
|
||||
do_dispatch(n.state, iaddrh_ce, iaddr0_ce, iaddr0,
|
||||
ibe_ce, imem_be, imem_ce, imem_oe, n.be2nd);
|
||||
end if;
|
||||
|
||||
when s_rdinit => -- s_rdinit: read init cycle
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactr := '1'; -- signal mem read
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
imem_oe := '1'; -- oe CRAM next cycle
|
||||
n.cntdly:= conv_std_logic_vector(READ0DELAY-1, n.cntdly'length);
|
||||
n.state := s_rdwait0; -- next: wait
|
||||
|
||||
when s_rdwait0 => -- s_rdwait0: read wait low word
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactr := '1'; -- signal mem read
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
imem_oe := '1'; -- oe CRAM next cycle
|
||||
if unsigned(r.cntdly) = 0 then -- wait expired ?
|
||||
n.state := s_rdget0; -- next: get low word
|
||||
end if;
|
||||
|
||||
when s_rdget0 => -- s_rdget0: read get low word
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactr := '1'; -- signal mem read
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
imem_oe := '1'; -- oe CRAM next cycle
|
||||
idata_cei := '1'; -- latch input data
|
||||
iaddr0_ce := '1'; -- latch address 0 bit
|
||||
iaddr0 := '1'; -- now go for high word
|
||||
n.cntdly:= conv_std_logic_vector(READ1DELAY-1, n.cntdly'length);
|
||||
n.state := s_rdwait1; -- next: wait high word
|
||||
|
||||
when s_rdwait1 => -- s_rdwait1: read wait high word
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactr := '1'; -- signal mem read
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
imem_oe := '1'; -- oe CRAM next cycle
|
||||
if unsigned(r.cntdly) = 0 then -- wait expired ?
|
||||
n.state := s_rdget1; -- next: get low word
|
||||
end if; --
|
||||
|
||||
when s_rdget1 => -- s_rdget1: read get high word
|
||||
iactr := '1'; -- signal mem read
|
||||
n.memdo0:= MEM_DO; -- save low word data
|
||||
idata_cei := '1'; -- latch input data
|
||||
n.ackr := '1'; -- ACK_R next cycle
|
||||
n.state := s_idle; -- next: wait next request
|
||||
if r.fidle = '1' then -- forced idle cycle
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
else
|
||||
if REQ = '1' then -- if IO requested
|
||||
do_dispatch(n.state, iaddrh_ce, iaddr0_ce, iaddr0,
|
||||
ibe_ce, imem_be, imem_ce, imem_oe, n.be2nd);
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when s_wrinit => -- s_wrinit: write init cycle
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactw := '1'; -- signal mem write
|
||||
iackw := '1'; -- signal write done (all latched)
|
||||
idata_ceo:= '1'; -- latch output data
|
||||
idata_oe := '1'; -- oe FPGA next cycle
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
imem_we := '1'; -- we CRAM in half cycle
|
||||
n.cntdly:= conv_std_logic_vector(WRITEDELAY-1, n.cntdly'length);
|
||||
n.state := s_wrwait0; -- next: wait
|
||||
|
||||
when s_wrwait0 => -- s_rdput0: write wait 1st word
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactw := '1'; -- signal mem write
|
||||
idata_oe := '1'; -- oe FPGA next cycle
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
imem_we := '1'; -- we CRAM next cycle
|
||||
if unsigned(r.cntdly) = 0 then -- wait expired ?
|
||||
n.state := s_wrput0; -- next: put 1st word
|
||||
end if;
|
||||
|
||||
when s_wrput0 => -- s_rdput0: write put 1st word
|
||||
iactw := '1'; -- signal mem write
|
||||
imem_we := '0'; -- deassert we CRAM in half cycle
|
||||
if r.be2nd /= "00" then
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
iaddr0_ce := '1'; -- latch address 0 bit
|
||||
iaddr0 := '1'; -- now go for high word
|
||||
ibe_ce := '1'; -- latch be's
|
||||
imem_be := r.be2nd; -- now be's of high word
|
||||
n.state := s_wrini1; -- next: start 2nd write
|
||||
else
|
||||
n.state := s_idle; -- next: wait next request
|
||||
if r.fidle = '1' then -- forced idle cycle
|
||||
ibusy := '1'; -- signal busy
|
||||
else
|
||||
if REQ = '1' then -- if IO requested
|
||||
do_dispatch(n.state, iaddrh_ce, iaddr0_ce, iaddr0,
|
||||
ibe_ce, imem_be, imem_ce, imem_oe, n.be2nd);
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when s_wrini1 => -- s_wrini1: write init 2nd word
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactw := '1'; -- signal mem write
|
||||
idata_ceo:= '1'; -- latch output data
|
||||
idata_oe := '1'; -- oe FPGA next cycle
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
imem_we := '1'; -- we CRAM in half cycle
|
||||
n.cntdly:= conv_std_logic_vector(WRITEDELAY-1, n.cntdly'length);
|
||||
n.state := s_wrwait1; -- next: wait
|
||||
|
||||
when s_wrwait1 => -- s_wrwait1: write wait 2nd word
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactw := '1'; -- signal mem write
|
||||
idata_oe := '1'; -- oe FPGA next cycle
|
||||
imem_ce := '1'; -- ce CRAM next cycle
|
||||
imem_we := '1'; -- we CRAM next cycle
|
||||
if unsigned(r.cntdly) = 0 then -- wait expired ?
|
||||
n.state := s_wrput1; -- next: put 2nd word
|
||||
end if;
|
||||
|
||||
when s_wrput1 => -- s_wrput1: write put 2nd word
|
||||
iactw := '1'; -- signal mem write
|
||||
imem_we := '0'; -- deassert we CRAM in half cycle
|
||||
n.state := s_idle; -- next: wait next request
|
||||
if r.fidle = '1' then -- forced idle cycle
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
else
|
||||
if REQ = '1' then -- if IO requested
|
||||
do_dispatch(n.state, iaddrh_ce, iaddr0_ce, iaddr0,
|
||||
ibe_ce, imem_be, imem_ce, imem_oe, n.be2nd);
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
if imem_ce = '0' then -- if cmem not active
|
||||
n.cntce := (others=>'0'); -- clear counter
|
||||
n.fidle := '0'; -- clear force idle flag
|
||||
else -- if cmem active
|
||||
if unsigned(r.cntce) >= 127 then -- if max ce count expired
|
||||
n.fidle := '1'; -- set forced idle flag
|
||||
else -- if max ce count not yet reached
|
||||
n.cntce := unsigned(r.cntce) + 1; -- increment counter
|
||||
end if;
|
||||
end if;
|
||||
|
||||
if iaddrh_ce = '1' then -- if addresses are latched
|
||||
n.memdi := DI; -- latch data too...
|
||||
end if;
|
||||
|
||||
if iaddr0_ce = '1' then -- if address bit 0 changed
|
||||
n.addr0 := iaddr0; -- mirror it in state regs
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
MEM_CE_N <= not imem_ce;
|
||||
MEM_WE_N <= not imem_we;
|
||||
MEM_BE_N <= not imem_be;
|
||||
MEM_OE_N <= not imem_oe;
|
||||
|
||||
if r.addr0 = '0' then
|
||||
MEM_DI <= r.memdi(15 downto 0);
|
||||
else
|
||||
MEM_DI <= r.memdi(31 downto 16);
|
||||
end if;
|
||||
|
||||
BE_CE <= ibe_ce;
|
||||
ADDRH_CE <= iaddrh_ce;
|
||||
ADDR0_CE <= iaddr0_ce;
|
||||
ADDR0 <= iaddr0;
|
||||
DATA_CEI <= idata_cei;
|
||||
DATA_CEO <= idata_ceo;
|
||||
DATA_OE <= idata_oe;
|
||||
|
||||
BUSY <= ibusy;
|
||||
ACK_R <= r.ackr;
|
||||
ACK_W <= iackw;
|
||||
ACT_R <= iactr;
|
||||
ACT_W <= iactw;
|
||||
|
||||
DO <= MEM_DO & r.memdo0;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
end syn;
|
||||
123
rtl/bplib/nexys2/nexys2_pins.ucf
Normal file
123
rtl/bplib/nexys2/nexys2_pins.ucf
Normal file
@@ -0,0 +1,123 @@
|
||||
## $Id: nexys2_pins.ucf 311 2010-06-30 17:52:37Z mueller $
|
||||
##
|
||||
## Pin locks for Nexys 2 core functionality (for 1200k FPGA)
|
||||
## internal RS232
|
||||
## human I/O (switches, buttons, leds, display)
|
||||
## cram
|
||||
##
|
||||
## Revision History:
|
||||
## Date Rev Version Comment
|
||||
## 2010-05-23 294 1.0.1 use ADV_N rather ADV
|
||||
## 2010-05-16 291 1.0 Initial version
|
||||
##
|
||||
## Note: default is DRIVE=12 | SLEW=SLOW
|
||||
##
|
||||
## clocks --------------------------------------------------------------------
|
||||
NET "CLK" LOC = "b8" | IOSTANDARD=LVCMOS33;
|
||||
##
|
||||
## RS232 interface -----------------------------------------------------------
|
||||
NET "I_RXD" LOC = "u6" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_TXD" LOC = "p9" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=SLOW;
|
||||
##
|
||||
## switches and buttons ------------------------------------------------------
|
||||
NET "I_SWI<0>" LOC = "g18" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<1>" LOC = "h18" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<2>" LOC = "k18" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<3>" LOC = "k17" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<4>" LOC = "l14" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<5>" LOC = "l13" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<6>" LOC = "n17" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<7>" LOC = "r17" | IOSTANDARD=LVCMOS33;
|
||||
##
|
||||
NET "I_BTN<0>" LOC = "b18" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_BTN<1>" LOC = "d18" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_BTN<2>" LOC = "e18" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_BTN<3>" LOC = "h13" | IOSTANDARD=LVCMOS33;
|
||||
##
|
||||
## LEDs ----------------------------------------------------------------------
|
||||
NET "O_LED<0>" LOC = "j14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<1>" LOC = "j15" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<2>" LOC = "k15" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<3>" LOC = "k14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<4>" LOC = "e16" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<5>" LOC = "p16" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<6>" LOC = "e4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<7>" LOC = "p4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<*>" DRIVE=12 | SLEW=SLOW;
|
||||
##
|
||||
## 7 segment display ---------------------------------------------------------
|
||||
NET "O_ANO_N<0>" LOC = "f17" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_ANO_N<1>" LOC = "h17" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_ANO_N<2>" LOC = "c18" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_ANO_N<3>" LOC = "f15" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_ANO_N<*>" DRIVE=12 | SLEW=SLOW;
|
||||
##
|
||||
NET "O_SEG_N<0>" LOC = "l18" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<1>" LOC = "f18" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<2>" LOC = "d17" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<3>" LOC = "d16" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<4>" LOC = "g14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<5>" LOC = "j17" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<6>" LOC = "h14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<7>" LOC = "c17" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<*>" DRIVE=12 | SLEW=SLOW;
|
||||
##
|
||||
## CRAM ----------------------------------------------------------------------
|
||||
NET "O_MEM_CE_N" LOC = "r6" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=FAST;
|
||||
NET "O_MEM_WE_N" LOC = "n7" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=FAST;
|
||||
NET "O_MEM_OE_N" LOC = "t2" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=FAST;
|
||||
##
|
||||
NET "O_MEM_BE_N<0>" LOC = "k5" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_BE_N<1>" LOC = "k4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_BE_N<*>" DRIVE=12 | SLEW=FAST;
|
||||
##
|
||||
NET "O_MEM_ADV_N" LOC = "j4" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=FAST;
|
||||
NET "O_MEM_CLK" LOC = "h5" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=FAST;
|
||||
NET "O_MEM_CRE" LOC = "p7" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=FAST;
|
||||
NET "I_MEM_WAIT" LOC = "f5" | IOSTANDARD=LVCMOS33 | PULLDOWN;
|
||||
##
|
||||
NET "O_FLA_CE_N" LOC = "r5" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=FAST;
|
||||
##
|
||||
NET "O_MEM_ADDR<0>" LOC = "j1" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<1>" LOC = "j2" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<2>" LOC = "h4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<3>" LOC = "h1" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<4>" LOC = "h2" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<5>" LOC = "j5" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<6>" LOC = "h3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<7>" LOC = "h6" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<8>" LOC = "f1" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<9>" LOC = "g3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<10>" LOC = "g6" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<11>" LOC = "g5" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<12>" LOC = "g4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<13>" LOC = "f2" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<14>" LOC = "e1" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<15>" LOC = "m5" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<16>" LOC = "e2" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<17>" LOC = "c2" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<18>" LOC = "c1" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<19>" LOC = "d2" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<20>" LOC = "k3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<21>" LOC = "d1" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<22>" LOC = "k6" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<*>" DRIVE=6 | SLEW=FAST;
|
||||
##
|
||||
NET "IO_MEM_DATA<0>" LOC = "l1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<1>" LOC = "l4" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<2>" LOC = "l6" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<3>" LOC = "m4" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<4>" LOC = "n5" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<5>" LOC = "p1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<6>" LOC = "p2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<7>" LOC = "r2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<8>" LOC = "l3" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<9>" LOC = "l5" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<10>" LOC = "m3" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<11>" LOC = "m6" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<12>" LOC = "l2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<13>" LOC = "n4" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<14>" LOC = "r3" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<15>" LOC = "t1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<*>" DRIVE=6 | SLEW=SLOW | KEEPER;
|
||||
##
|
||||
12
rtl/bplib/nexys2/nexys2_pins_pmb0_rs232.ucf
Normal file
12
rtl/bplib/nexys2/nexys2_pins_pmb0_rs232.ucf
Normal file
@@ -0,0 +1,12 @@
|
||||
## $Id: nexys2_pins_pmb0_rs232.ucf 311 2010-06-30 17:52:37Z mueller $
|
||||
##
|
||||
## Revision History:
|
||||
## Date Rev Version Comment
|
||||
## 2010-05-28 295 1.0 Initial version
|
||||
##
|
||||
## Pmod connector B top / usage RS232 for FTDI USB serport -------------------
|
||||
##
|
||||
NET "O_FUSP_RTS_N" LOC = "m13" | IOSTANDARD=LVCMOS33 | DRIVE=4 | SLEW=SLOW;
|
||||
NET "I_FUSP_CTS_N" LOC = "r18" | IOSTANDARD=LVCMOS33 | PULLDOWN;
|
||||
NET "I_FUSP_RXD" LOC = "r15" | IOSTANDARD=LVCMOS33 | PULLUP;
|
||||
NET "O_FUSP_TXD" LOC = "t17" | IOSTANDARD=LVCMOS33 | DRIVE=4 | SLEW=SLOW;
|
||||
136
rtl/bplib/nexys2/nexys2lib.vhd
Normal file
136
rtl/bplib/nexys2/nexys2lib.vhd
Normal file
@@ -0,0 +1,136 @@
|
||||
-- $Id: nexys2lib.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Package Name: nexys2lib
|
||||
-- Description: Nexys 2 components
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-28 295 1.0.3 use _ADV_N also for n2_cram_dummy
|
||||
-- 2010-05-23 294 1.0.2 add n2_cram_dummy;
|
||||
-- 2010-05-23 293 1.0.1 use _ADV_N rather _ADV; add generic for memctl
|
||||
-- 2010-05-21 292 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
package nexys2lib is
|
||||
|
||||
component nexys2_aif is -- NEXYS 2, abstract iface, base
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
I_RXD : in slbit; -- receive data (board view)
|
||||
O_TXD : out slbit; -- transmit data (board view)
|
||||
I_SWI : in slv8; -- s3 switches
|
||||
I_BTN : in slv4; -- s3 buttons
|
||||
O_LED : out slv8; -- s3 leds
|
||||
O_ANO_N : out slv4; -- 7 segment disp: anodes (act.low)
|
||||
O_SEG_N : out slv8; -- 7 segment disp: segments (act.low)
|
||||
O_MEM_CE_N : out slbit; -- cram: chip enable (act.low)
|
||||
O_MEM_BE_N : out slv2; -- cram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- cram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- cram: output enable (act.low)
|
||||
O_MEM_ADV_N : out slbit; -- cram: address valid (act.low)
|
||||
O_MEM_CLK : out slbit; -- cram: clock
|
||||
O_MEM_CRE : out slbit; -- cram: command register enable
|
||||
I_MEM_WAIT : in slbit; -- cram: mem wait
|
||||
O_FLA_CE_N : out slbit; -- flash ce.. (act.low)
|
||||
O_MEM_ADDR : out slv23; -- cram: address lines
|
||||
IO_MEM_DATA : inout slv16 -- cram: data lines
|
||||
);
|
||||
end component;
|
||||
|
||||
component nexys2_fusp_aif is -- NEXYS 2, abstract iface, base+fusp
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
I_RXD : in slbit; -- receive data (board view)
|
||||
O_TXD : out slbit; -- transmit data (board view)
|
||||
I_SWI : in slv8; -- s3 switches
|
||||
I_BTN : in slv4; -- s3 buttons
|
||||
O_LED : out slv8; -- s3 leds
|
||||
O_ANO_N : out slv4; -- 7 segment disp: anodes (act.low)
|
||||
O_SEG_N : out slv8; -- 7 segment disp: segments (act.low)
|
||||
O_MEM_CE_N : out slbit; -- cram: chip enable (act.low)
|
||||
O_MEM_BE_N : out slv2; -- cram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- cram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- cram: output enable (act.low)
|
||||
O_MEM_ADV_N : out slbit; -- cram: address valid (act.low)
|
||||
O_MEM_CLK : out slbit; -- cram: clock
|
||||
O_MEM_CRE : out slbit; -- cram: command register enable
|
||||
I_MEM_WAIT : in slbit; -- cram: mem wait
|
||||
O_FLA_CE_N : out slbit; -- flash ce.. (act.low)
|
||||
O_MEM_ADDR : out slv23; -- cram: address lines
|
||||
IO_MEM_DATA : inout slv16; -- cram: data lines
|
||||
O_FUSP_RTS_N : out slbit; -- fusp: rs232 rts_n
|
||||
I_FUSP_CTS_N : in slbit; -- fusp: rs232 cts_n
|
||||
I_FUSP_RXD : in slbit; -- fusp: rs232 rx
|
||||
O_FUSP_TXD : out slbit -- fusp: rs232 tx
|
||||
);
|
||||
end component;
|
||||
|
||||
component n2_cram_dummy is -- CRAM protection dummy
|
||||
port (
|
||||
O_MEM_CE_N : out slbit; -- cram: chip enable (act.low)
|
||||
O_MEM_BE_N : out slv2; -- cram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- cram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- cram: output enable (act.low)
|
||||
O_MEM_ADV_N : out slbit; -- cram: address valid (act.low)
|
||||
O_MEM_CLK : out slbit; -- cram: clock
|
||||
O_MEM_CRE : out slbit; -- cram: command register enable
|
||||
I_MEM_WAIT : in slbit; -- cram: mem wait
|
||||
O_FLA_CE_N : out slbit; -- flash ce.. (act.low)
|
||||
O_MEM_ADDR : out slv23; -- cram: address lines
|
||||
IO_MEM_DATA : inout slv16 -- cram: data lines
|
||||
);
|
||||
end component;
|
||||
|
||||
component n2_cram_memctl_as is -- CRAM driver (async+page mode)
|
||||
generic (
|
||||
READ0DELAY : positive := 2; -- read word 0 delay in clock cycles
|
||||
READ1DELAY : positive := 2; -- read word 1 delay in clock cycles
|
||||
WRITEDELAY : positive := 3); -- write delay in clock cycles
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
REQ : in slbit; -- request
|
||||
WE : in slbit; -- write enable
|
||||
BUSY : out slbit; -- controller busy
|
||||
ACK_R : out slbit; -- acknowledge read
|
||||
ACK_W : out slbit; -- acknowledge write
|
||||
ACT_R : out slbit; -- signal active read
|
||||
ACT_W : out slbit; -- signal active write
|
||||
ADDR : in slv22; -- address (32 bit word address)
|
||||
BE : in slv4; -- byte enable
|
||||
DI : in slv32; -- data in (memory view)
|
||||
DO : out slv32; -- data out (memory view)
|
||||
O_MEM_CE_N : out slbit; -- cram: chip enable (act.low)
|
||||
O_MEM_BE_N : out slv2; -- cram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- cram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- cram: output enable (act.low)
|
||||
O_MEM_ADV_N : out slbit; -- cram: address valid (act.low)
|
||||
O_MEM_CLK : out slbit; -- cram: clock
|
||||
O_MEM_CRE : out slbit; -- cram: command register enable
|
||||
I_MEM_WAIT : in slbit; -- cram: mem wait
|
||||
O_FLA_CE_N : out slbit; -- flash ce.. (act.low)
|
||||
O_MEM_ADDR : out slv23; -- cram: address lines
|
||||
IO_MEM_DATA : inout slv16 -- cram: data lines
|
||||
);
|
||||
end component;
|
||||
|
||||
end nexys2lib;
|
||||
7
rtl/bplib/nexys2/tb/.cvsignore
Normal file
7
rtl/bplib/nexys2/tb/.cvsignore
Normal file
@@ -0,0 +1,7 @@
|
||||
tb_nexys2_dummy
|
||||
tb_nexys2_fusp_dummy
|
||||
tb_n2_cram_memctl_as
|
||||
tb_n2_cram_memctl_as_[sft]sim
|
||||
tb_n2_cram_memctl_as_ISim
|
||||
tb_n2_cram_memctl_as_ISim_[sft]sim
|
||||
tb_n2_cram_memctl_stim
|
||||
33
rtl/bplib/nexys2/tb/Makefile
Normal file
33
rtl/bplib/nexys2/tb/Makefile
Normal file
@@ -0,0 +1,33 @@
|
||||
# $Id: Makefile 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2010-05-30 297 1.0.2 use tb_n2_cram_memctl_as now
|
||||
# 2010-05-28 295 1.0.1 add tb_.._dummy's
|
||||
# 2007-09-23 84 1.0 Initial version
|
||||
#
|
||||
EXE_all = tb_nexys2_dummy tb_nexys2_fusp_dummy tb_n2_cram_memctl_as
|
||||
#
|
||||
ISE_PATH = xc3s1200e-fg320-4
|
||||
#
|
||||
.phony : all all_ssim all_tsim clean
|
||||
#
|
||||
all : $(EXE_all)
|
||||
all_ssim : $(EXE_all:=_ssim)
|
||||
all_tsim : $(EXE_all:=_tsim)
|
||||
#
|
||||
clean : ise_clean ghdl_clean isim_clean
|
||||
#
|
||||
#-----
|
||||
#
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.ghdl
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.isim
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.xflow
|
||||
#
|
||||
VBOM_all = $(wildcard *.vbom)
|
||||
#
|
||||
include $(VBOM_all:.vbom=.dep_xst)
|
||||
include $(VBOM_all:.vbom=.dep_ghdl)
|
||||
include $(VBOM_all:.vbom=.dep_isim)
|
||||
include $(wildcard *.o.dep_ghdl)
|
||||
#
|
||||
10
rtl/bplib/nexys2/tb/tb_nexys2_core.vbom
Normal file
10
rtl/bplib/nexys2/tb/tb_nexys2_core.vbom
Normal file
@@ -0,0 +1,10 @@
|
||||
# libs
|
||||
../../../vlib/slvtypes.vhd
|
||||
../../../vlib/serport/serport.vhd
|
||||
../../../vlib/simlib/simbus.vhd
|
||||
# components
|
||||
../../../vlib/serport/serport_uart_rx.vbom
|
||||
../../../vlib/serport/serport_uart_tx.vbom
|
||||
../../micron/mt45w8mw16b.vbom
|
||||
# design
|
||||
tb_nexys2_core.vhd
|
||||
97
rtl/bplib/nexys2/tb/tb_nexys2_core.vhd
Normal file
97
rtl/bplib/nexys2/tb/tb_nexys2_core.vhd
Normal file
@@ -0,0 +1,97 @@
|
||||
-- $Id: tb_nexys2_core.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: tb_nexys2_core - sim
|
||||
-- Description: Test bench for nexys2 - core device handling
|
||||
--
|
||||
-- Dependencies: vlib/parts/micron/mt45w8mw16b
|
||||
--
|
||||
-- To test: generic, any nexys2 target
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-23 294 1.0 Initial version (derived from tb_s3board_core)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
use ieee.std_logic_textio.all;
|
||||
use std.textio.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.serport.all;
|
||||
use work.simbus.all;
|
||||
|
||||
entity tb_nexys2_core is
|
||||
port (
|
||||
I_SWI : out slv8; -- n2 switches
|
||||
I_BTN : out slv4; -- n2 buttons
|
||||
O_MEM_CE_N : in slbit; -- cram: chip enable (act.low)
|
||||
O_MEM_BE_N : in slv2; -- cram: byte enables (act.low)
|
||||
O_MEM_WE_N : in slbit; -- cram: write enable (act.low)
|
||||
O_MEM_OE_N : in slbit; -- cram: output enable (act.low)
|
||||
O_MEM_ADV_N : in slbit; -- cram: address valid (act.low)
|
||||
O_MEM_CLK : in slbit; -- cram: clock
|
||||
O_MEM_CRE : in slbit; -- cram: command register enable
|
||||
I_MEM_WAIT : out slbit; -- cram: mem wait
|
||||
O_FLA_CE_N : in slbit; -- flash ce.. (act.low)
|
||||
O_MEM_ADDR : in slv23; -- cram: address lines
|
||||
IO_MEM_DATA : inout slv16 -- cram: data lines
|
||||
);
|
||||
end tb_nexys2_core;
|
||||
|
||||
architecture sim of tb_nexys2_core is
|
||||
|
||||
signal R_SWI : slv8 := (others=>'0');
|
||||
signal R_BTN : slv4 := (others=>'0');
|
||||
|
||||
constant sbaddr_swi: slv8 := conv_std_logic_vector( 16,8);
|
||||
constant sbaddr_btn: slv8 := conv_std_logic_vector( 17,8);
|
||||
|
||||
begin
|
||||
|
||||
MEM : entity work.mt45w8mw16b
|
||||
port map (
|
||||
CLK => O_MEM_CLK,
|
||||
CE_N => O_MEM_CE_N,
|
||||
OE_N => O_MEM_OE_N,
|
||||
WE_N => O_MEM_WE_N,
|
||||
UB_N => O_MEM_BE_N(1),
|
||||
LB_N => O_MEM_BE_N(0),
|
||||
ADV_N => O_MEM_ADV_N,
|
||||
CRE => O_MEM_CRE,
|
||||
MWAIT => I_MEM_WAIT,
|
||||
ADDR => O_MEM_ADDR,
|
||||
DATA => IO_MEM_DATA
|
||||
);
|
||||
|
||||
proc_simbus: process (SB_VAL)
|
||||
begin
|
||||
if SB_VAL'event and to_x01(SB_VAL)='1' then
|
||||
if SB_ADDR = sbaddr_swi then
|
||||
R_SWI <= to_x01(SB_DATA(R_SWI'range));
|
||||
end if;
|
||||
if SB_ADDR = sbaddr_btn then
|
||||
R_BTN <= to_x01(SB_DATA(R_BTN'range));
|
||||
end if;
|
||||
end if;
|
||||
end process proc_simbus;
|
||||
|
||||
I_SWI <= R_SWI;
|
||||
I_BTN <= R_BTN;
|
||||
|
||||
end sim;
|
||||
20
rtl/bplib/nexys2/tb/tb_nexys2_fusp.vbom
Normal file
20
rtl/bplib/nexys2/tb/tb_nexys2_fusp.vbom
Normal file
@@ -0,0 +1,20 @@
|
||||
# Not meant for direct top level usage. Used with
|
||||
# tb_nexys2_fusp_(....)[_ssim].vbom and config
|
||||
# lines to generate the different cases.
|
||||
#
|
||||
# libs
|
||||
../../../vlib/slvtypes.vhd
|
||||
../../../vlib/rri/rrilib.vhd
|
||||
../../../vlib/rri/tb/rritblib.vhd
|
||||
../../../vlib/serport/serport.vhd
|
||||
../nexys2lib.vhd
|
||||
../../../vlib/simlib/simlib.vhd
|
||||
../../../vlib/simlib/simbus.vhd
|
||||
# components
|
||||
../../../vlib/rri/tb/rritb_core.vbom
|
||||
tb_nexys2_core.vbom
|
||||
../../../vlib/serport/serport_uart_rxtx.vbom
|
||||
nexys2_fusp_aif : nexys2_fusp_dummy.vbom
|
||||
# design
|
||||
tb_nexys2_fusp.vhd
|
||||
@top:tb_nexys2_fusp
|
||||
232
rtl/bplib/nexys2/tb/tb_nexys2_fusp.vhd
Normal file
232
rtl/bplib/nexys2/tb/tb_nexys2_fusp.vhd
Normal file
@@ -0,0 +1,232 @@
|
||||
-- $Id: tb_nexys2_fusp.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: tb_nexys2_fusp - sim
|
||||
-- Description: Test bench for nexys2 (base+fusp)
|
||||
--
|
||||
-- Dependencies: vlib/rri/tb/rritb_core
|
||||
-- tb_nexys2_core
|
||||
-- vlib/serport/serport_uart_rxtx
|
||||
-- nexys2_fusp_aif [UUT]
|
||||
--
|
||||
-- To test: generic, any nexys2_fusp_aif target
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-28 295 1.0 Initial version (derived from tb_s3board_fusp)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
use ieee.std_logic_textio.all;
|
||||
use std.textio.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.rrilib.all;
|
||||
use work.rritblib.all;
|
||||
use work.serport.all;
|
||||
use work.nexys2lib.all;
|
||||
use work.simlib.all;
|
||||
use work.simbus.all;
|
||||
|
||||
entity tb_nexys2_fusp is
|
||||
end tb_nexys2_fusp;
|
||||
|
||||
architecture sim of tb_nexys2_fusp is
|
||||
|
||||
signal CLK : slbit := '0';
|
||||
|
||||
signal RESET : slbit := '0';
|
||||
signal CLKDIV : slv2 := "00"; -- run with 1 clocks / bit !!
|
||||
signal RXDATA : slv8 := (others=>'0');
|
||||
signal RXVAL : slbit := '0';
|
||||
signal RXERR : slbit := '0';
|
||||
signal RXACT : slbit := '0';
|
||||
signal TXDATA : slv8 := (others=>'0');
|
||||
signal TXENA : slbit := '0';
|
||||
signal TXBUSY : slbit := '0';
|
||||
|
||||
signal RX_HOLD : slbit := '0';
|
||||
|
||||
signal I_RXD : slbit := '1';
|
||||
signal O_TXD : slbit := '1';
|
||||
signal I_SWI : slv8 := (others=>'0');
|
||||
signal I_BTN : slv4 := (others=>'0');
|
||||
signal O_LED : slv8 := (others=>'0');
|
||||
signal O_ANO_N : slv4 := (others=>'0');
|
||||
signal O_SEG_N : slv8 := (others=>'0');
|
||||
|
||||
signal O_MEM_CE_N : slbit := '1';
|
||||
signal O_MEM_BE_N : slv2 := (others=>'1');
|
||||
signal O_MEM_WE_N : slbit := '1';
|
||||
signal O_MEM_OE_N : slbit := '1';
|
||||
signal O_MEM_ADV_N : slbit := '1';
|
||||
signal O_MEM_CLK : slbit := '0';
|
||||
signal O_MEM_CRE : slbit := '0';
|
||||
signal I_MEM_WAIT : slbit := '0';
|
||||
signal O_FLA_CE_N : slbit := '0';
|
||||
signal O_MEM_ADDR : slv23 := (others=>'Z');
|
||||
signal IO_MEM_DATA : slv16 := (others=>'0');
|
||||
|
||||
signal O_FUSP_RTS_N : slbit := '0';
|
||||
signal I_FUSP_CTS_N : slbit := '0';
|
||||
signal I_FUSP_RXD : slbit := '1';
|
||||
signal O_FUSP_TXD : slbit := '1';
|
||||
|
||||
signal UART_RESET : slbit := '0';
|
||||
signal UART_RXD : slbit := '1';
|
||||
signal UART_TXD : slbit := '1';
|
||||
signal CTS_N : slbit := '0';
|
||||
signal RTS_N : slbit := '0';
|
||||
|
||||
signal R_PORTSEL : slbit := '0';
|
||||
|
||||
constant sbaddr_portsel: slv8 := conv_std_logic_vector( 8,8);
|
||||
|
||||
constant clock_period : time := 20 ns;
|
||||
constant clock_offset : time := 200 ns;
|
||||
constant setup_time : time := 5 ns;
|
||||
constant c2out_time : time := 10 ns;
|
||||
|
||||
begin
|
||||
|
||||
TBCORE : rritb_core
|
||||
generic map (
|
||||
CLK_PERIOD => clock_period,
|
||||
CLK_OFFSET => clock_offset,
|
||||
SETUP_TIME => setup_time,
|
||||
C2OUT_TIME => c2out_time)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RX_DATA => TXDATA,
|
||||
RX_VAL => TXENA,
|
||||
RX_HOLD => RX_HOLD,
|
||||
TX_DATA => RXDATA,
|
||||
TX_ENA => RXVAL
|
||||
);
|
||||
|
||||
RX_HOLD <= TXBUSY or RTS_N; -- back preasure for data flow to tb
|
||||
|
||||
N2CORE : entity work.tb_nexys2_core
|
||||
port map (
|
||||
I_SWI => I_SWI,
|
||||
I_BTN => I_BTN,
|
||||
O_MEM_CE_N => O_MEM_CE_N,
|
||||
O_MEM_BE_N => O_MEM_BE_N,
|
||||
O_MEM_WE_N => O_MEM_WE_N,
|
||||
O_MEM_OE_N => O_MEM_OE_N,
|
||||
O_MEM_ADV_N => O_MEM_ADV_N,
|
||||
O_MEM_CLK => O_MEM_CLK,
|
||||
O_MEM_CRE => O_MEM_CRE,
|
||||
I_MEM_WAIT => I_MEM_WAIT,
|
||||
O_FLA_CE_N => O_FLA_CE_N,
|
||||
O_MEM_ADDR => O_MEM_ADDR,
|
||||
IO_MEM_DATA => IO_MEM_DATA
|
||||
);
|
||||
|
||||
UUT : nexys2_fusp_aif
|
||||
port map (
|
||||
CLK => CLK,
|
||||
I_RXD => I_RXD,
|
||||
O_TXD => O_TXD,
|
||||
I_SWI => I_SWI,
|
||||
I_BTN => I_BTN,
|
||||
O_LED => O_LED,
|
||||
O_ANO_N => O_ANO_N,
|
||||
O_SEG_N => O_SEG_N,
|
||||
O_MEM_CE_N => O_MEM_CE_N,
|
||||
O_MEM_BE_N => O_MEM_BE_N,
|
||||
O_MEM_WE_N => O_MEM_WE_N,
|
||||
O_MEM_OE_N => O_MEM_OE_N,
|
||||
O_MEM_ADV_N => O_MEM_ADV_N,
|
||||
O_MEM_CLK => O_MEM_CLK,
|
||||
O_MEM_CRE => O_MEM_CRE,
|
||||
I_MEM_WAIT => I_MEM_WAIT,
|
||||
O_FLA_CE_N => O_FLA_CE_N,
|
||||
O_MEM_ADDR => O_MEM_ADDR,
|
||||
IO_MEM_DATA => IO_MEM_DATA,
|
||||
O_FUSP_RTS_N => O_FUSP_RTS_N,
|
||||
I_FUSP_CTS_N => I_FUSP_CTS_N,
|
||||
I_FUSP_RXD => I_FUSP_RXD,
|
||||
O_FUSP_TXD => O_FUSP_TXD
|
||||
);
|
||||
|
||||
UART : serport_uart_rxtx
|
||||
generic map (
|
||||
CDWIDTH => CLKDIV'length)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => UART_RESET,
|
||||
CLKDIV => CLKDIV,
|
||||
RXSD => UART_RXD,
|
||||
RXDATA => RXDATA,
|
||||
RXVAL => RXVAL,
|
||||
RXERR => RXERR,
|
||||
RXACT => RXACT,
|
||||
TXSD => UART_TXD,
|
||||
TXDATA => TXDATA,
|
||||
TXENA => TXENA,
|
||||
TXBUSY => TXBUSY
|
||||
);
|
||||
|
||||
proc_port_mux: process (R_PORTSEL, UART_TXD, CTS_N,
|
||||
O_TXD, O_FUSP_TXD, O_FUSP_RTS_N)
|
||||
begin
|
||||
|
||||
if R_PORTSEL = '0' then -- use main board rs232, no flow cntl
|
||||
I_RXD <= UART_TXD; -- write port 0 inputs
|
||||
UART_RXD <= O_TXD; -- get port 0 outputs
|
||||
RTS_N <= '0';
|
||||
I_FUSP_RXD <= '1'; -- port 1 inputs to idle state
|
||||
I_FUSP_CTS_N <= '0';
|
||||
else -- otherwise use pmod1 rs232
|
||||
I_FUSP_RXD <= UART_TXD; -- write port 1 inputs
|
||||
I_FUSP_CTS_N <= CTS_N;
|
||||
UART_RXD <= O_FUSP_TXD; -- get port 1 outputs
|
||||
RTS_N <= O_FUSP_RTS_N;
|
||||
I_RXD <= '1'; -- port 0 inputs to idle state
|
||||
end if;
|
||||
|
||||
end process proc_port_mux;
|
||||
|
||||
proc_moni: process
|
||||
variable oline : line;
|
||||
begin
|
||||
|
||||
loop
|
||||
wait until CLK'event and CLK='1';
|
||||
wait for c2out_time;
|
||||
|
||||
if RXERR = '1' then
|
||||
writetimestamp(oline, SB_CLKCYCLE, " : seen RXERR=1");
|
||||
writeline(output, oline);
|
||||
end if;
|
||||
|
||||
end loop;
|
||||
|
||||
end process proc_moni;
|
||||
|
||||
proc_simbus: process (SB_VAL)
|
||||
begin
|
||||
if SB_VAL'event and to_x01(SB_VAL)='1' then
|
||||
if SB_ADDR = sbaddr_portsel then
|
||||
R_PORTSEL <= to_x01(SB_DATA(0));
|
||||
end if;
|
||||
end if;
|
||||
end process proc_simbus;
|
||||
|
||||
end sim;
|
||||
4
rtl/bplib/nexys2/tb/tbw.dat
Normal file
4
rtl/bplib/nexys2/tb/tbw.dat
Normal file
@@ -0,0 +1,4 @@
|
||||
# $Id: tbw.dat 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
[tb_n2_cram_memctl_as]
|
||||
tb_n2_cram_memctl_stim = tb_n2_cram_memctl_stim.dat
|
||||
24
rtl/bplib/s3board/Makefile
Normal file
24
rtl/bplib/s3board/Makefile
Normal file
@@ -0,0 +1,24 @@
|
||||
# $Id: Makefile 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2007-12-09 100 1.0.1 drop ISE_p definition
|
||||
# 2007-09-16 83 1.0 Initial version
|
||||
#
|
||||
VBOM_all = $(wildcard *.vbom)
|
||||
NGC_all = $(VBOM_all:.vbom=.ngc)
|
||||
#
|
||||
ISE_PATH = xc3s1000-ft256-4
|
||||
#
|
||||
.phony : all clean
|
||||
#
|
||||
all : $(NGC_all)
|
||||
#
|
||||
clean : ise_clean
|
||||
#
|
||||
#----
|
||||
#
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.xflow
|
||||
#
|
||||
include $(VBOM_all:.vbom=.dep_xst)
|
||||
#
|
||||
5
rtl/bplib/s3board/s3_dispdrv.vbom
Normal file
5
rtl/bplib/s3board/s3_dispdrv.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
# components
|
||||
# design
|
||||
s3_dispdrv.vhd
|
||||
151
rtl/bplib/s3board/s3_dispdrv.vhd
Normal file
151
rtl/bplib/s3board/s3_dispdrv.vhd
Normal file
@@ -0,0 +1,151 @@
|
||||
-- $Id: s3_dispdrv.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: s3_dispdrv - syn
|
||||
-- Description: s3board: 7 segment display driver
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 11.4; ghdl 0.18-0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-04-17 278 1.1.1 renamed from dispdrv
|
||||
-- 2010-03-29 272 1.1 add all ANO off time to allow to driver turn-off
|
||||
-- delay and to avoid cross talk between digits
|
||||
-- 2007-12-16 101 1.0.1 use _N for active low
|
||||
-- 2007-09-16 83 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
entity s3_dispdrv is -- 7 segment display driver
|
||||
generic (
|
||||
CDWIDTH : positive := 6); -- clk divider width (must be >= 5)
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
DIN : in slv16; -- data
|
||||
DP : in slv4; -- decimal points
|
||||
ANO_N : out slv4; -- anodes (act.low)
|
||||
SEG_N : out slv8 -- segements (act.low)
|
||||
);
|
||||
end s3_dispdrv;
|
||||
|
||||
architecture syn of s3_dispdrv is
|
||||
|
||||
type regs_type is record
|
||||
cdiv : std_logic_vector(CDWIDTH-1 downto 0); -- clock divider counter
|
||||
dcnt : slv2; -- digit counter
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
conv_std_logic_vector(0,CDWIDTH),
|
||||
(others=>'0')
|
||||
);
|
||||
|
||||
type hex2segtbl_type is array (0 to 15) of slv7;
|
||||
|
||||
constant hex2segtbl : hex2segtbl_type :=
|
||||
("0111111", -- 0: "0000"
|
||||
"0000110", -- 1: "0001"
|
||||
"1011011", -- 2: "0010"
|
||||
"1001111", -- 3: "0011"
|
||||
"1100110", -- 4: "0100"
|
||||
"1101101", -- 5: "0101"
|
||||
"1111101", -- 6: "0110"
|
||||
"0000111", -- 7: "0111"
|
||||
"1111111", -- 8: "1000"
|
||||
"1101111", -- 9: "1001"
|
||||
"1110111", -- a: "1010"
|
||||
"1111100", -- b: "1011"
|
||||
"0111001", -- c: "1100"
|
||||
"1011110", -- d: "1101"
|
||||
"1111001", -- e: "1110"
|
||||
"1110001" -- f: "1111"
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init; -- state registers
|
||||
signal N_REGS : regs_type := regs_init; -- next value state regs
|
||||
|
||||
begin
|
||||
|
||||
assert CDWIDTH >= 5
|
||||
report "assert(CDWIDTH >= 5): CDWIDTH too small"
|
||||
severity FAILURE;
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
|
||||
if CLK'event and CLK='1' then
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
|
||||
end process proc_regs;
|
||||
|
||||
|
||||
proc_next: process (R_REGS, DIN, DP)
|
||||
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable cano : slv4 := "0000";
|
||||
variable chex : slv4 := "0000";
|
||||
variable cdp : slbit := '0';
|
||||
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
|
||||
n.cdiv := unsigned(r.cdiv) - 1;
|
||||
if unsigned(r.cdiv) = 0 then
|
||||
n.dcnt := unsigned(r.dcnt) + 1;
|
||||
end if;
|
||||
|
||||
chex := "0000";
|
||||
cdp := '0';
|
||||
|
||||
case r.dcnt is
|
||||
when "00" => chex := DIN( 3 downto 0); cdp := DP(0);
|
||||
when "01" => chex := DIN( 7 downto 4); cdp := DP(1);
|
||||
when "10" => chex := DIN(11 downto 8); cdp := DP(2);
|
||||
when "11" => chex := DIN(15 downto 12); cdp := DP(3);
|
||||
when others => chex := "----"; cdp := '-';
|
||||
end case;
|
||||
|
||||
-- the logic below ensures that the anode PNP driver transistor is switched
|
||||
-- off 16 cycles before the cathode drivers change. This prevents 'cross
|
||||
-- talk' between digits due to transistor turn off delays. With no or 4
|
||||
-- cycles gap one gets well visible cross talk, with 8 cycles still some
|
||||
-- weak cross talk. With 16 cycles (at 50MHz) none is visible. The
|
||||
-- turn-off delay of the anode driver PNP's this therefore larger 160 ns
|
||||
-- and below 320 ns.
|
||||
-- As consquence CDWIDTH should be at least 5, better 6.
|
||||
|
||||
cano := "1111";
|
||||
if unsigned(r.cdiv) >= 16 then
|
||||
cano(conv_integer(unsigned(r.dcnt))) := '0';
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
ANO_N <= cano;
|
||||
SEG_N <= not (cdp & hex2segtbl(conv_integer(unsigned(chex))));
|
||||
|
||||
end process proc_next;
|
||||
|
||||
end syn;
|
||||
13
rtl/bplib/s3board/s3_humanio.vbom
Normal file
13
rtl/bplib/s3board/s3_humanio.vbom
Normal file
@@ -0,0 +1,13 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
../../vlib/genlib/genlib.vhd
|
||||
../../vlib/xlib/xlib.vhd
|
||||
s3boardlib.vbom
|
||||
## sys_conf : sys_conf.vhd
|
||||
# components
|
||||
../../vlib/xlib/iob_reg_i_gen.vbom
|
||||
../../vlib/xlib/iob_reg_o_gen.vbom
|
||||
../../vlib/genlib/debounce_gen.vbom
|
||||
s3_dispdrv.vbom
|
||||
# design
|
||||
s3_humanio.vhd
|
||||
147
rtl/bplib/s3board/s3_humanio.vhd
Normal file
147
rtl/bplib/s3board/s3_humanio.vhd
Normal file
@@ -0,0 +1,147 @@
|
||||
-- $Id: s3_humanio.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: s3_humanio - syn
|
||||
-- Description: All BTN, SWI, LED and DSP handling for s3board
|
||||
--
|
||||
-- Dependencies: xlib/iob_reg_i_gen
|
||||
-- xlib/iob_reg_o_gen
|
||||
-- genlib/debounce_gen
|
||||
-- s3board/s3_dispdrv
|
||||
--
|
||||
-- Test bench: -
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2010-04-10 275 11.4 L68 xc3s1000-4 80 87 0 53 s 5.2 ns
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-04-17 278 1.1.1 rename dispdrv -> s3_dispdrv
|
||||
-- 2010-04-11 276 1.1 instantiate BTN/SWI debouncers via DEBOUNCE generic
|
||||
-- 2010-04-10 275 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.xlib.all;
|
||||
use work.genlib.all;
|
||||
use work.s3boardlib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity s3_humanio is -- human i/o handling: swi,btn,led,dsp
|
||||
generic (
|
||||
DEBOUNCE : boolean := true); -- instantiate debouncer for SWI,BTN
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
CE_MSEC : in slbit; -- 1 ms clock enable
|
||||
SWI : out slv8; -- switch settings, debounced
|
||||
BTN : out slv4; -- button settings, debounced
|
||||
LED : in slv8; -- led data
|
||||
DSP_DAT : in slv16; -- display data
|
||||
DSP_DP : in slv4; -- display decimal points
|
||||
I_SWI : in slv8; -- pad-i: switches
|
||||
I_BTN : in slv4; -- pad-i: buttons
|
||||
O_LED : out slv8; -- pad-o: leds
|
||||
O_ANO_N : out slv4; -- pad-o: 7 seg disp: anodes (act.low)
|
||||
O_SEG_N : out slv8 -- pad-o: 7 seg disp: segments (act.low)
|
||||
);
|
||||
end s3_humanio;
|
||||
|
||||
architecture syn of s3_humanio is
|
||||
|
||||
signal RI_SWI : slv8 := (others=>'0');
|
||||
signal RI_BTN : slv4 := (others=>'0');
|
||||
|
||||
signal N_ANO_N : slv4 := (others=>'0');
|
||||
signal N_SEG_N : slv8 := (others=>'0');
|
||||
|
||||
begin
|
||||
|
||||
IOB_SWI : iob_reg_i_gen
|
||||
generic map (DWIDTH => 8)
|
||||
port map (CLK => CLK, CE => '1', DI => RI_SWI, PAD => I_SWI);
|
||||
|
||||
IOB_BTN : iob_reg_i_gen
|
||||
generic map (DWIDTH => 4)
|
||||
port map (CLK => CLK, CE => '1', DI => RI_BTN, PAD => I_BTN);
|
||||
|
||||
IOB_LED : iob_reg_o_gen
|
||||
generic map (DWIDTH => 8)
|
||||
port map (CLK => CLK, CE => '1', DO => LED, PAD => O_LED);
|
||||
|
||||
IOB_ANO_N : iob_reg_o_gen
|
||||
generic map (DWIDTH => 4)
|
||||
port map (CLK => CLK, CE => '1', DO => N_ANO_N, PAD => O_ANO_N);
|
||||
|
||||
IOB_SEG_N : iob_reg_o_gen
|
||||
generic map (DWIDTH => 8)
|
||||
port map (CLK => CLK, CE => '1', DO => N_SEG_N, PAD => O_SEG_N);
|
||||
|
||||
DEB: if DEBOUNCE generate
|
||||
|
||||
DEB_SWI : debounce_gen
|
||||
generic map (
|
||||
CWIDTH => 2,
|
||||
CEDIV => 3,
|
||||
DWIDTH => 8)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
CE_INT => CE_MSEC,
|
||||
DI => RI_SWI,
|
||||
DO => SWI
|
||||
);
|
||||
|
||||
DEB_BTN : debounce_gen
|
||||
generic map (
|
||||
CWIDTH => 2,
|
||||
CEDIV => 3,
|
||||
DWIDTH => 4)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
CE_INT => CE_MSEC,
|
||||
DI => RI_BTN,
|
||||
DO => BTN
|
||||
);
|
||||
|
||||
end generate DEB;
|
||||
|
||||
NODEB: if not DEBOUNCE generate
|
||||
SWI <= RI_SWI;
|
||||
BTN <= RI_BTN;
|
||||
end generate NODEB;
|
||||
|
||||
DRV : s3_dispdrv
|
||||
generic map (
|
||||
CDWIDTH => 6)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
DIN => DSP_DAT,
|
||||
DP => DSP_DP,
|
||||
ANO_N => N_ANO_N,
|
||||
SEG_N => N_SEG_N
|
||||
);
|
||||
|
||||
end syn;
|
||||
8
rtl/bplib/s3board/s3_humanio_rri.vbom
Normal file
8
rtl/bplib/s3board/s3_humanio_rri.vbom
Normal file
@@ -0,0 +1,8 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
../../vlib/rri/rrilib.vhd
|
||||
s3boardlib.vbom
|
||||
# components
|
||||
s3_humanio.vbom
|
||||
# design
|
||||
s3_humanio_rri.vhd
|
||||
277
rtl/bplib/s3board/s3_humanio_rri.vhd
Normal file
277
rtl/bplib/s3board/s3_humanio_rri.vhd
Normal file
@@ -0,0 +1,277 @@
|
||||
-- $Id: s3_humanio_rri.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: s3_humanio_rri - syn
|
||||
-- Description: s3_humanio with rri interceptor
|
||||
--
|
||||
-- Dependencies: s3board/s3_humanio
|
||||
--
|
||||
-- Test bench: -
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2010-06-03 300 11.4 L68 xc3s1000-4 92 137 0 111 s 6.7 ns
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-18 306 1.0.1 rename rbus data fields to _rbf_
|
||||
-- 2010-06-03 300 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
-- rbus registers:
|
||||
--
|
||||
-- Address Bits Name r/w/f Function
|
||||
-- bbbbbb00 cntl r/w/- Control register and BTN access
|
||||
-- 11 dat_en r/w/- if 1 display data will be driven by rri
|
||||
-- 10 dp_en r/w/- if 1 display dp's will be driven by rri
|
||||
-- 9 led_en r/w/- if 1 LED will be driven by rri
|
||||
-- 8 swi_en r/w/- if 1 SWI will be driven by rri
|
||||
-- 3:00 btn r/w/- r: return hio BTN status
|
||||
-- w: BTN is hio BTN ored with this fields
|
||||
--
|
||||
-- bbbbbb01 7:00 swi r/w/- r: return hio SWI status
|
||||
-- w: will drive SWI when swi_en=1
|
||||
--
|
||||
-- bbbbbb10 leddp r/w/- interface to LED and DSP_DP
|
||||
-- 11:09 dsp_dp r/w/- r: returns DSP_DP status
|
||||
-- w: will drive display dp's when dp_en=1
|
||||
-- 7:00 led r/w/- r: returns LED status
|
||||
-- w: will drive led's when led_en=1
|
||||
--
|
||||
-- bbbbbb11 15:00 dsp_dat r/w/- r: return hio DSP_DAT status
|
||||
-- w: will drive DSP_DAT when dat_en=1
|
||||
--
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.rrilib.all;
|
||||
use work.s3boardlib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity s3_humanio_rri is -- human i/o handling with rri intercept
|
||||
generic (
|
||||
DEBOUNCE : boolean := true; -- instantiate debouncer for SWI,BTN
|
||||
RB_ADDR : slv8 := conv_std_logic_vector(2#10000000#,8));
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
CE_MSEC : in slbit; -- 1 ms clock enable
|
||||
RB_MREQ : in rb_mreq_type; -- rbus: request
|
||||
RB_SRES : out rb_sres_type; -- rbus: response
|
||||
SWI : out slv8; -- switch settings, debounced
|
||||
BTN : out slv4; -- button settings, debounced
|
||||
LED : in slv8; -- led data
|
||||
DSP_DAT : in slv16; -- display data
|
||||
DSP_DP : in slv4; -- display decimal points
|
||||
I_SWI : in slv8; -- pad-i: switches
|
||||
I_BTN : in slv4; -- pad-i: buttons
|
||||
O_LED : out slv8; -- pad-o: leds
|
||||
O_ANO_N : out slv4; -- pad-o: 7 seg disp: anodes (act.low)
|
||||
O_SEG_N : out slv8 -- pad-o: 7 seg disp: segments (act.low)
|
||||
);
|
||||
end s3_humanio_rri;
|
||||
|
||||
architecture syn of s3_humanio_rri is
|
||||
|
||||
type regs_type is record
|
||||
swi : slv8; -- rri swi
|
||||
btn : slv4; -- rri btn
|
||||
led : slv8; -- rri led
|
||||
dsp_dat : slv16; -- rri dsp_dat
|
||||
dsp_dp : slv4; -- rri dsp_dp
|
||||
swi_en : slbit; -- enable: swi from rri
|
||||
led_en : slbit; -- enable: led from rri
|
||||
dat_en : slbit; -- enable: dsp_dat from rri
|
||||
dp_en : slbit; -- enable: dsp_dp from rri
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
(others=>'0'), -- swi
|
||||
(others=>'0'), -- btn
|
||||
(others=>'0'), -- led
|
||||
(others=>'0'), -- dsp_dat
|
||||
(others=>'0'), -- dsp_dp
|
||||
'0','0','0','0' -- (swi|led|dat|dp)_en
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init; -- state registers
|
||||
signal N_REGS : regs_type := regs_init; -- next value state regs
|
||||
|
||||
constant cntl_rbf_dat_en: integer := 11;
|
||||
constant cntl_rbf_dp_en: integer := 10;
|
||||
constant cntl_rbf_led_en: integer := 9;
|
||||
constant cntl_rbf_swi_en: integer := 8;
|
||||
subtype cntl_rbf_btn is integer range 3 downto 0;
|
||||
subtype leddp_rbf_dsp_dp is integer range 11 downto 8;
|
||||
subtype leddp_rbf_led is integer range 7 downto 0;
|
||||
|
||||
constant rbaddr_cntl: slv2 := "00"; -- 0 -/r/w
|
||||
constant rbaddr_swi: slv2 := "01"; -- 1 -/r/w
|
||||
constant rbaddr_leddp: slv2 := "10"; -- 2 -/r/w
|
||||
constant rbaddr_dsp: slv2 := "11"; -- 3 -/r/w
|
||||
|
||||
signal HIO_SWI : slv8 := (others=>'0');
|
||||
signal HIO_BTN : slv4 := (others=>'0');
|
||||
signal HIO_LED : slv8 := (others=>'0');
|
||||
signal HIO_DSP_DAT : slv16 := (others=>'0');
|
||||
signal HIO_DSP_DP : slv4 := (others=>'0');
|
||||
|
||||
begin
|
||||
|
||||
HIO : s3_humanio
|
||||
generic map (
|
||||
DEBOUNCE => DEBOUNCE)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
CE_MSEC => CE_MSEC,
|
||||
SWI => HIO_SWI,
|
||||
BTN => HIO_BTN,
|
||||
LED => HIO_LED,
|
||||
DSP_DAT => HIO_DSP_DAT,
|
||||
DSP_DP => HIO_DSP_DP,
|
||||
I_SWI => I_SWI,
|
||||
I_BTN => I_BTN,
|
||||
O_LED => O_LED,
|
||||
O_ANO_N => O_ANO_N,
|
||||
O_SEG_N => O_SEG_N
|
||||
);
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
|
||||
if CLK'event and CLK='1' then
|
||||
if RESET = '1' then
|
||||
R_REGS <= regs_init;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
end process proc_regs;
|
||||
|
||||
proc_next: process (R_REGS, RB_MREQ, LED, DSP_DAT, DSP_DP,
|
||||
HIO_SWI, HIO_BTN, HIO_LED, HIO_DSP_DAT, HIO_DSP_DP)
|
||||
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
|
||||
variable irb_sel : slbit := '0';
|
||||
variable irb_ack : slbit := '0';
|
||||
variable irb_busy : slbit := '0';
|
||||
variable irb_err : slbit := '0';
|
||||
variable irb_dout : slv16 := (others=>'0');
|
||||
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
|
||||
irb_sel := '0';
|
||||
irb_ack := '0';
|
||||
irb_busy := '0';
|
||||
irb_err := '0';
|
||||
irb_dout := (others=>'0');
|
||||
|
||||
if RB_MREQ.req='1' and RB_MREQ.addr(7 downto 2)=RB_ADDR(7 downto 2) then
|
||||
irb_sel := '1';
|
||||
irb_ack := '1';
|
||||
end if;
|
||||
|
||||
if irb_sel = '1' then
|
||||
case RB_MREQ.addr(1 downto 0) is
|
||||
|
||||
when rbaddr_cntl =>
|
||||
irb_dout(cntl_rbf_dat_en) := r.dat_en;
|
||||
irb_dout(cntl_rbf_dp_en) := r.dp_en;
|
||||
irb_dout(cntl_rbf_led_en) := r.led_en;
|
||||
irb_dout(cntl_rbf_swi_en) := r.swi_en;
|
||||
irb_dout(cntl_rbf_btn) := HIO_BTN;
|
||||
if RB_MREQ.we = '1' then
|
||||
n.dat_en := RB_MREQ.din(cntl_rbf_dat_en);
|
||||
n.dp_en := RB_MREQ.din(cntl_rbf_dp_en);
|
||||
n.led_en := RB_MREQ.din(cntl_rbf_led_en);
|
||||
n.swi_en := RB_MREQ.din(cntl_rbf_swi_en);
|
||||
n.btn := RB_MREQ.din(cntl_rbf_btn);
|
||||
end if;
|
||||
|
||||
when rbaddr_swi =>
|
||||
irb_dout(HIO_SWI'range) := HIO_SWI;
|
||||
if RB_MREQ.we = '1' then
|
||||
n.swi := RB_MREQ.din(n.swi'range);
|
||||
end if;
|
||||
|
||||
when rbaddr_leddp =>
|
||||
irb_dout(leddp_rbf_dsp_dp) := HIO_DSP_DP;
|
||||
irb_dout(leddp_rbf_led) := HIO_LED;
|
||||
if RB_MREQ.we = '1' then
|
||||
n.dsp_dp := RB_MREQ.din(leddp_rbf_dsp_dp);
|
||||
n.led := RB_MREQ.din(leddp_rbf_led);
|
||||
end if;
|
||||
|
||||
when rbaddr_dsp =>
|
||||
irb_dout := HIO_DSP_DAT;
|
||||
if RB_MREQ.we = '1' then
|
||||
n.dsp_dat := RB_MREQ.din;
|
||||
end if;
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
end if;
|
||||
|
||||
BTN <= HIO_BTN or r.btn;
|
||||
|
||||
if r.swi_en = '0' then
|
||||
SWI <= HIO_SWI;
|
||||
else
|
||||
SWI <= r.swi;
|
||||
end if;
|
||||
|
||||
if r.led_en = '0' then
|
||||
HIO_LED <= LED;
|
||||
else
|
||||
HIO_LED <= r.led;
|
||||
end if;
|
||||
|
||||
if r.dp_en = '0' then
|
||||
HIO_DSP_DP <= DSP_DP;
|
||||
else
|
||||
HIO_DSP_DP <= r.dsp_dp;
|
||||
end if;
|
||||
|
||||
if r.dat_en = '0' then
|
||||
HIO_DSP_DAT <= DSP_DAT;
|
||||
else
|
||||
HIO_DSP_DAT <= r.dsp_dat;
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
RB_SRES <= rb_sres_init;
|
||||
RB_SRES.ack <= irb_ack;
|
||||
RB_SRES.busy <= irb_busy;
|
||||
RB_SRES.err <= irb_err;
|
||||
RB_SRES.dout <= irb_dout;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
end syn;
|
||||
8
rtl/bplib/s3board/s3_rs232_iob_ext.vbom
Normal file
8
rtl/bplib/s3board/s3_rs232_iob_ext.vbom
Normal file
@@ -0,0 +1,8 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
../../vlib/xlib/xlib.vhd
|
||||
# components
|
||||
../../vlib/xlib/iob_reg_i.vbom
|
||||
../../vlib/xlib/iob_reg_o.vbom
|
||||
# design
|
||||
s3_rs232_iob_ext.vhd
|
||||
72
rtl/bplib/s3board/s3_rs232_iob_ext.vhd
Normal file
72
rtl/bplib/s3board/s3_rs232_iob_ext.vhd
Normal file
@@ -0,0 +1,72 @@
|
||||
-- $Id: s3_rs232_iob_ext.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: s3_rs232_iob_ext - syn
|
||||
-- Description: iob's for external rs232 (PMod)
|
||||
--
|
||||
-- Dependencies: xlib/iob_reg_i
|
||||
-- xlib/iob_reg_o
|
||||
--
|
||||
-- Test bench: -
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-04-17 278 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.xlib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity s3_rs232_iob_ext is -- iob's for external rs232 (PMod)
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RXD : out slbit; -- receive data (board view)
|
||||
TXD : in slbit; -- transmit data (board view)
|
||||
CTS_N : out slbit; -- clear to send (act. low)
|
||||
RTS_N : in slbit; -- request to send (act. low)
|
||||
I_RXD : in slbit; -- pad-i: receive data (board view)
|
||||
O_TXD : out slbit; -- pad-o: transmit data (board view)
|
||||
I_CTS_N : in slbit; -- pad-i: clear to send (act. low)
|
||||
O_RTS_N : out slbit -- pad-o: request to send (act. low)
|
||||
);
|
||||
end s3_rs232_iob_ext;
|
||||
|
||||
architecture syn of s3_rs232_iob_ext is
|
||||
begin
|
||||
|
||||
IOB_RXD : iob_reg_i -- line idle=1, so init sync flop =1
|
||||
generic map (INIT => '1')
|
||||
port map (CLK => CLK, CE => '1', DI => RXD, PAD => I_RXD);
|
||||
|
||||
IOB_TXD : iob_reg_o -- line idle=1, so init sync flop =1
|
||||
generic map (INIT => '1')
|
||||
port map (CLK => CLK, CE => '1', DO => TXD, PAD => O_TXD);
|
||||
|
||||
IOB_CTS : iob_reg_i
|
||||
port map (CLK => CLK, CE => '1', DI => CTS_N, PAD => I_CTS_N);
|
||||
|
||||
IOB_RTS : iob_reg_o
|
||||
port map (CLK => CLK, CE => '1', DO => RTS_N, PAD => O_RTS_N);
|
||||
|
||||
end syn;
|
||||
8
rtl/bplib/s3board/s3_rs232_iob_int.vbom
Normal file
8
rtl/bplib/s3board/s3_rs232_iob_int.vbom
Normal file
@@ -0,0 +1,8 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
../../vlib/xlib/xlib.vhd
|
||||
# components
|
||||
../../vlib/xlib/iob_reg_i.vbom
|
||||
../../vlib/xlib/iob_reg_o.vbom
|
||||
# design
|
||||
s3_rs232_iob_int.vhd
|
||||
62
rtl/bplib/s3board/s3_rs232_iob_int.vhd
Normal file
62
rtl/bplib/s3board/s3_rs232_iob_int.vhd
Normal file
@@ -0,0 +1,62 @@
|
||||
-- $Id: s3_rs232_iob_int.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: s3_rs232_iob_int - syn
|
||||
-- Description: iob's for internal rs232
|
||||
--
|
||||
-- Dependencies: xlib/iob_reg_i
|
||||
-- xlib/iob_reg_o
|
||||
--
|
||||
-- Test bench: -
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-04-17 278 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.xlib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity s3_rs232_iob_int is -- iob's for internal rs232
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RXD : out slbit; -- receive data (board view)
|
||||
TXD : in slbit; -- transmit data (board view)
|
||||
I_RXD : in slbit; -- pad-i: receive data (board view)
|
||||
O_TXD : out slbit -- pad-o: transmit data (board view)
|
||||
);
|
||||
end s3_rs232_iob_int;
|
||||
|
||||
architecture syn of s3_rs232_iob_int is
|
||||
begin
|
||||
|
||||
IOB_RXD : iob_reg_i -- line idle=1, so init sync flop =1
|
||||
generic map (INIT => '1')
|
||||
port map (CLK => CLK, CE => '1', DI => RXD, PAD => I_RXD);
|
||||
|
||||
IOB_TXD : iob_reg_o -- line idle=1, so init sync flop =1
|
||||
generic map (INIT => '1')
|
||||
port map (CLK => CLK, CE => '1', DO => TXD, PAD => O_TXD);
|
||||
|
||||
end syn;
|
||||
8
rtl/bplib/s3board/s3_rs232_iob_int_ext.vbom
Normal file
8
rtl/bplib/s3board/s3_rs232_iob_int_ext.vbom
Normal file
@@ -0,0 +1,8 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
s3boardlib.vbom
|
||||
# components
|
||||
s3_rs232_iob_int.vbom
|
||||
s3_rs232_iob_ext.vbom
|
||||
# design
|
||||
s3_rs232_iob_int_ext.vhd
|
||||
106
rtl/bplib/s3board/s3_rs232_iob_int_ext.vhd
Normal file
106
rtl/bplib/s3board/s3_rs232_iob_int_ext.vhd
Normal file
@@ -0,0 +1,106 @@
|
||||
-- $Id: s3_rs232_iob_int_ext.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: s3_rs232_iob_int_ext - syn
|
||||
-- Description: iob's for internal + external rs232, with select
|
||||
--
|
||||
-- Dependencies: s3_rs232_iob_int
|
||||
-- s3_rs232_iob_ext
|
||||
--
|
||||
-- Test bench: -
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-04-17 278 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.s3boardlib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity s3_rs232_iob_int_ext is -- iob's for int+ext rs232, with select
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
SEL : in slbit; -- select, '0' for port 0
|
||||
RXD : out slbit; -- receive data (board view)
|
||||
TXD : in slbit; -- transmit data (board view)
|
||||
CTS_N : out slbit; -- clear to send (act. low)
|
||||
RTS_N : in slbit; -- request to send (act. low)
|
||||
I_RXD0 : in slbit; -- pad-i: p0: receive data (board view)
|
||||
O_TXD0 : out slbit; -- pad-o: p0: transmit data (board view)
|
||||
I_RXD1 : in slbit; -- pad-i: p1: receive data (board view)
|
||||
O_TXD1 : out slbit; -- pad-o: p1: transmit data (board view)
|
||||
I_CTS1_N : in slbit; -- pad-i: p1: clear to send (act. low)
|
||||
O_RTS1_N : out slbit -- pad-o: p1: request to send (act. low)
|
||||
);
|
||||
end s3_rs232_iob_int_ext;
|
||||
|
||||
architecture syn of s3_rs232_iob_int_ext is
|
||||
signal RXD0 : slbit := '0';
|
||||
signal TXD0 : slbit := '0';
|
||||
signal RXD1 : slbit := '0';
|
||||
signal TXD1 : slbit := '0';
|
||||
signal CTS1_N : slbit := '0';
|
||||
signal RTS1_N : slbit := '0';
|
||||
begin
|
||||
|
||||
P0 : s3_rs232_iob_int
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RXD => RXD0,
|
||||
TXD => TXD0,
|
||||
I_RXD => I_RXD0,
|
||||
O_TXD => O_TXD0
|
||||
);
|
||||
|
||||
P1 : s3_rs232_iob_ext
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RXD => RXD1,
|
||||
TXD => TXD1,
|
||||
CTS_N => CTS1_N,
|
||||
RTS_N => RTS1_N,
|
||||
I_RXD => I_RXD1,
|
||||
O_TXD => O_TXD1,
|
||||
I_CTS_N => I_CTS1_N,
|
||||
O_RTS_N => O_RTS1_N
|
||||
);
|
||||
|
||||
proc_port_mux: process (SEL, RXD0, TXD, RXD1, CTS1_N, RTS_N)
|
||||
begin
|
||||
if SEL = '0' then -- use main board rs232, no flow cntl
|
||||
RXD <= RXD0; -- get port 0 inputs
|
||||
CTS_N <= '0';
|
||||
TXD0 <= TXD; -- set port 0 output
|
||||
TXD1 <= '1'; -- port 1 outputs to idle state
|
||||
RTS1_N <= '0';
|
||||
else -- otherwise use pmod1 rs232
|
||||
RXD <= RXD1; -- get port 1 inputs
|
||||
CTS_N <= CTS1_N;
|
||||
TXD1 <= TXD; -- set port 1 outputs
|
||||
RTS1_N <= RTS_N;
|
||||
TXD0 <= '1'; -- port 0 output to idle state
|
||||
end if;
|
||||
end process proc_port_mux;
|
||||
|
||||
end syn;
|
||||
5
rtl/bplib/s3board/s3_sram_dummy.vbom
Normal file
5
rtl/bplib/s3board/s3_sram_dummy.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
# components
|
||||
# design
|
||||
s3_sram_dummy.vhd
|
||||
57
rtl/bplib/s3board/s3_sram_dummy.vhd
Normal file
57
rtl/bplib/s3board/s3_sram_dummy.vhd
Normal file
@@ -0,0 +1,57 @@
|
||||
-- $Id: s3_sram_dummy.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: s3_sram_dummy - syn
|
||||
-- Description: s3board: SRAM protection dummy
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 11.4; ghdl 0.18-0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-04-17 278 1.0.2 renamed from sram_dummy
|
||||
-- 2007-12-09 101 1.0.1 use _N for active low
|
||||
-- 2007-12-08 100 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
entity s3_sram_dummy is -- SRAM protection dummy
|
||||
port (
|
||||
O_MEM_CE_N : out slv2; -- sram: chip enables (act.low)
|
||||
O_MEM_BE_N : out slv4; -- sram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- sram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- sram: output enable (act.low)
|
||||
O_MEM_ADDR : out slv18; -- sram: address lines
|
||||
IO_MEM_DATA : inout slv32 -- sram: data lines
|
||||
);
|
||||
end s3_sram_dummy;
|
||||
|
||||
|
||||
architecture syn of s3_sram_dummy is
|
||||
begin
|
||||
|
||||
O_MEM_CE_N <= "11"; -- disable sram chips
|
||||
O_MEM_BE_N <= "1111";
|
||||
O_MEM_WE_N <= '1';
|
||||
O_MEM_OE_N <= '1';
|
||||
O_MEM_ADDR <= (others=>'0');
|
||||
IO_MEM_DATA <= (others=>'0');
|
||||
|
||||
end syn;
|
||||
9
rtl/bplib/s3board/s3_sram_memctl.vbom
Normal file
9
rtl/bplib/s3board/s3_sram_memctl.vbom
Normal file
@@ -0,0 +1,9 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
../../vlib/xlib/xlib.vhd
|
||||
# components
|
||||
../../vlib/xlib/iob_reg_o.vbom
|
||||
../../vlib/xlib/iob_reg_o_gen.vbom
|
||||
../../vlib/xlib/iob_reg_io_gen.vbom
|
||||
# design
|
||||
s3_sram_memctl.vhd
|
||||
365
rtl/bplib/s3board/s3_sram_memctl.vhd
Normal file
365
rtl/bplib/s3board/s3_sram_memctl.vhd
Normal file
@@ -0,0 +1,365 @@
|
||||
-- $Id: s3_sram_memctl.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: s3_sram_memctl - syn
|
||||
-- Description: s3board: SRAM driver
|
||||
--
|
||||
-- Dependencies: vlib/xlib/iob_reg_o
|
||||
-- vlib/xlib/iob_reg_o_gen
|
||||
-- vlib/xlib/iob_reg_io_gen
|
||||
-- Test bench: tb/tb_s3_sram_memctl
|
||||
-- fw_gen/tst_sram/s3board/tb/tb_tst_sram_s3
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2010-05-23 293 11.4 L68 xc3s1000-4 7 22 0 14 s 8.5
|
||||
-- 2008-02-16 116 8.2.03 I34 xc3s1000-4 5 30 0 17 s 7.0
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-03 299 1.0.5 add "KEEP" for data iob;
|
||||
-- 2010-05-16 291 1.0.4 rename memctl_s3sram -> s3_sram_memctl
|
||||
-- 2008-02-17 117 1.0.3 use req,we rather req_r,req_w interface
|
||||
-- 2008-01-20 113 1.0.2 rename memdrv -> memctl_s3sram
|
||||
-- 2007-12-15 101 1.0.1 use _N for active low; get ce/we clocking right
|
||||
-- 2007-12-08 100 1.0 Initial version
|
||||
--
|
||||
-- Timing of some signals:
|
||||
--
|
||||
-- single read request:
|
||||
--
|
||||
-- state |_idle |_read |_idle |
|
||||
--
|
||||
-- CLK __|^^^|___|^^^|___|^^^|___|^
|
||||
--
|
||||
-- REQ _______|^^^^^|______________
|
||||
-- WE ____________________________
|
||||
--
|
||||
-- IOB_CE __________|^^^^^^^|_________
|
||||
-- IOB_OE __________|^^^^^^^|_________
|
||||
--
|
||||
-- DO oooooooooooooooooo|ddddddd|d
|
||||
-- BUSY ____________________________
|
||||
-- ACK_R __________________|^^^^^^^|_
|
||||
--
|
||||
-- single write request:
|
||||
--
|
||||
-- state |_idle |_write1|_write2|_idle |
|
||||
--
|
||||
-- CLK __|^^^|___|^^^|___|^^^|___|^^^|___|^
|
||||
--
|
||||
-- REQ _______|^^^^^|______________
|
||||
-- WE _______|^^^^^|______________
|
||||
--
|
||||
-- IOB_CE __________|^^^^^^^^^^^^^^^|_________
|
||||
-- IOB_BE __________|^^^^^^^^^^^^^^^|_________
|
||||
-- IOB_OE ____________________________________
|
||||
-- IOB_WE ______________|^^^^^^^|_____________
|
||||
--
|
||||
-- BUSY __________|^^^^^^^|_________________
|
||||
-- ACK_W __________________|^^^^^^^|_________
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.xlib.all;
|
||||
|
||||
entity s3_sram_memctl is -- SRAM driver for S3BOARD
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
REQ : in slbit; -- request
|
||||
WE : in slbit; -- write enable
|
||||
BUSY : out slbit; -- controller busy
|
||||
ACK_R : out slbit; -- acknowledge read
|
||||
ACK_W : out slbit; -- acknowledge write
|
||||
ACT_R : out slbit; -- signal active read
|
||||
ACT_W : out slbit; -- signal active write
|
||||
ADDR : in slv18; -- address
|
||||
BE : in slv4; -- byte enable
|
||||
DI : in slv32; -- data in (memory view)
|
||||
DO : out slv32; -- data out (memory view)
|
||||
O_MEM_CE_N : out slv2; -- sram: chip enables (act.low)
|
||||
O_MEM_BE_N : out slv4; -- sram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- sram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- sram: output enable (act.low)
|
||||
O_MEM_ADDR : out slv18; -- sram: address lines
|
||||
IO_MEM_DATA : inout slv32 -- sram: data lines
|
||||
);
|
||||
end s3_sram_memctl;
|
||||
|
||||
|
||||
architecture syn of s3_sram_memctl is
|
||||
|
||||
type state_type is (
|
||||
s_idle, -- s_idle: wait for req
|
||||
s_read, -- s_read: read cycle
|
||||
s_write1, -- s_write1: write cycle, 1st half
|
||||
s_write2, -- s_write2: write cycle, 2nd half
|
||||
s_bta_r2w, -- s_bta_r2w: bus turn around: r->w
|
||||
s_bta_w2r -- s_bta_w2r: bus turn around: w->r
|
||||
);
|
||||
|
||||
type regs_type is record
|
||||
state : state_type; -- state
|
||||
ackr : slbit; -- signal ack_r
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
s_idle,
|
||||
'0' -- ackr
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init; -- state registers
|
||||
signal N_REGS : regs_type := regs_init; -- next value state regs
|
||||
|
||||
signal CLK_180 : slbit := '0';
|
||||
signal MEM_CE_N : slv2 := "00";
|
||||
signal MEM_BE_N : slv4 := "0000";
|
||||
signal MEM_WE_N : slbit := '0';
|
||||
signal MEM_OE_N : slbit := '0';
|
||||
signal ADDR_CE : slbit := '0';
|
||||
signal DATA_CEI : slbit := '0';
|
||||
signal DATA_CEO : slbit := '0';
|
||||
signal DATA_OE : slbit := '0';
|
||||
|
||||
begin
|
||||
|
||||
CLK_180 <= not CLK;
|
||||
|
||||
IOB_MEM_CE : iob_reg_o_gen
|
||||
generic map (
|
||||
DWIDTH => 2,
|
||||
INIT => '1')
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE => '1',
|
||||
DO => MEM_CE_N,
|
||||
PAD => O_MEM_CE_N
|
||||
);
|
||||
|
||||
IOB_MEM_BE : iob_reg_o_gen
|
||||
generic map (
|
||||
DWIDTH => 4,
|
||||
INIT => '1')
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE => ADDR_CE,
|
||||
DO => MEM_BE_N,
|
||||
PAD => O_MEM_BE_N
|
||||
);
|
||||
|
||||
IOB_MEM_WE : iob_reg_o
|
||||
generic map (
|
||||
INIT => '1')
|
||||
port map (
|
||||
CLK => CLK_180,
|
||||
CE => '1',
|
||||
DO => MEM_WE_N,
|
||||
PAD => O_MEM_WE_N
|
||||
);
|
||||
|
||||
IOB_MEM_OE : iob_reg_o
|
||||
generic map (
|
||||
INIT => '1')
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE => '1',
|
||||
DO => MEM_OE_N,
|
||||
PAD => O_MEM_OE_N
|
||||
);
|
||||
|
||||
IOB_MEM_ADDR : iob_reg_o_gen
|
||||
generic map (
|
||||
DWIDTH => 18)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE => ADDR_CE,
|
||||
DO => ADDR,
|
||||
PAD => O_MEM_ADDR
|
||||
);
|
||||
|
||||
IOB_MEM_DATA : iob_reg_io_gen
|
||||
generic map (
|
||||
DWIDTH => 32,
|
||||
PULL => "KEEP")
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CEI => DATA_CEI,
|
||||
CEO => DATA_CEO,
|
||||
OE => DATA_OE,
|
||||
DI => DO,
|
||||
DO => DI,
|
||||
PAD => IO_MEM_DATA
|
||||
);
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
|
||||
if CLK'event and CLK='1' then
|
||||
if RESET = '1' then
|
||||
R_REGS <= regs_init;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
end process proc_regs;
|
||||
|
||||
proc_next: process (R_REGS, REQ, WE, BE)
|
||||
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable ibusy : slbit := '0';
|
||||
variable iackw : slbit := '0';
|
||||
variable iactr : slbit := '0';
|
||||
variable iactw : slbit := '0';
|
||||
variable imem_ce : slv2 := "00";
|
||||
variable imem_be : slv4 := "0000";
|
||||
variable imem_we : slbit := '0';
|
||||
variable imem_oe : slbit := '0';
|
||||
variable iaddr_ce : slbit := '0';
|
||||
variable idata_cei : slbit := '0';
|
||||
variable idata_ceo : slbit := '0';
|
||||
variable idata_oe : slbit := '0';
|
||||
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
n.ackr := '0';
|
||||
|
||||
ibusy := '0';
|
||||
iackw := '0';
|
||||
iactr := '0';
|
||||
iactw := '0';
|
||||
|
||||
imem_ce := "00";
|
||||
imem_be := "1111";
|
||||
imem_we := '0';
|
||||
imem_oe := '0';
|
||||
iaddr_ce := '0';
|
||||
idata_cei := '0';
|
||||
idata_ceo := '0';
|
||||
idata_oe := '0';
|
||||
|
||||
case r.state is
|
||||
when s_idle => -- s_idle: wait for req
|
||||
if REQ = '1' then -- if IO requested
|
||||
if WE = '0' then -- if READ requested
|
||||
iaddr_ce := '1'; -- latch address and be's
|
||||
imem_ce := "11"; -- ce SRAM next cycle
|
||||
imem_oe := '1'; -- oe SRAM next cycle
|
||||
n.state := s_read; -- next: read
|
||||
else -- if WRITE requested
|
||||
iaddr_ce := '1'; -- latch address and be's
|
||||
idata_ceo := '1'; -- latch output data
|
||||
idata_oe := '1'; -- oe FPGA next cycle
|
||||
imem_ce := "11"; -- ce SRAM next cycle
|
||||
imem_be := BE; -- use request BE's
|
||||
n.state := s_write1; -- next: write 1st part
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when s_read => -- s_read: read cycle
|
||||
idata_cei := '1'; -- latch input data
|
||||
iactr := '1'; -- signal mem read
|
||||
n.ackr := '1'; -- ACK_R next cycle
|
||||
if REQ = '1' then -- if IO requested
|
||||
if WE = '0' then -- if READ requested
|
||||
iaddr_ce := '1'; -- latch address and be's
|
||||
imem_ce := "11"; -- ce SRAM next cycle
|
||||
imem_oe := '1'; -- oe SRAM next cycle
|
||||
n.state := s_read; -- next: continue read
|
||||
else -- if WRITE requested
|
||||
iaddr_ce := '1'; -- latch address and be's
|
||||
idata_ceo := '1'; -- latch output data
|
||||
imem_be := BE; -- use request BE's
|
||||
n.state := s_bta_r2w; -- next: bus turn around cycle
|
||||
end if;
|
||||
else
|
||||
n.state := s_idle; -- next: idle if nothing to do
|
||||
end if;
|
||||
|
||||
when s_write1 => -- s_write1: write cycle, 1st half
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactw := '1'; -- signal mem write
|
||||
idata_oe := '1'; -- oe FPGA next cycle
|
||||
imem_ce := "11"; -- ce SRAM next cycle
|
||||
imem_we := '1'; -- we SRAM next shifted cycle
|
||||
n.state := s_write2; -- next: write cycle, 2nd half
|
||||
|
||||
when s_write2 => -- s_write2: write cycle, 2nd half
|
||||
iactw := '1'; -- signal mem write
|
||||
iackw := '1'; -- signal write acknowledge
|
||||
idata_cei := '1'; -- latch input data (from SRAM)
|
||||
if REQ = '1' then -- if IO requested
|
||||
if WE = '1' then -- if WRITE requested
|
||||
iaddr_ce := '1'; -- latch address and be's
|
||||
idata_ceo := '1'; -- latch output data
|
||||
idata_oe := '1'; -- oe FPGA next cycle
|
||||
imem_ce := "11"; -- ce SRAM next cycle
|
||||
imem_be := BE; -- use request BE's
|
||||
n.state := s_write1; -- next: continue read
|
||||
else -- if READ requested
|
||||
iaddr_ce := '1'; -- latch address and be's
|
||||
n.state := s_bta_w2r; -- next: bus turn around cycle
|
||||
end if;
|
||||
else
|
||||
n.state := s_idle; -- next: idle if nothing to do
|
||||
end if;
|
||||
|
||||
when s_bta_r2w => -- s_bta_r2w: bus turn around: r->w
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactw := '1'; -- signal mem write
|
||||
imem_ce := "11"; -- ce SRAM next cycle
|
||||
idata_oe := '1'; -- oe FPGA next cycle
|
||||
n.state := s_write1; -- next: start write
|
||||
|
||||
when s_bta_w2r => -- s_bta_w2r: bus turn around: w->r
|
||||
ibusy := '1'; -- signal busy, unable to handle req
|
||||
iactr := '1'; -- signal mem read
|
||||
imem_ce := "11"; -- ce SRAM next cycle
|
||||
imem_oe := '1'; -- oe SRAM next cycle
|
||||
n.state := s_read; -- next: start read
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
MEM_CE_N <= not imem_ce;
|
||||
MEM_WE_N <= not imem_we;
|
||||
MEM_BE_N <= not imem_be;
|
||||
MEM_OE_N <= not imem_oe;
|
||||
ADDR_CE <= iaddr_ce;
|
||||
DATA_CEI <= idata_cei;
|
||||
DATA_CEO <= idata_ceo;
|
||||
DATA_OE <= idata_oe;
|
||||
|
||||
BUSY <= ibusy;
|
||||
ACK_R <= r.ackr;
|
||||
ACK_W <= iackw;
|
||||
ACT_R <= iactr;
|
||||
ACT_W <= iactw;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
end syn;
|
||||
15
rtl/bplib/s3board/s3board_a2_pm1_rs232.ucf
Normal file
15
rtl/bplib/s3board/s3board_a2_pm1_rs232.ucf
Normal file
@@ -0,0 +1,15 @@
|
||||
## $Id: s3board_a2_pm1_rs232.ucf 311 2010-06-30 17:52:37Z mueller $
|
||||
##
|
||||
## Revision History:
|
||||
## Date Rev Version Comment
|
||||
## 2010-05-22 293 1.1 Rename PM1 -> FUSP
|
||||
## 2010-04-24 281 1.0 Initial version
|
||||
##
|
||||
## expansion connector A2 / slot PMod 1 / usage RS232 for FTDI USB serport ---
|
||||
##
|
||||
## PmodRS232: pins: 1 RTS; 2 CTS; 3 RXD; 4 TXD; 5 GND; 6 VCC
|
||||
##
|
||||
NET "O_FUSP_RTS_N" LOC = "c6" | IOSTANDARD=LVCMOS33 | DRIVE=4 | SLEW=SLOW;
|
||||
NET "I_FUSP_CTS_N" LOC = "e7" | IOSTANDARD=LVCMOS33 | PULLDOWN;
|
||||
NET "I_FUSP_RXD" LOC = "c7" | IOSTANDARD=LVCMOS33 | PULLUP;
|
||||
NET "O_FUSP_TXD" LOC = "d7" | IOSTANDARD=LVCMOS33 | DRIVE=4 | SLEW=SLOW;
|
||||
132
rtl/bplib/s3board/s3board_pins.ucf
Normal file
132
rtl/bplib/s3board/s3board_pins.ucf
Normal file
@@ -0,0 +1,132 @@
|
||||
## $Id: s3board_pins.ucf 311 2010-06-30 17:52:37Z mueller $
|
||||
##
|
||||
## Pin locks for S3BOARD core functionality:
|
||||
## internal RS232
|
||||
## human I/O (switches, buttons, leds, display)
|
||||
## sram
|
||||
##
|
||||
## Revision History:
|
||||
## Date Rev Version Comment
|
||||
## 2008-05-25 150 1.1 Use DRIVE=6|SLEW=SLOW|KEEPER for memory data lines
|
||||
## 2008-02-17 101 1.0 Initial version
|
||||
##
|
||||
## Note: default is DRIVE=12 | SLEW=SLOW
|
||||
##
|
||||
## clocks --------------------------------------------------------------------
|
||||
NET "CLK" LOC = "t9" | IOSTANDARD=LVCMOS33;
|
||||
##
|
||||
## RS232 interface -----------------------------------------------------------
|
||||
NET "I_RXD" LOC = "t13" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_TXD" LOC = "r13" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=SLOW;
|
||||
##
|
||||
## switches and buttons ------------------------------------------------------
|
||||
NET "I_SWI<0>" LOC = "f12" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<1>" LOC = "g12" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<2>" LOC = "h14" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<3>" LOC = "h13" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<4>" LOC = "j14" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<5>" LOC = "j13" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<6>" LOC = "k14" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_SWI<7>" LOC = "k13" | IOSTANDARD=LVCMOS33;
|
||||
##
|
||||
NET "I_BTN<0>" LOC = "m13" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_BTN<1>" LOC = "m14" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_BTN<2>" LOC = "l13" | IOSTANDARD=LVCMOS33;
|
||||
NET "I_BTN<3>" LOC = "l14" | IOSTANDARD=LVCMOS33;
|
||||
##
|
||||
## LEDs ----------------------------------------------------------------------
|
||||
NET "O_LED<0>" LOC = "k12" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<1>" LOC = "p14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<2>" LOC = "l12" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<3>" LOC = "n14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<4>" LOC = "p13" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<5>" LOC = "n12" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<6>" LOC = "p12" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<7>" LOC = "p11" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_LED<*>" DRIVE=12 | SLEW=SLOW;
|
||||
##
|
||||
## 7 segment display ---------------------------------------------------------
|
||||
NET "O_ANO_N<0>" LOC = "d14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_ANO_N<1>" LOC = "g14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_ANO_N<2>" LOC = "f14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_ANO_N<3>" LOC = "e13" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_ANO_N<*>" DRIVE=12 | SLEW=SLOW;
|
||||
##
|
||||
NET "O_SEG_N<0>" LOC = "e14" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<1>" LOC = "g13" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<2>" LOC = "n15" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<3>" LOC = "p15" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<4>" LOC = "r16" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<5>" LOC = "f13" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<6>" LOC = "n16" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<7>" LOC = "p16" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_SEG_N<*>" DRIVE=12 | SLEW=SLOW;
|
||||
##
|
||||
## SRAM ----------------------------------------------------------------------
|
||||
NET "O_MEM_CE_N<0>" LOC = "p7" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_CE_N<1>" LOC = "n5" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_CE_N<*>" DRIVE=12 | SLEW=FAST;
|
||||
##
|
||||
NET "O_MEM_BE_N<0>" LOC = "p6" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_BE_N<1>" LOC = "t4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_BE_N<2>" LOC = "p5" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_BE_N<3>" LOC = "r4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_BE_N<*>" DRIVE=12 | SLEW=FAST;
|
||||
##
|
||||
NET "O_MEM_WE_N" LOC = "g3" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=FAST;
|
||||
NET "O_MEM_OE_N" LOC = "k4" | IOSTANDARD=LVCMOS33 | DRIVE=12 | SLEW=FAST;
|
||||
##
|
||||
NET "O_MEM_ADDR<0>" LOC = "l5" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<1>" LOC = "n3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<2>" LOC = "m4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<3>" LOC = "m3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<4>" LOC = "l4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<5>" LOC = "g4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<6>" LOC = "f3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<7>" LOC = "f4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<8>" LOC = "e3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<9>" LOC = "e4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<10>" LOC = "g5" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<11>" LOC = "h3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<12>" LOC = "h4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<13>" LOC = "j4" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<14>" LOC = "j3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<15>" LOC = "k3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<16>" LOC = "k5" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<17>" LOC = "l3" | IOSTANDARD=LVCMOS33;
|
||||
NET "O_MEM_ADDR<*>" DRIVE=6 | SLEW=FAST;
|
||||
##
|
||||
NET "IO_MEM_DATA<0>" LOC = "n7" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<1>" LOC = "t8" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<2>" LOC = "r6" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<3>" LOC = "t5" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<4>" LOC = "r5" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<5>" LOC = "c2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<6>" LOC = "c1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<7>" LOC = "b1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<8>" LOC = "d3" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<9>" LOC = "p8" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<10>" LOC = "f2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<11>" LOC = "h1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<12>" LOC = "j2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<13>" LOC = "l2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<14>" LOC = "p1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<15>" LOC = "r1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<16>" LOC = "p2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<17>" LOC = "n2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<18>" LOC = "m2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<19>" LOC = "k1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<20>" LOC = "j1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<21>" LOC = "g2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<22>" LOC = "e1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<23>" LOC = "d1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<24>" LOC = "d2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<25>" LOC = "e2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<26>" LOC = "g1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<27>" LOC = "f5" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<28>" LOC = "c3" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<29>" LOC = "k2" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<30>" LOC = "m1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<31>" LOC = "n1" | IOSTANDARD=LVCMOS33;
|
||||
NET "IO_MEM_DATA<*>" DRIVE=6 | SLEW=SLOW | KEEPER;
|
||||
##
|
||||
4
rtl/bplib/s3board/s3boardlib.vbom
Normal file
4
rtl/bplib/s3board/s3boardlib.vbom
Normal file
@@ -0,0 +1,4 @@
|
||||
# libs
|
||||
../../vlib/slvtypes.vhd
|
||||
../../vlib/rri/rrilib.vhd
|
||||
s3boardlib.vhd
|
||||
219
rtl/bplib/s3board/s3boardlib.vhd
Normal file
219
rtl/bplib/s3board/s3boardlib.vhd
Normal file
@@ -0,0 +1,219 @@
|
||||
-- $Id: s3boardlib.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Package Name: s3boardlib
|
||||
-- Description: S3BOARD components
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 11.4; ghdl 0.18-0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-03 300 1.3 add s3_humanio_rri (now needs rrilib)
|
||||
-- 2010-05-21 292 1.2.2 rename _PM1_ -> _FUSP_
|
||||
-- 2010-05-16 291 1.2.1 rename memctl_s3sram -> s3_sram_memctl; _usp->_fusp
|
||||
-- 2010-05-01 286 1.2 added s3board_usp_aif (base+pm1_rs232)
|
||||
-- 2010-04-17 278 1.1.6 rename, prefix dispdrv,sram_summy with s3_;
|
||||
-- add s3_rs232_iob_(int|ext|int_ext)
|
||||
-- 2010-04-11 276 1.1.5 add DEBOUNCE for s3_humanio
|
||||
-- 2010-04-10 275 1.1.4 add s3_humanio
|
||||
-- 2008-02-17 117 1.1.3 memctl_s3sram: use req,we interface
|
||||
-- 2008-01-20 113 1.1.2 rename memdrv -> memctl_s3sram
|
||||
-- 2007-12-16 101 1.1.1 use _N for active low
|
||||
-- 2007-12-09 100 1.1 add sram memory signals; sram_dummy; memdrv
|
||||
-- 2007-09-23 84 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.rrilib.all;
|
||||
|
||||
package s3boardlib is
|
||||
|
||||
component s3board_aif is -- S3BOARD, abstract iface, base
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
I_RXD : in slbit; -- receive data (board view)
|
||||
O_TXD : out slbit; -- transmit data (board view)
|
||||
I_SWI : in slv8; -- s3 switches
|
||||
I_BTN : in slv4; -- s3 buttons
|
||||
O_LED : out slv8; -- s3 leds
|
||||
O_ANO_N : out slv4; -- 7 segment disp: anodes (act.low)
|
||||
O_SEG_N : out slv8; -- 7 segment disp: segments (act.low)
|
||||
O_MEM_CE_N : out slv2; -- sram: chip enables (act.low)
|
||||
O_MEM_BE_N : out slv4; -- sram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- sram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- sram: output enable (act.low)
|
||||
O_MEM_ADDR : out slv18; -- sram: address lines
|
||||
IO_MEM_DATA : inout slv32 -- sram: data lines
|
||||
);
|
||||
end component;
|
||||
|
||||
component s3board_fusp_aif is -- S3BOARD, abstract iface, base+fusp
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
I_RXD : in slbit; -- receive data (board view)
|
||||
O_TXD : out slbit; -- transmit data (board view)
|
||||
I_SWI : in slv8; -- s3 switches
|
||||
I_BTN : in slv4; -- s3 buttons
|
||||
O_LED : out slv8; -- s3 leds
|
||||
O_ANO_N : out slv4; -- 7 segment disp: anodes (act.low)
|
||||
O_SEG_N : out slv8; -- 7 segment disp: segments (act.low)
|
||||
O_MEM_CE_N : out slv2; -- sram: chip enables (act.low)
|
||||
O_MEM_BE_N : out slv4; -- sram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- sram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- sram: output enable (act.low)
|
||||
O_MEM_ADDR : out slv18; -- sram: address lines
|
||||
IO_MEM_DATA : inout slv32; -- sram: data lines
|
||||
O_FUSP_RTS_N : out slbit; -- fusp: rs232 rts_n
|
||||
I_FUSP_CTS_N : in slbit; -- fusp: rs232 cts_n
|
||||
I_FUSP_RXD : in slbit; -- fusp: rs232 rx
|
||||
O_FUSP_TXD : out slbit -- fusp: rs232 tx
|
||||
);
|
||||
end component;
|
||||
|
||||
component s3_dispdrv is -- 7 segment display driver
|
||||
generic (
|
||||
CDWIDTH : positive := 6); -- clk divider width (must be >= 5)
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
DIN : in slv16; -- data
|
||||
DP : in slv4; -- decimal points
|
||||
ANO_N : out slv4; -- anodes (act.low)
|
||||
SEG_N : out slv8 -- segements (act.low)
|
||||
);
|
||||
end component;
|
||||
|
||||
component s3_humanio is -- human i/o handling: swi,btn,led,dsp
|
||||
generic (
|
||||
DEBOUNCE : boolean := true); -- instantiate debouncer for SWI,BTN
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
CE_MSEC : in slbit; -- 1 ms clock enable
|
||||
SWI : out slv8; -- switch settings, debounced
|
||||
BTN : out slv4; -- button settings, debounced
|
||||
LED : in slv8; -- led data
|
||||
DSP_DAT : in slv16; -- display data
|
||||
DSP_DP : in slv4; -- display decimal points
|
||||
I_SWI : in slv8; -- pad-i: switches
|
||||
I_BTN : in slv4; -- pad-i: buttons
|
||||
O_LED : out slv8; -- pad-o: leds
|
||||
O_ANO_N : out slv4; -- pad-o: 7 seg disp: anodes (act.low)
|
||||
O_SEG_N : out slv8 -- pad-o: 7 seg disp: segments (act.low)
|
||||
);
|
||||
end component;
|
||||
|
||||
component s3_humanio_rri is -- human i/o handling with rri intercept
|
||||
generic (
|
||||
DEBOUNCE : boolean := true; -- instantiate debouncer for SWI,BTN
|
||||
RB_ADDR : slv8 := conv_std_logic_vector(2#10000000#,8));
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
CE_MSEC : in slbit; -- 1 ms clock enable
|
||||
RB_MREQ : in rb_mreq_type; -- rbus: request
|
||||
RB_SRES : out rb_sres_type; -- rbus: response
|
||||
SWI : out slv8; -- switch settings, debounced
|
||||
BTN : out slv4; -- button settings, debounced
|
||||
LED : in slv8; -- led data
|
||||
DSP_DAT : in slv16; -- display data
|
||||
DSP_DP : in slv4; -- display decimal points
|
||||
I_SWI : in slv8; -- pad-i: switches
|
||||
I_BTN : in slv4; -- pad-i: buttons
|
||||
O_LED : out slv8; -- pad-o: leds
|
||||
O_ANO_N : out slv4; -- pad-o: 7 seg disp: anodes (act.low)
|
||||
O_SEG_N : out slv8 -- pad-o: 7 seg disp: segments (act.low)
|
||||
);
|
||||
end component;
|
||||
|
||||
component s3_rs232_iob_int is -- iob's for internal rs232
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RXD : out slbit; -- receive data (board view)
|
||||
TXD : in slbit; -- transmit data (board view)
|
||||
I_RXD : in slbit; -- pad-i: receive data (board view)
|
||||
O_TXD : out slbit -- pad-o: transmit data (board view)
|
||||
);
|
||||
end component;
|
||||
|
||||
component s3_rs232_iob_ext is -- iob's for external rs232 (Pmod)
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RXD : out slbit; -- receive data (board view)
|
||||
TXD : in slbit; -- transmit data (board view)
|
||||
CTS_N : out slbit; -- clear to send (act. low)
|
||||
RTS_N : in slbit; -- request to send (act. low)
|
||||
I_RXD : in slbit; -- pad-i: receive data (board view)
|
||||
O_TXD : out slbit; -- pad-o: transmit data (board view)
|
||||
I_CTS_N : in slbit; -- pad-i: clear to send (act. low)
|
||||
O_RTS_N : out slbit -- pad-o: request to send (act. low)
|
||||
);
|
||||
end component;
|
||||
|
||||
component s3_rs232_iob_int_ext is -- iob's for int+ext rs232, with select
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
SEL : in slbit; -- select, '0' for port 0
|
||||
RXD : out slbit; -- receive data (board view)
|
||||
TXD : in slbit; -- transmit data (board view)
|
||||
CTS_N : out slbit; -- clear to send (act. low)
|
||||
RTS_N : in slbit; -- request to send (act. low)
|
||||
I_RXD0 : in slbit; -- pad-i: p0: receive data (board view)
|
||||
O_TXD0 : out slbit; -- pad-o: p0: transmit data (board view)
|
||||
I_RXD1 : in slbit; -- pad-i: p1: receive data (board view)
|
||||
O_TXD1 : out slbit; -- pad-o: p1: transmit data (board view)
|
||||
I_CTS1_N : in slbit; -- pad-i: p1: clear to send (act. low)
|
||||
O_RTS1_N : out slbit -- pad-o: p1: request to send (act. low)
|
||||
);
|
||||
end component;
|
||||
|
||||
component s3_sram_dummy is -- SRAM protection dummy
|
||||
port (
|
||||
O_MEM_CE_N : out slv2; -- sram: chip enables (act.low)
|
||||
O_MEM_BE_N : out slv4; -- sram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- sram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- sram: output enable (act.low)
|
||||
O_MEM_ADDR : out slv18; -- sram: address lines
|
||||
IO_MEM_DATA : inout slv32 -- sram: data lines
|
||||
);
|
||||
end component;
|
||||
|
||||
component s3_sram_memctl is -- SRAM driver
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
REQ : in slbit; -- request
|
||||
WE : in slbit; -- write enable
|
||||
BUSY : out slbit; -- controller busy
|
||||
ACK_R : out slbit; -- acknowledge read
|
||||
ACK_W : out slbit; -- acknowledge write
|
||||
ACT_R : out slbit; -- signal active read
|
||||
ACT_W : out slbit; -- signal active write
|
||||
ADDR : in slv18; -- address
|
||||
BE : in slv4; -- byte enable
|
||||
DI : in slv32; -- data in (memory view)
|
||||
DO : out slv32; -- data out (memory view)
|
||||
O_MEM_CE_N : out slv2; -- sram: chip enables (act.low)
|
||||
O_MEM_BE_N : out slv4; -- sram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- sram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- sram: output enable (act.low)
|
||||
O_MEM_ADDR : out slv18; -- sram: address lines
|
||||
IO_MEM_DATA : inout slv32 -- sram: data lines
|
||||
);
|
||||
end component;
|
||||
|
||||
end s3boardlib;
|
||||
13
rtl/bplib/s3board/tb/.cvsignore
Normal file
13
rtl/bplib/s3board/tb/.cvsignore
Normal file
@@ -0,0 +1,13 @@
|
||||
tb_s3board_dummy
|
||||
tb_s3board_dummy_[sft]sim
|
||||
tb_s3board_dummy_ISim
|
||||
tb_s3board_dummy_ISim_[sft]sim
|
||||
tb_s3board_fusp_dummy
|
||||
tb_rriext_fifo_rx
|
||||
tb_rriext_fifo_tx
|
||||
tb_rriext_conf
|
||||
tb_s3_sram_memctl
|
||||
tb_s3_sram_memctl_[sft]sim
|
||||
tb_s3_sram_memctl_stim
|
||||
tb_s3_sram_memctl_ISim
|
||||
tb_s3_sram_memctl_ISim_[sft]sim
|
||||
35
rtl/bplib/s3board/tb/Makefile
Normal file
35
rtl/bplib/s3board/tb/Makefile
Normal file
@@ -0,0 +1,35 @@
|
||||
# $Id: Makefile 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2010-05-16 291 1.2.2 rename tb_memctl_s3sram->tb_s3_sram_memctl
|
||||
# 2010-05-01 286 1.2.1 add tb_s3board_usp_dummy
|
||||
# 2009-11-21 252 1.2 add ISim support
|
||||
# 2007-11-26 98 1.1 use make includes
|
||||
# 2007-09-23 84 1.0 Initial version
|
||||
#
|
||||
EXE_all = tb_s3board_dummy tb_s3board_fusp_dummy tb_s3_sram_memctl
|
||||
#
|
||||
ISE_PATH = xc3s1000-ft256-4
|
||||
#
|
||||
.phony : all all_ssim all_tsim clean
|
||||
#
|
||||
all : $(EXE_all)
|
||||
all_ssim : $(EXE_all:=_ssim)
|
||||
all_tsim : $(EXE_all:=_tsim)
|
||||
#
|
||||
clean : ise_clean ghdl_clean isim_clean
|
||||
#
|
||||
#-----
|
||||
#
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.ghdl
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.isim
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.xflow
|
||||
#
|
||||
VBOM_all = $(wildcard *.vbom)
|
||||
#
|
||||
include $(VBOM_all:.vbom=.dep_xst)
|
||||
include $(VBOM_all:.vbom=.dep_ghdl)
|
||||
include $(VBOM_all:.vbom=.dep_isim)
|
||||
include $(wildcard *.o.dep_ghdl)
|
||||
#
|
||||
10
rtl/bplib/s3board/tb/tb_s3board_core.vbom
Normal file
10
rtl/bplib/s3board/tb/tb_s3board_core.vbom
Normal file
@@ -0,0 +1,10 @@
|
||||
# libs
|
||||
../../../vlib/slvtypes.vhd
|
||||
../../../vlib/serport/serport.vhd
|
||||
../../../vlib/simlib/simbus.vhd
|
||||
# components
|
||||
../../../vlib/serport/serport_uart_rx.vbom
|
||||
../../../vlib/serport/serport_uart_tx.vbom
|
||||
../../issi/is61lv25616al.vbom
|
||||
# design
|
||||
tb_s3board_core.vhd
|
||||
100
rtl/bplib/s3board/tb/tb_s3board_core.vhd
Normal file
100
rtl/bplib/s3board/tb/tb_s3board_core.vhd
Normal file
@@ -0,0 +1,100 @@
|
||||
-- $Id: tb_s3board_core.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: tb_s3board_core - sim
|
||||
-- Description: Test bench for s3board - core device handling
|
||||
--
|
||||
-- Dependencies: vlib/parts/issi/is61lv25616al
|
||||
--
|
||||
-- To test: generic, any s3board target
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-02 287 1.0.1 add sbaddr_(swi|btn) defs, now sbus addr 16,17
|
||||
-- 2010-04-24 282 1.0 Initial version (from vlib/s3board/tb/tb_s3board)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
use ieee.std_logic_textio.all;
|
||||
use std.textio.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.serport.all;
|
||||
use work.simbus.all;
|
||||
|
||||
entity tb_s3board_core is
|
||||
port (
|
||||
I_SWI : out slv8; -- s3 switches
|
||||
I_BTN : out slv4; -- s3 buttons
|
||||
O_MEM_CE_N : in slv2; -- sram: chip enables (act.low)
|
||||
O_MEM_BE_N : in slv4; -- sram: byte enables (act.low)
|
||||
O_MEM_WE_N : in slbit; -- sram: write enable (act.low)
|
||||
O_MEM_OE_N : in slbit; -- sram: output enable (act.low)
|
||||
O_MEM_ADDR : in slv18; -- sram: address lines
|
||||
IO_MEM_DATA : inout slv32 -- sram: data lines
|
||||
);
|
||||
end tb_s3board_core;
|
||||
|
||||
architecture sim of tb_s3board_core is
|
||||
|
||||
signal R_SWI : slv8 := (others=>'0');
|
||||
signal R_BTN : slv4 := (others=>'0');
|
||||
|
||||
constant sbaddr_swi: slv8 := conv_std_logic_vector( 16,8);
|
||||
constant sbaddr_btn: slv8 := conv_std_logic_vector( 17,8);
|
||||
|
||||
begin
|
||||
|
||||
MEM_L : entity work.is61lv25616al
|
||||
port map (
|
||||
CE_N => O_MEM_CE_N(0),
|
||||
OE_N => O_MEM_OE_N,
|
||||
WE_N => O_MEM_WE_N,
|
||||
UB_N => O_MEM_BE_N(1),
|
||||
LB_N => O_MEM_BE_N(0),
|
||||
ADDR => O_MEM_ADDR,
|
||||
DATA => IO_MEM_DATA(15 downto 0)
|
||||
);
|
||||
|
||||
MEM_U : entity work.is61lv25616al
|
||||
port map (
|
||||
CE_N => O_MEM_CE_N(1),
|
||||
OE_N => O_MEM_OE_N,
|
||||
WE_N => O_MEM_WE_N,
|
||||
UB_N => O_MEM_BE_N(3),
|
||||
LB_N => O_MEM_BE_N(2),
|
||||
ADDR => O_MEM_ADDR,
|
||||
DATA => IO_MEM_DATA(31 downto 16)
|
||||
);
|
||||
|
||||
proc_simbus: process (SB_VAL)
|
||||
begin
|
||||
if SB_VAL'event and to_x01(SB_VAL)='1' then
|
||||
if SB_ADDR = sbaddr_swi then
|
||||
R_SWI <= to_x01(SB_DATA(R_SWI'range));
|
||||
end if;
|
||||
if SB_ADDR = sbaddr_btn then
|
||||
R_BTN <= to_x01(SB_DATA(R_BTN'range));
|
||||
end if;
|
||||
end if;
|
||||
end process proc_simbus;
|
||||
|
||||
I_SWI <= R_SWI;
|
||||
I_BTN <= R_BTN;
|
||||
|
||||
end sim;
|
||||
20
rtl/bplib/s3board/tb/tb_s3board_fusp.vbom
Normal file
20
rtl/bplib/s3board/tb/tb_s3board_fusp.vbom
Normal file
@@ -0,0 +1,20 @@
|
||||
# Not meant for direct top level usage. Used with
|
||||
# tb_s3board_fusp_(....)[_ssim].vbom and config
|
||||
# lines to generate the different cases.
|
||||
#
|
||||
# libs
|
||||
../../../vlib/slvtypes.vhd
|
||||
../../../vlib/rri/rrilib.vhd
|
||||
../../../vlib/rri/tb/rritblib.vhd
|
||||
../../../vlib/serport/serport.vhd
|
||||
../s3boardlib.vbom
|
||||
../../../vlib/simlib/simlib.vhd
|
||||
../../../vlib/simlib/simbus.vhd
|
||||
# components
|
||||
../../../vlib/rri/tb/rritb_core.vbom
|
||||
tb_s3board_core.vbom
|
||||
../../../vlib/serport/serport_uart_rxtx.vbom
|
||||
s3board_fusp_aif : s3board_fusp_dummy.vbom
|
||||
# design
|
||||
tb_s3board_fusp.vhd
|
||||
@top:tb_s3board_fusp
|
||||
220
rtl/bplib/s3board/tb/tb_s3board_fusp.vhd
Normal file
220
rtl/bplib/s3board/tb/tb_s3board_fusp.vhd
Normal file
@@ -0,0 +1,220 @@
|
||||
-- $Id: tb_s3board_fusp.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: tb_s3board_fusp - sim
|
||||
-- Description: Test bench for s3board (base+fusp)
|
||||
--
|
||||
-- Dependencies: vlib/rri/tb/rritb_core
|
||||
-- tb_s3board_core
|
||||
-- vlib/serport/serport_uart_rxtx
|
||||
-- s3board_fusp_aif [UUT]
|
||||
--
|
||||
-- To test: generic, any s3board_fusp_aif target
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 11.4; ghdl 0.18-0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-21 292 1.0.3 rename _PM1_ -> _FUSP_
|
||||
-- 2010-05-16 291 1.0.2 rename tb_s3board_usp->tb_s3board_fusp
|
||||
-- 2010-05-02 287 1.0.1 add sbaddr_portsel def, now sbus addr 8
|
||||
-- 2010-05-01 286 1.0 Initial version (derived from tb_s3board)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
use ieee.std_logic_textio.all;
|
||||
use std.textio.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.rrilib.all;
|
||||
use work.rritblib.all;
|
||||
use work.serport.all;
|
||||
use work.s3boardlib.all;
|
||||
use work.simlib.all;
|
||||
use work.simbus.all;
|
||||
|
||||
entity tb_s3board_fusp is
|
||||
end tb_s3board_fusp;
|
||||
|
||||
architecture sim of tb_s3board_fusp is
|
||||
|
||||
signal CLK : slbit := '0';
|
||||
|
||||
signal RESET : slbit := '0';
|
||||
signal CLKDIV : slv2 := "00"; -- run with 1 clocks / bit !!
|
||||
signal RXDATA : slv8 := (others=>'0');
|
||||
signal RXVAL : slbit := '0';
|
||||
signal RXERR : slbit := '0';
|
||||
signal RXACT : slbit := '0';
|
||||
signal TXDATA : slv8 := (others=>'0');
|
||||
signal TXENA : slbit := '0';
|
||||
signal TXBUSY : slbit := '0';
|
||||
|
||||
signal RX_HOLD : slbit := '0';
|
||||
|
||||
signal I_RXD : slbit := '1';
|
||||
signal O_TXD : slbit := '1';
|
||||
signal I_SWI : slv8 := (others=>'0');
|
||||
signal I_BTN : slv4 := (others=>'0');
|
||||
signal O_LED : slv8 := (others=>'0');
|
||||
signal O_ANO_N : slv4 := (others=>'0');
|
||||
signal O_SEG_N : slv8 := (others=>'0');
|
||||
|
||||
signal O_MEM_CE_N : slv2 := (others=>'1');
|
||||
signal O_MEM_BE_N : slv4 := (others=>'1');
|
||||
signal O_MEM_WE_N : slbit := '1';
|
||||
signal O_MEM_OE_N : slbit := '1';
|
||||
signal O_MEM_ADDR : slv18 := (others=>'Z');
|
||||
signal IO_MEM_DATA : slv32 := (others=>'0');
|
||||
|
||||
signal O_FUSP_RTS_N : slbit := '0';
|
||||
signal I_FUSP_CTS_N : slbit := '0';
|
||||
signal I_FUSP_RXD : slbit := '1';
|
||||
signal O_FUSP_TXD : slbit := '1';
|
||||
|
||||
signal UART_RESET : slbit := '0';
|
||||
signal UART_RXD : slbit := '1';
|
||||
signal UART_TXD : slbit := '1';
|
||||
signal CTS_N : slbit := '0';
|
||||
signal RTS_N : slbit := '0';
|
||||
|
||||
signal R_PORTSEL : slbit := '0';
|
||||
|
||||
constant sbaddr_portsel: slv8 := conv_std_logic_vector( 8,8);
|
||||
|
||||
constant clock_period : time := 20 ns;
|
||||
constant clock_offset : time := 200 ns;
|
||||
constant setup_time : time := 5 ns;
|
||||
constant c2out_time : time := 10 ns;
|
||||
|
||||
begin
|
||||
|
||||
TBCORE : rritb_core
|
||||
generic map (
|
||||
CLK_PERIOD => clock_period,
|
||||
CLK_OFFSET => clock_offset,
|
||||
SETUP_TIME => setup_time,
|
||||
C2OUT_TIME => c2out_time)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RX_DATA => TXDATA,
|
||||
RX_VAL => TXENA,
|
||||
RX_HOLD => RX_HOLD,
|
||||
TX_DATA => RXDATA,
|
||||
TX_ENA => RXVAL
|
||||
);
|
||||
|
||||
RX_HOLD <= TXBUSY or RTS_N; -- back preasure for data flow to tb
|
||||
|
||||
S3CORE : entity work.tb_s3board_core
|
||||
port map (
|
||||
I_SWI => I_SWI,
|
||||
I_BTN => I_BTN,
|
||||
O_MEM_CE_N => O_MEM_CE_N,
|
||||
O_MEM_BE_N => O_MEM_BE_N,
|
||||
O_MEM_WE_N => O_MEM_WE_N,
|
||||
O_MEM_OE_N => O_MEM_OE_N,
|
||||
O_MEM_ADDR => O_MEM_ADDR,
|
||||
IO_MEM_DATA => IO_MEM_DATA
|
||||
);
|
||||
|
||||
UUT : s3board_fusp_aif
|
||||
port map (
|
||||
CLK => CLK,
|
||||
I_RXD => I_RXD,
|
||||
O_TXD => O_TXD,
|
||||
I_SWI => I_SWI,
|
||||
I_BTN => I_BTN,
|
||||
O_LED => O_LED,
|
||||
O_ANO_N => O_ANO_N,
|
||||
O_SEG_N => O_SEG_N,
|
||||
O_MEM_CE_N => O_MEM_CE_N,
|
||||
O_MEM_BE_N => O_MEM_BE_N,
|
||||
O_MEM_WE_N => O_MEM_WE_N,
|
||||
O_MEM_OE_N => O_MEM_OE_N,
|
||||
O_MEM_ADDR => O_MEM_ADDR,
|
||||
IO_MEM_DATA => IO_MEM_DATA,
|
||||
O_FUSP_RTS_N => O_FUSP_RTS_N,
|
||||
I_FUSP_CTS_N => I_FUSP_CTS_N,
|
||||
I_FUSP_RXD => I_FUSP_RXD,
|
||||
O_FUSP_TXD => O_FUSP_TXD
|
||||
);
|
||||
|
||||
UART : serport_uart_rxtx
|
||||
generic map (
|
||||
CDWIDTH => CLKDIV'length)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => UART_RESET,
|
||||
CLKDIV => CLKDIV,
|
||||
RXSD => UART_RXD,
|
||||
RXDATA => RXDATA,
|
||||
RXVAL => RXVAL,
|
||||
RXERR => RXERR,
|
||||
RXACT => RXACT,
|
||||
TXSD => UART_TXD,
|
||||
TXDATA => TXDATA,
|
||||
TXENA => TXENA,
|
||||
TXBUSY => TXBUSY
|
||||
);
|
||||
|
||||
proc_port_mux: process (R_PORTSEL, UART_TXD, CTS_N,
|
||||
O_TXD, O_FUSP_TXD, O_FUSP_RTS_N)
|
||||
begin
|
||||
|
||||
if R_PORTSEL = '0' then -- use main board rs232, no flow cntl
|
||||
I_RXD <= UART_TXD; -- write port 0 inputs
|
||||
UART_RXD <= O_TXD; -- get port 0 outputs
|
||||
RTS_N <= '0';
|
||||
I_FUSP_RXD <= '1'; -- port 1 inputs to idle state
|
||||
I_FUSP_CTS_N <= '0';
|
||||
else -- otherwise use pmod1 rs232
|
||||
I_FUSP_RXD <= UART_TXD; -- write port 1 inputs
|
||||
I_FUSP_CTS_N <= CTS_N;
|
||||
UART_RXD <= O_FUSP_TXD; -- get port 1 outputs
|
||||
RTS_N <= O_FUSP_RTS_N;
|
||||
I_RXD <= '1'; -- port 0 inputs to idle state
|
||||
end if;
|
||||
|
||||
end process proc_port_mux;
|
||||
|
||||
proc_moni: process
|
||||
variable oline : line;
|
||||
begin
|
||||
|
||||
loop
|
||||
wait until CLK'event and CLK='1';
|
||||
wait for c2out_time;
|
||||
|
||||
if RXERR = '1' then
|
||||
writetimestamp(oline, SB_CLKCYCLE, " : seen RXERR=1");
|
||||
writeline(output, oline);
|
||||
end if;
|
||||
|
||||
end loop;
|
||||
|
||||
end process proc_moni;
|
||||
|
||||
proc_simbus: process (SB_VAL)
|
||||
begin
|
||||
if SB_VAL'event and to_x01(SB_VAL)='1' then
|
||||
if SB_ADDR = sbaddr_portsel then
|
||||
R_PORTSEL <= to_x01(SB_DATA(0));
|
||||
end if;
|
||||
end if;
|
||||
end process proc_simbus;
|
||||
|
||||
end sim;
|
||||
6
rtl/bplib/s3board/tb/tbw.dat
Normal file
6
rtl/bplib/s3board/tb/tbw.dat
Normal file
@@ -0,0 +1,6 @@
|
||||
# $Id: tbw.dat 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
[tb_s3board_dummy]
|
||||
tb_rriext_fifo_rx = <fifo>
|
||||
tb_rriext_fifo_tx = <fifo>
|
||||
tb_rriext_conf = <null>
|
||||
21
rtl/ibus/Makefile
Normal file
21
rtl/ibus/Makefile
Normal file
@@ -0,0 +1,21 @@
|
||||
# $Id: Makefile 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2008-08-22 161 1.0 Initial version
|
||||
#
|
||||
VBOM_all = $(wildcard *.vbom)
|
||||
NGC_all = $(VBOM_all:.vbom=.ngc)
|
||||
#
|
||||
.phony : all clean
|
||||
#
|
||||
all : $(NGC_all)
|
||||
#
|
||||
clean : ise_clean
|
||||
#
|
||||
#----
|
||||
#
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.xflow
|
||||
#
|
||||
include $(VBOM_all:.vbom=.dep_xst)
|
||||
#
|
||||
5
rtl/ibus/ib_intmap.vbom
Normal file
5
rtl/ibus/ib_intmap.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
# design
|
||||
ib_intmap.vhd
|
||||
138
rtl/ibus/ib_intmap.vhd
Normal file
138
rtl/ibus/ib_intmap.vhd
Normal file
@@ -0,0 +1,138 @@
|
||||
-- $Id: ib_intmap.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2006-2008 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ib_intmap - syn
|
||||
-- Description: pdp11: external interrupt mapper
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: tb/tb_pdp11_core (implicit)
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2008-08-22 161 1.2.1 renamed pdp11_ -> ib_; use iblib
|
||||
-- 2008-01-20 112 1.2 add INTMAP generic to externalize config
|
||||
-- 2008-01-06 111 1.1 add EI_ACK output lines, remove EI_LINE
|
||||
-- 2007-10-12 88 1.0.2 avoid ieee.std_logic_unsigned, use cast to unsigned
|
||||
-- 2007-06-14 56 1.0.1 Use slvtypes.all
|
||||
-- 2007-05-12 26 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity ib_intmap is -- external interrupt mapper
|
||||
generic (
|
||||
INTMAP : intmap_array_type := intmap_array_init);
|
||||
port (
|
||||
EI_REQ : in slv16_1; -- interrupt request lines
|
||||
EI_ACKM : in slbit; -- interrupt acknowledge (from master)
|
||||
EI_ACK : out slv16_1; -- interrupt acknowledge (to requestor)
|
||||
EI_PRI : out slv3; -- interrupt priority
|
||||
EI_VECT : out slv9_2 -- interrupt vector
|
||||
);
|
||||
end ib_intmap;
|
||||
|
||||
architecture syn of ib_intmap is
|
||||
|
||||
signal EI_LINE : slv4 := (others=>'0'); -- external interrupt line
|
||||
|
||||
type intp_type is array (15 downto 0) of slv3;
|
||||
type intv_type is array (15 downto 0) of slv9;
|
||||
|
||||
constant conf_intp : intp_type :=
|
||||
(conv_std_logic_vector(INTMAP(15).pri,3), -- line 15
|
||||
conv_std_logic_vector(INTMAP(14).pri,3), -- line 14
|
||||
conv_std_logic_vector(INTMAP(13).pri,3), -- line 13
|
||||
conv_std_logic_vector(INTMAP(12).pri,3), -- line 12
|
||||
conv_std_logic_vector(INTMAP(11).pri,3), -- line 11
|
||||
conv_std_logic_vector(INTMAP(10).pri,3), -- line 10
|
||||
conv_std_logic_vector(INTMAP( 9).pri,3), -- line 9
|
||||
conv_std_logic_vector(INTMAP( 8).pri,3), -- line 8
|
||||
conv_std_logic_vector(INTMAP( 7).pri,3), -- line 7
|
||||
conv_std_logic_vector(INTMAP( 6).pri,3), -- line 6
|
||||
conv_std_logic_vector(INTMAP( 5).pri,3), -- line 5
|
||||
conv_std_logic_vector(INTMAP( 4).pri,3), -- line 4
|
||||
conv_std_logic_vector(INTMAP( 3).pri,3), -- line 3
|
||||
conv_std_logic_vector(INTMAP( 2).pri,3), -- line 2
|
||||
conv_std_logic_vector(INTMAP( 1).pri,3), -- line 1
|
||||
conv_std_logic_vector( 0,3) -- line 0 (always 0 !!)
|
||||
);
|
||||
|
||||
constant conf_intv : intv_type :=
|
||||
(conv_std_logic_vector(INTMAP(15).vec,9), -- line 15
|
||||
conv_std_logic_vector(INTMAP(14).vec,9), -- line 14
|
||||
conv_std_logic_vector(INTMAP(13).vec,9), -- line 13
|
||||
conv_std_logic_vector(INTMAP(12).vec,9), -- line 12
|
||||
conv_std_logic_vector(INTMAP(11).vec,9), -- line 11
|
||||
conv_std_logic_vector(INTMAP(10).vec,9), -- line 10
|
||||
conv_std_logic_vector(INTMAP( 9).vec,9), -- line 9
|
||||
conv_std_logic_vector(INTMAP( 8).vec,9), -- line 8
|
||||
conv_std_logic_vector(INTMAP( 7).vec,9), -- line 7
|
||||
conv_std_logic_vector(INTMAP( 6).vec,9), -- line 6
|
||||
conv_std_logic_vector(INTMAP( 5).vec,9), -- line 5
|
||||
conv_std_logic_vector(INTMAP( 4).vec,9), -- line 4
|
||||
conv_std_logic_vector(INTMAP( 3).vec,9), -- line 3
|
||||
conv_std_logic_vector(INTMAP( 2).vec,9), -- line 2
|
||||
conv_std_logic_vector(INTMAP( 1).vec,9), -- line 1
|
||||
conv_std_logic_vector( 0,9) -- line 0 (always 0 !!)
|
||||
);
|
||||
|
||||
-- attribute PRIORITY_EXTRACT : string;
|
||||
-- attribute PRIORITY_EXTRACT of EI_LINE : signal is "force";
|
||||
|
||||
begin
|
||||
|
||||
EI_LINE <= "1111" when EI_REQ(15)='1' else
|
||||
"1110" when EI_REQ(14)='1' else
|
||||
"1101" when EI_REQ(13)='1' else
|
||||
"1100" when EI_REQ(12)='1' else
|
||||
"1011" when EI_REQ(11)='1' else
|
||||
"1010" when EI_REQ(10)='1' else
|
||||
"1001" when EI_REQ( 9)='1' else
|
||||
"1000" when EI_REQ( 8)='1' else
|
||||
"0111" when EI_REQ( 7)='1' else
|
||||
"0110" when EI_REQ( 6)='1' else
|
||||
"0101" when EI_REQ( 5)='1' else
|
||||
"0100" when EI_REQ( 4)='1' else
|
||||
"0011" when EI_REQ( 3)='1' else
|
||||
"0010" when EI_REQ( 2)='1' else
|
||||
"0001" when EI_REQ( 1)='1' else
|
||||
"0000";
|
||||
|
||||
proc_intmap : process (EI_LINE, EI_ACKM)
|
||||
variable iline : integer := 0;
|
||||
variable iei_ack : slv16 := (others=>'0');
|
||||
begin
|
||||
|
||||
iline := conv_integer(unsigned(EI_LINE));
|
||||
|
||||
iei_ack := (others=>'0');
|
||||
if EI_ACKM = '1' then
|
||||
iei_ack(iline) := '1';
|
||||
end if;
|
||||
|
||||
EI_ACK <= iei_ack(EI_ACK'range);
|
||||
EI_PRI <= conf_intp(iline);
|
||||
EI_VECT <= conf_intv(iline)(8 downto 2);
|
||||
|
||||
end process proc_intmap;
|
||||
|
||||
end syn;
|
||||
5
rtl/ibus/ib_sres_or_2.vbom
Normal file
5
rtl/ibus/ib_sres_or_2.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
# design
|
||||
ib_sres_or_2.vhd
|
||||
61
rtl/ibus/ib_sres_or_2.vhd
Normal file
61
rtl/ibus/ib_sres_or_2.vhd
Normal file
@@ -0,0 +1,61 @@
|
||||
-- $Id: ib_sres_or_2.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2008 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ib_sres_or_2 - syn
|
||||
-- Description: ibus: result or, 2 input
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: tb/tb_pdp11_core (implicit)
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2008-08-22 161 1.0.2 renamed pdp11_ibres_ -> ib_sres_; use iblib
|
||||
-- 2008-01-05 110 1.0.1 rename IB_MREQ(ena->req) SRES(sel->ack, hold->busy)
|
||||
-- 2007-12-29 107 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity ib_sres_or_2 is -- ibus result or, 2 input
|
||||
port (
|
||||
IB_SRES_1 : in ib_sres_type; -- ib_sres input 1
|
||||
IB_SRES_2 : in ib_sres_type := ib_sres_init; -- ib_sres input 2
|
||||
IB_SRES_OR : out ib_sres_type -- ib_sres or'ed output
|
||||
);
|
||||
end ib_sres_or_2;
|
||||
|
||||
architecture syn of ib_sres_or_2 is
|
||||
|
||||
begin
|
||||
|
||||
proc_comb : process (IB_SRES_1, IB_SRES_2)
|
||||
begin
|
||||
|
||||
IB_SRES_OR.ack <= IB_SRES_1.ack or
|
||||
IB_SRES_2.ack;
|
||||
IB_SRES_OR.busy <= IB_SRES_1.busy or
|
||||
IB_SRES_2.busy;
|
||||
IB_SRES_OR.dout <= IB_SRES_1.dout or
|
||||
IB_SRES_2.dout;
|
||||
|
||||
end process proc_comb;
|
||||
|
||||
end syn;
|
||||
5
rtl/ibus/ib_sres_or_3.vbom
Normal file
5
rtl/ibus/ib_sres_or_3.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
# design
|
||||
ib_sres_or_3.vhd
|
||||
65
rtl/ibus/ib_sres_or_3.vhd
Normal file
65
rtl/ibus/ib_sres_or_3.vhd
Normal file
@@ -0,0 +1,65 @@
|
||||
-- $Id: ib_sres_or_3.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2008 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ib_sres_or_3 - syn
|
||||
-- Description: ibus: result or, 3 input
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: tb/tb_pdp11_core (implicit)
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2008-08-22 161 1.0.2 renamed pdp11_ibres_ -> ib_sres_; use iblib
|
||||
-- 2008-01-05 110 1.0.1 rename IB_MREQ(ena->req) SRES(sel->ack, hold->busy)
|
||||
-- 2007-12-29 107 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity ib_sres_or_3 is -- ibus result or, 3 input
|
||||
port (
|
||||
IB_SRES_1 : in ib_sres_type; -- ib_sres input 1
|
||||
IB_SRES_2 : in ib_sres_type := ib_sres_init; -- ib_sres input 2
|
||||
IB_SRES_3 : in ib_sres_type := ib_sres_init; -- ib_sres input 3
|
||||
IB_SRES_OR : out ib_sres_type -- ib_sres or'ed output
|
||||
);
|
||||
end ib_sres_or_3;
|
||||
|
||||
architecture syn of ib_sres_or_3 is
|
||||
|
||||
begin
|
||||
|
||||
proc_comb : process (IB_SRES_1, IB_SRES_2, IB_SRES_3)
|
||||
begin
|
||||
|
||||
IB_SRES_OR.ack <= IB_SRES_1.ack or
|
||||
IB_SRES_2.ack or
|
||||
IB_SRES_3.ack;
|
||||
IB_SRES_OR.busy <= IB_SRES_1.busy or
|
||||
IB_SRES_2.busy or
|
||||
IB_SRES_3.busy;
|
||||
IB_SRES_OR.dout <= IB_SRES_1.dout or
|
||||
IB_SRES_2.dout or
|
||||
IB_SRES_3.dout;
|
||||
|
||||
end process proc_comb;
|
||||
|
||||
end syn;
|
||||
5
rtl/ibus/ib_sres_or_4.vbom
Normal file
5
rtl/ibus/ib_sres_or_4.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
# design
|
||||
ib_sres_or_4.vhd
|
||||
69
rtl/ibus/ib_sres_or_4.vhd
Normal file
69
rtl/ibus/ib_sres_or_4.vhd
Normal file
@@ -0,0 +1,69 @@
|
||||
-- $Id: ib_sres_or_4.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2008 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ib_sres_or_4 - syn
|
||||
-- Description: ibus: result or, 4 input
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: tb/tb_pdp11_core (implicit)
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2008-08-22 161 1.0.2 renamed pdp11_ibres_ -> ib_sres_; use iblib
|
||||
-- 2008-01-05 110 1.0.1 rename IB_MREQ(ena->req) SRES(sel->ack, hold->busy)
|
||||
-- 2007-12-29 107 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity ib_sres_or_4 is -- ibus result or, 4 input
|
||||
port (
|
||||
IB_SRES_1 : in ib_sres_type; -- ib_sres input 1
|
||||
IB_SRES_2 : in ib_sres_type := ib_sres_init; -- ib_sres input 2
|
||||
IB_SRES_3 : in ib_sres_type := ib_sres_init; -- ib_sres input 3
|
||||
IB_SRES_4 : in ib_sres_type := ib_sres_init; -- ib_sres input 4
|
||||
IB_SRES_OR : out ib_sres_type -- ib_sres or'ed output
|
||||
);
|
||||
end ib_sres_or_4;
|
||||
|
||||
architecture syn of ib_sres_or_4 is
|
||||
|
||||
begin
|
||||
|
||||
proc_comb : process (IB_SRES_1, IB_SRES_2, IB_SRES_3, IB_SRES_4)
|
||||
begin
|
||||
|
||||
IB_SRES_OR.ack <= IB_SRES_1.ack or
|
||||
IB_SRES_2.ack or
|
||||
IB_SRES_3.ack or
|
||||
IB_SRES_4.ack;
|
||||
IB_SRES_OR.busy <= IB_SRES_1.busy or
|
||||
IB_SRES_2.busy or
|
||||
IB_SRES_3.busy or
|
||||
IB_SRES_4.busy;
|
||||
IB_SRES_OR.dout <= IB_SRES_1.dout or
|
||||
IB_SRES_2.dout or
|
||||
IB_SRES_3.dout or
|
||||
IB_SRES_4.dout;
|
||||
|
||||
end process proc_comb;
|
||||
|
||||
end syn;
|
||||
6
rtl/ibus/ibd_iist.vbom
Normal file
6
rtl/ibus/ibd_iist.vbom
Normal file
@@ -0,0 +1,6 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
ibdlib.vhd
|
||||
# design
|
||||
ibd_iist.vhd
|
||||
678
rtl/ibus/ibd_iist.vhd
Normal file
678
rtl/ibus/ibd_iist.vhd
Normal file
@@ -0,0 +1,678 @@
|
||||
-- $Id: ibd_iist.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2009- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ibd_iist - syn
|
||||
-- Description: ibus dev(loc): IIST
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2009-06-01 223 10.1.03 K39 xc3s1000-4 111 439 0 256 s 9.8
|
||||
-- 2009-06-01 221 10.1.03 K39 xc3s1000-4 111 449 0 258 s 13.3
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2009-06-07 224 0.7 send inverted stc_stp; remove pgc_err; honor msk_im
|
||||
-- also for dcf_dcf and exc_rte; add iist_mreq and
|
||||
-- iist_sreq, boot and lock interfaces
|
||||
-- 2009-06-05 223 0.6 level interrupt, parity logic, exc.ui logic
|
||||
-- st logic modified (partially tested)
|
||||
-- 2009-06-01 221 0.5 Initial version (untested, lock&boot missing)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
use work.ibdlib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
entity ibd_iist is -- ibus dev(loc): IIST
|
||||
-- fixed address: 177500
|
||||
generic (
|
||||
SID : slv2 := "00"); -- self id
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_USEC : in slbit; -- usec pulse
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit; -- interrupt acknowledge
|
||||
IIST_BUS : in iist_bus_type; -- iist bus (input from all iist's)
|
||||
IIST_OUT : out iist_line_type; -- iist output
|
||||
IIST_MREQ : out iist_mreq_type; -- iist->cpu requests
|
||||
IIST_SRES : in iist_sres_type -- cpu->iist responses
|
||||
);
|
||||
end ibd_iist;
|
||||
|
||||
architecture syn of ibd_iist is
|
||||
|
||||
constant ibaddr_iist : slv16 := conv_std_logic_vector(8#177500#,16);
|
||||
|
||||
constant tdlysnd : natural := 150; -- send delay timer
|
||||
|
||||
constant ibaddr_acr : slv1 := "0"; -- acr address offset
|
||||
constant ibaddr_adr : slv1 := "1"; -- adr address offset
|
||||
|
||||
constant acr_ibf_clr : integer := 15; -- clear flag
|
||||
subtype acr_ibf_sid is integer range 9 downto 8; -- self id
|
||||
subtype acr_ibf_ac is integer range 3 downto 0; -- ac code
|
||||
|
||||
constant ac_pge : slv4 := "0000"; -- 0 program generated enables
|
||||
constant ac_pgc : slv4 := "0001"; -- 1 program generated control/status
|
||||
constant ac_ste : slv4 := "0010"; -- 2 sanity timer enables
|
||||
constant ac_stc : slv4 := "0011"; -- 3 sanity timer control/status
|
||||
constant ac_msk : slv4 := "0100"; -- 4 input masks
|
||||
constant ac_pgf : slv4 := "0101"; -- 5 program generated flags
|
||||
constant ac_stf : slv4 := "0110"; -- 6 sanity timer flags
|
||||
constant ac_dcf : slv4 := "0111"; -- 7 disconnect flags
|
||||
constant ac_exc : slv4 := "1000"; -- 10 exceptions
|
||||
constant ac_mtc : slv4 := "1101"; -- 15 maintenance control
|
||||
|
||||
subtype pge_ibf_pbe is integer range 11 downto 8; -- pg boot ena
|
||||
subtype pge_ibf_pie is integer range 3 downto 0; -- pg int ena
|
||||
|
||||
constant pgc_ibf_err : integer := 15; -- error
|
||||
constant pgc_ibf_grj : integer := 14; -- go reject
|
||||
constant pgc_ibf_pgrmr : integer := 13; -- pg req refused
|
||||
constant pgc_ibf_strmr : integer := 12; -- st req refused
|
||||
constant pgc_ibf_rdy : integer := 11; -- ready flag
|
||||
subtype pgc_ibf_sid is integer range 9 downto 8; -- self id
|
||||
constant pgc_ibf_ip : integer := 3; -- int pending
|
||||
constant pgc_ibf_ie : integer := 2; -- int enable
|
||||
constant pgc_ibf_ptp : integer := 1; -- pg parity
|
||||
constant pgc_ibf_go : integer := 0; -- go flag
|
||||
|
||||
subtype ste_ibf_sbe is integer range 11 downto 8; -- st boot enable
|
||||
subtype ste_ibf_sie is integer range 3 downto 0; -- st int enable
|
||||
|
||||
subtype stc_ibf_count is integer range 15 downto 8; -- count
|
||||
constant stc_ibf_tmo : integer := 3; -- timeout
|
||||
constant stc_ibf_lke : integer := 2; -- lockup enable
|
||||
constant stc_ibf_stp : integer := 1; -- st parity
|
||||
constant stc_ibf_enb : integer := 0; -- enable
|
||||
|
||||
subtype msk_ibf_bm is integer range 11 downto 8; -- boot mask
|
||||
subtype msk_ibf_im is integer range 3 downto 0; -- int mask
|
||||
|
||||
subtype pgf_ibf_pbf is integer range 11 downto 8; -- boot flags
|
||||
subtype pgf_ibf_pif is integer range 3 downto 0; -- int flags
|
||||
|
||||
subtype stf_ibf_sbf is integer range 11 downto 8; -- boot flags
|
||||
subtype stf_ibf_sif is integer range 3 downto 0; -- int flags
|
||||
|
||||
subtype dcf_ibf_brk is integer range 11 downto 8; -- break flags
|
||||
subtype dcf_ibf_dcf is integer range 3 downto 0; -- disconnect flags
|
||||
|
||||
subtype exc_ibf_ui is integer range 11 downto 8; -- unexpected int
|
||||
subtype exc_ibf_rte is integer range 3 downto 0; -- transm. error
|
||||
|
||||
constant mtc_ibf_mttp : integer := 11; -- maint. type
|
||||
constant mtc_ibf_mfrm : integer := 10; -- maint. frame err
|
||||
subtype mtc_ibf_mid is integer range 9 downto 8; -- maint. id
|
||||
constant mtc_ibf_dsbt : integer := 3; -- disable boot
|
||||
constant mtc_ibf_enmxd : integer := 2; -- enable maint mux
|
||||
constant mtc_ibf_enmlp : integer := 1; -- enable maint loop
|
||||
constant mtc_ibf_dsdrv : integer := 0; -- disable driver
|
||||
|
||||
type state_type is (
|
||||
s_idle, -- idle state
|
||||
s_clear, -- handle acr clr
|
||||
s_stsnd, -- handle st transmit
|
||||
s_pgsnd -- handle pg transmit
|
||||
);
|
||||
|
||||
type regs_type is record -- state registers
|
||||
acr_ac : slv4; -- acr: ac
|
||||
pge_pbe : slv4; -- pge: pg boot ena
|
||||
pge_pie : slv4; -- pge: pg int ena
|
||||
pgc_grj : slbit; -- pgc: go reject
|
||||
pgc_pgrmr : slbit; -- pgc: pg req refused
|
||||
pgc_strmr : slbit; -- pgc: st req refused
|
||||
pgc_ie : slbit; -- pgc: int enable
|
||||
pgc_ptp : slbit; -- pgc: pg parity
|
||||
ste_sbe : slv4; -- ste: st boot enable
|
||||
ste_sie : slv4; -- ste: st int enable
|
||||
stc_count : slv8; -- stc: count
|
||||
stc_tmo : slbit; -- stc: timeout
|
||||
stc_lke : slbit; -- stc: lockup enable
|
||||
stc_stp : slbit; -- stc: st parity
|
||||
stc_enb : slbit; -- stc: enable
|
||||
msk_bm : slv4; -- msk: boot mask
|
||||
msk_im : slv4; -- msk: int mask
|
||||
pgf_pbf : slv4; -- pgf: boot flags
|
||||
pgf_pif : slv4; -- pgf: int flags
|
||||
stf_sbf : slv4; -- stf: boot flags
|
||||
stf_sif : slv4; -- stf: int flags
|
||||
dcf_brk : slv4; -- dcf: break flags
|
||||
dcf_dcf : slv4; -- dcf: disconnect flags
|
||||
exc_ui : slv4; -- exc: unexpected int
|
||||
exc_rte : slv4; -- exc: transm. error
|
||||
mtc_mttp : slbit; -- mtc: maint. type
|
||||
mtc_mfrm : slbit; -- mtc: maint. frame err
|
||||
mtc_mid : slv2; -- mtc: maint. id
|
||||
mtc_dsbt : slbit; -- mtc: disable boot
|
||||
mtc_enmxd : slbit; -- mtc: enable maint mux
|
||||
mtc_enmlp : slbit; -- mtc: enable maint loop
|
||||
mtc_dsdrv : slbit; -- mtc: disable driver
|
||||
state : state_type; -- state
|
||||
req_clear : slbit; -- request clear
|
||||
req_stsnd : slbit; -- request sanity timer transmit
|
||||
req_pgsnd : slbit; -- request prog. gen. transmit
|
||||
tcnt256 : slv8; -- usec clock divider for st clock
|
||||
tcntsnd : slv8; -- timer for transmit delay
|
||||
req_lock : slbit; -- cpu lock request
|
||||
req_boot : slbit; -- cpu boot request
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
"0000", -- acr_ac
|
||||
"0000","0000", -- pge_pbe, pge_pie
|
||||
'0', -- pgc_grj
|
||||
'0','0', -- pgc_pgrmr, pgc_strmr
|
||||
'0','0', -- pgc_ie, pgc_ptp
|
||||
"0000","0000", -- ste_sbe, ste_sie
|
||||
(others=>'0'), -- stc_count
|
||||
'0','0', -- stc_tmo, stc_lke
|
||||
'0','0', -- stc_stp, stc_enb
|
||||
"0000","0000", -- msk_bm, msk_im
|
||||
"0000","0000", -- pgf_pbf, pgf_pif
|
||||
"0000","0000", -- stf_sbf, stf_sif
|
||||
"0000","0000", -- dcf_brk, dcf_dcf
|
||||
"0000","0000", -- exc_ui, exc_rte
|
||||
'0','0', -- mtc_mttp, mtc_mfrm
|
||||
"00", -- mtc_mid
|
||||
'0','0', -- mtc_dsbt, mtc_enmxd
|
||||
'0','0', -- mtc_enmlp, mtc_dsdrv
|
||||
s_idle, -- state
|
||||
'0', -- req_clear
|
||||
'0','0', -- req_stsnd, req_pgsnd
|
||||
(others=>'0'), -- tcnt256
|
||||
(others=>'0'), -- tcntsnd
|
||||
'0','0' -- req_lock, req_boot
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init;
|
||||
signal N_REGS : regs_type := regs_init;
|
||||
|
||||
begin
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
if CLK'event and CLK='1' then
|
||||
if BRESET = '1' or -- BRESET is 1 for system and ibus reset
|
||||
R_REGS.req_clear='1' then
|
||||
R_REGS <= regs_init; --
|
||||
if RESET = '0' then -- if RESET=0 we do just an ibus reset
|
||||
R_REGS.pgf_pbf <= N_REGS.pgf_pbf; -- don't reset pg boot flags
|
||||
R_REGS.stf_sbf <= N_REGS.stf_sbf; -- don't reset st boot flags
|
||||
R_REGS.tcnt256 <= N_REGS.tcnt256; -- don't reset st clock divider
|
||||
end if;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
end process proc_regs;
|
||||
|
||||
proc_next : process (R_REGS, CE_USEC, IB_MREQ, EI_ACK, EI_ACK,
|
||||
IIST_BUS(0), IIST_BUS(1), IIST_BUS(2), IIST_BUS(3),
|
||||
IIST_SRES)
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable ibsel : slbit := '0';
|
||||
variable ibbusy : slbit := '0';
|
||||
variable idout : slv16 := (others=>'0');
|
||||
variable ibrd : slbit := '0';
|
||||
variable ibw0 : slbit := '0';
|
||||
variable ibw1 : slbit := '0';
|
||||
variable int_or : slbit := '0';
|
||||
variable tcnt256_end : slbit := '0';
|
||||
variable tcntsnd_end : slbit := '0';
|
||||
variable eff_id : slv2 := "00";
|
||||
variable eff_bus : iist_bus_type := iist_bus_init;
|
||||
variable par_err : slbit := '0';
|
||||
variable act_ibit : slbit := '0';
|
||||
variable act_bbit : slbit := '0';
|
||||
variable iout : iist_line_type := iist_line_init;
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
|
||||
ibsel := '0';
|
||||
ibbusy := '0';
|
||||
idout := (others=>'0');
|
||||
ibrd := not IB_MREQ.we;
|
||||
ibw0 := IB_MREQ.we and IB_MREQ.be0;
|
||||
ibw1 := IB_MREQ.we and IB_MREQ.be1;
|
||||
|
||||
int_or := r.pgc_grj or r.pgc_pgrmr or r.pgc_strmr;
|
||||
for i in r.dcf_dcf'range loop
|
||||
int_or := int_or or r.dcf_dcf(i) or
|
||||
r.exc_rte(i) or
|
||||
r.pgf_pif(i) or
|
||||
r.stf_sif(i);
|
||||
end loop; -- i
|
||||
|
||||
tcnt256_end := '0';
|
||||
if CE_USEC='1' and r.stc_enb='1'then -- if st enabled on every usec
|
||||
n.tcnt256 := unsigned(r.tcnt256) + 1; -- advance 8 bit counter
|
||||
if unsigned(r.tcnt256) = 255 then -- if wrap
|
||||
tcnt256_end := '1'; -- signal 256 usec passed
|
||||
end if;
|
||||
end if;
|
||||
|
||||
tcntsnd_end := '0';
|
||||
n.tcntsnd := unsigned(r.tcntsnd) + 1; -- advance send timer counter
|
||||
if unsigned(r.tcntsnd) = tdlysnd-1 then -- if delay time reached
|
||||
tcntsnd_end := '1'; -- signal end
|
||||
end if;
|
||||
|
||||
eff_id := SID; -- effective self-id, normally SID
|
||||
if r.mtc_enmxd = '1' then -- if maint. mux enabled
|
||||
eff_id := r.mtc_mid; -- use maint. id
|
||||
end if;
|
||||
|
||||
eff_bus := IIST_BUS;
|
||||
|
||||
par_err := '0';
|
||||
act_ibit := '0';
|
||||
act_bbit := '0';
|
||||
iout := iist_line_init; -- default state of out line
|
||||
|
||||
-- ibus address decoder
|
||||
if IB_MREQ.req='1' and
|
||||
IB_MREQ.addr(12 downto 2)=ibaddr_iist(12 downto 2) then
|
||||
ibsel := '1';
|
||||
end if;
|
||||
|
||||
-- internal state machine
|
||||
case r.state is
|
||||
when s_idle => -- idle state
|
||||
n.tcntsnd := (others=>'0'); -- keep send delay timer zero
|
||||
if r.req_stsnd = '1' then -- sanity timer request pending
|
||||
n.state := s_stsnd;
|
||||
elsif r.req_pgsnd = '1' then -- prog. gen. request pending
|
||||
n.state := s_pgsnd;
|
||||
end if;
|
||||
|
||||
when s_clear => -- handle acr clr
|
||||
ibbusy := ibsel; -- keep req pending if selected
|
||||
ibsel := '0'; -- but don't process selection
|
||||
-- r.req_clear is set when in this state and cause a reset in prog_regs
|
||||
-- --> n.req_clear := '0';
|
||||
-- --> n.state := s_idle;
|
||||
|
||||
when s_stsnd => -- handle st transmit
|
||||
if tcntsnd_end = '1' then -- send delay expired
|
||||
n.req_stsnd := '0'; -- clear st transmit request
|
||||
iout.req := '1'; -- do transmit
|
||||
iout.stf := '1'; -- signal type = st
|
||||
iout.imask := r.ste_sie; -- int enables
|
||||
iout.bmask := r.ste_sbe; -- boot enables
|
||||
iout.par := not r.stc_stp; -- send parity (odd incl. stf!)
|
||||
iout.frm := '0'; -- frame always ok
|
||||
n.state := s_idle;
|
||||
end if;
|
||||
|
||||
when s_pgsnd => -- handle pg transmit
|
||||
if tcntsnd_end = '1' then -- send delay expired
|
||||
n.req_pgsnd := '0'; -- clear pg transmit request
|
||||
iout.req := '1'; -- do transmit
|
||||
iout.stf := '0'; -- signal type = pg
|
||||
iout.imask := r.pge_pie; -- int enables
|
||||
iout.bmask := r.pge_pbe; -- boot enables
|
||||
iout.par := r.pgc_ptp; -- send parity
|
||||
iout.frm := '0'; -- frame always ok
|
||||
n.state := s_idle;
|
||||
end if;
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
if r.mtc_enmxd = '1' then -- if maintenance mux enabled
|
||||
iout.stf := r.mtc_mttp; -- force type from mtc_mttp
|
||||
iout.frm := r.mtc_mfrm; -- force frame from mtc_mfrm
|
||||
end if;
|
||||
|
||||
-- ibus transactions
|
||||
if ibsel = '1' then
|
||||
|
||||
if IB_MREQ.addr(1 downto 1) = "0" then -- ACR -- access control reg -----
|
||||
|
||||
idout(acr_ibf_sid) := SID;
|
||||
idout(acr_ibf_ac) := r.acr_ac;
|
||||
|
||||
if ibw1 = '1' then
|
||||
if IB_MREQ.din(acr_ibf_clr) = '1' then
|
||||
n.req_clear := '1';
|
||||
n.state := s_clear;
|
||||
end if;
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
n.acr_ac := IB_MREQ.din(acr_ibf_ac);
|
||||
end if;
|
||||
|
||||
else -- ADR -- access data reg --------
|
||||
case r.acr_ac is
|
||||
|
||||
when ac_pge => -- PGE -- program gen enables --------
|
||||
|
||||
idout(pge_ibf_pbe) := r.pge_pbe;
|
||||
idout(pge_ibf_pie) := r.pge_pie;
|
||||
|
||||
if IB_MREQ.we = '1' then
|
||||
|
||||
if r.req_pgsnd = '0' then -- no pg transmit pending
|
||||
if ibw1 = '1' then
|
||||
n.pge_pbe := IB_MREQ.din(pge_ibf_pbe);
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
n.pge_pie := IB_MREQ.din(pge_ibf_pie);
|
||||
end if;
|
||||
else -- if collision with pg transmit
|
||||
n.pgc_pgrmr := '1'; -- set pge refused flag
|
||||
end if;
|
||||
|
||||
end if;
|
||||
|
||||
when ac_pgc => -- PGC -- program gen control/status -
|
||||
|
||||
idout(pgc_ibf_err) := r.pgc_grj or r.pgc_pgrmr or r.pgc_strmr;
|
||||
idout(pgc_ibf_grj) := r.pgc_grj;
|
||||
idout(pgc_ibf_pgrmr) := r.pgc_pgrmr;
|
||||
idout(pgc_ibf_strmr) := r.pgc_strmr;
|
||||
idout(pgc_ibf_rdy) := not r.req_pgsnd;
|
||||
idout(pgc_ibf_sid) := eff_id;
|
||||
idout(pgc_ibf_ip) := int_or;
|
||||
idout(pgc_ibf_ie) := r.pgc_ie;
|
||||
idout(pgc_ibf_ptp) := r.pgc_ptp;
|
||||
|
||||
if ibw1 = '1' then
|
||||
if IB_MREQ.din(pgc_ibf_err) = '1' then -- '1' written into ERR
|
||||
n.pgc_grj := '0'; -- clears GRJ
|
||||
n.pgc_pgrmr := '0'; -- clears PGRMR
|
||||
n.pgc_strmr := '0'; -- clears STRMR
|
||||
end if;
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
n.pgc_ie := IB_MREQ.din(pgc_ibf_ie);
|
||||
n.pgc_ptp := IB_MREQ.din(pgc_ibf_ptp);
|
||||
if IB_MREQ.din(pgc_ibf_go) = '1' then -- GO bit set
|
||||
if r.req_pgsnd = '0' then -- if ready (no pgsnd pend)
|
||||
n.req_pgsnd := '1'; -- request pgsnd
|
||||
else -- if not ready
|
||||
n.pgc_grj := '1'; -- set go reject flag
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when ac_ste => -- STE -- sanity timer enables -------
|
||||
|
||||
idout(ste_ibf_sbe) := r.ste_sbe;
|
||||
idout(ste_ibf_sie) := r.ste_sie;
|
||||
|
||||
if IB_MREQ.we = '1' then
|
||||
|
||||
if r.req_stsnd = '0' then -- no st transmit pending
|
||||
if ibw1 = '1' then
|
||||
n.ste_sbe := IB_MREQ.din(ste_ibf_sbe);
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
n.ste_sie := IB_MREQ.din(ste_ibf_sie);
|
||||
end if;
|
||||
|
||||
else -- if collision with st transmit
|
||||
n.pgc_strmr := '1'; -- set ste refused flag
|
||||
end if;
|
||||
|
||||
end if;
|
||||
|
||||
when ac_stc => -- STC -- sanity timer control/status
|
||||
|
||||
idout(stc_ibf_count) := r.stc_count;
|
||||
idout(stc_ibf_tmo) := r.stc_tmo;
|
||||
idout(stc_ibf_lke) := r.stc_lke;
|
||||
idout(stc_ibf_stp) := r.stc_stp;
|
||||
idout(stc_ibf_enb) := r.stc_enb;
|
||||
|
||||
if ibw1 = '1' then
|
||||
n.stc_count := IB_MREQ.din(stc_ibf_count); -- reset st count
|
||||
n.tcnt256 := (others=>'0'); -- reset usec count
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
if IB_MREQ.din(stc_ibf_tmo) = '1' then -- 1 written into TMO
|
||||
n.stc_tmo := '0';
|
||||
end if;
|
||||
n.stc_lke := IB_MREQ.din(stc_ibf_lke);
|
||||
n.stc_stp := IB_MREQ.din(stc_ibf_stp);
|
||||
n.stc_enb := IB_MREQ.din(stc_ibf_enb);
|
||||
end if;
|
||||
|
||||
when ac_msk => -- MSK -- input masks ----------------
|
||||
|
||||
idout(msk_ibf_bm) := r.msk_bm;
|
||||
idout(msk_ibf_im) := r.msk_im;
|
||||
|
||||
if ibw1 = '1' then
|
||||
n.msk_bm := IB_MREQ.din(msk_ibf_bm);
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
n.msk_im := IB_MREQ.din(msk_ibf_im);
|
||||
end if;
|
||||
|
||||
when ac_pgf => -- PGF -- program generated flags ----
|
||||
|
||||
idout(pgf_ibf_pbf) := r.pgf_pbf;
|
||||
idout(pgf_ibf_pif) := r.pgf_pif;
|
||||
|
||||
if ibw1 = '1' then
|
||||
n.pgf_pbf := r.pgf_pbf and not IB_MREQ.din(pgf_ibf_pbf);
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
n.pgf_pif := r.pgf_pif and not IB_MREQ.din(pgf_ibf_pif);
|
||||
end if;
|
||||
|
||||
when ac_stf => -- STF -- sanity timer flags ---------
|
||||
|
||||
idout(stf_ibf_sbf) := r.stf_sbf;
|
||||
idout(stf_ibf_sif) := r.stf_sif;
|
||||
|
||||
if ibw1 = '1' then
|
||||
n.stf_sbf := r.stf_sbf and not IB_MREQ.din(stf_ibf_sbf);
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
n.stf_sif := r.stf_sif and not IB_MREQ.din(stf_ibf_sif);
|
||||
end if;
|
||||
|
||||
when ac_dcf => -- DCE -- disconnect flags -----------
|
||||
|
||||
idout(dcf_ibf_brk) := r.dcf_brk;
|
||||
idout(dcf_ibf_dcf) := r.dcf_dcf;
|
||||
|
||||
if ibw0 = '1' then
|
||||
n.dcf_dcf := r.dcf_dcf and not IB_MREQ.din(dcf_ibf_dcf);
|
||||
end if;
|
||||
|
||||
when ac_exc => -- EXC -- exceptions -----------------
|
||||
|
||||
idout(exc_ibf_ui) := r.exc_ui;
|
||||
idout(exc_ibf_rte) := r.exc_rte;
|
||||
|
||||
if ibw1 = '1' then
|
||||
n.exc_ui := r.exc_ui and not IB_MREQ.din(exc_ibf_ui);
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
n.exc_rte := r.exc_rte and not IB_MREQ.din(exc_ibf_rte);
|
||||
end if;
|
||||
|
||||
when ac_mtc => -- MTC -- maintenance control --------
|
||||
|
||||
idout(mtc_ibf_mttp) := r.mtc_mttp;
|
||||
idout(mtc_ibf_mfrm) := r.mtc_mfrm;
|
||||
idout(mtc_ibf_mid) := r.mtc_mid;
|
||||
idout(mtc_ibf_dsbt) := r.mtc_dsbt;
|
||||
idout(mtc_ibf_enmxd) := r.mtc_enmxd;
|
||||
idout(mtc_ibf_enmlp) := r.mtc_enmlp;
|
||||
idout(mtc_ibf_dsdrv) := r.mtc_dsdrv;
|
||||
|
||||
if ibw1 = '1' then
|
||||
n.mtc_mttp := IB_MREQ.din(mtc_ibf_mttp);
|
||||
n.mtc_mfrm := IB_MREQ.din(mtc_ibf_mfrm);
|
||||
n.mtc_mid := IB_MREQ.din(mtc_ibf_mid);
|
||||
end if;
|
||||
if ibw0 = '1' then
|
||||
n.mtc_dsbt := IB_MREQ.din(mtc_ibf_dsbt);
|
||||
n.mtc_enmxd := IB_MREQ.din(mtc_ibf_enmxd);
|
||||
n.mtc_enmlp := IB_MREQ.din(mtc_ibf_enmlp);
|
||||
n.mtc_dsdrv := IB_MREQ.din(mtc_ibf_dsdrv);
|
||||
end if;
|
||||
|
||||
when others => -- access to undefined AC code -------
|
||||
null;
|
||||
|
||||
end case;
|
||||
|
||||
if unsigned(r.acr_ac) <= unsigned(ac_exc) then -- if ac 0,..,10
|
||||
if IB_MREQ.dip = '0' then -- if not 1st part of rmw
|
||||
n.acr_ac := unsigned(r.acr_ac) + 1; -- autoincrement
|
||||
end if;
|
||||
end if;
|
||||
|
||||
end if;
|
||||
|
||||
end if;
|
||||
|
||||
-- sanity timer
|
||||
|
||||
if tcnt256_end = '1' then -- if 256 usec expired (and enabled)
|
||||
n.stc_count := unsigned(r.stc_count) - 1;
|
||||
if unsigned(r.stc_count) = 0 then -- if sanity timer expired
|
||||
n.stc_tmo := '1'; -- set timeout flag
|
||||
n.req_stsnd := '1'; -- request st transmit
|
||||
if r.stc_lke = '1' then -- if lockup enabled
|
||||
n.req_lock := '1'; -- request lockup
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- process iist bus inputs
|
||||
|
||||
if r.mtc_enmlp = '1' then -- if mainentance loop
|
||||
for i in eff_bus'range loop
|
||||
eff_bus(i) := iout; -- local signal on all input ports
|
||||
eff_bus(i).dcf := '0'; -- all ports considered connected
|
||||
end loop; -- i
|
||||
end if;
|
||||
|
||||
for i in eff_bus'range loop
|
||||
|
||||
par_err := eff_bus(i).stf xor
|
||||
eff_bus(i).imask(0) xor eff_bus(i).imask(1) xor
|
||||
eff_bus(i).imask(2) xor eff_bus(i).imask(3) xor
|
||||
eff_bus(i).bmask(0) xor eff_bus(i).bmask(1) xor
|
||||
eff_bus(i).bmask(2) xor eff_bus(i).bmask(3) xor
|
||||
not eff_bus(i).par;
|
||||
|
||||
act_ibit := eff_bus(i).imask(conv_integer(unsigned(eff_id)));
|
||||
act_bbit := eff_bus(i).bmask(conv_integer(unsigned(eff_id)));
|
||||
|
||||
n.dcf_brk(i) := eff_bus(i).dcf; -- trace dcf state in brk
|
||||
|
||||
if eff_bus(i).dcf = '1' then -- if disconnected
|
||||
if r.msk_im(i) = '0' then -- if not disabled
|
||||
n.dcf_dcf(i) := '1'; -- set dcf flag
|
||||
end if;
|
||||
|
||||
else -- if connected
|
||||
if eff_bus(i).req = '1' then -- request received ?
|
||||
if eff_bus(i).frm='1' or -- frame error seen ?
|
||||
par_err='1' then -- parity error seen ?
|
||||
if r.msk_im(i) = '0' then -- if not disabled
|
||||
n.exc_rte(i) := '1'; -- set rte flag
|
||||
end if;
|
||||
|
||||
else -- here if valid request seen
|
||||
if act_ibit = '1' then -- interrupt request
|
||||
if r.msk_im(i) = '1' then -- if disabled
|
||||
n.exc_ui(i) := '1'; -- set ui flag
|
||||
else -- if enabled
|
||||
n.req_lock := '0'; -- release lock
|
||||
if eff_bus(i).stf = '0' then -- and pg request
|
||||
n.pgf_pif(i) := '1'; -- set pif flag
|
||||
else -- and st request
|
||||
n.stf_sif(i) := '1'; -- set sif flag
|
||||
end if;
|
||||
end if;
|
||||
end if; -- act_ibit='1'
|
||||
|
||||
if act_bbit = '1' then -- boot request
|
||||
if r.msk_bm(i) = '1' then -- if msk disabled
|
||||
n.exc_ui(i) := '1'; -- set ui flag
|
||||
else -- if msk enabled
|
||||
if r.mtc_dsbt = '0' then -- if mtc enabled
|
||||
n.req_lock := '0'; -- release lock
|
||||
n.req_boot := '1'; -- request boot
|
||||
end if;
|
||||
if eff_bus(i).stf = '0' then -- and pg request
|
||||
n.pgf_pbf(i) := '1'; -- set pbf flag
|
||||
else -- and st request
|
||||
n.stf_sbf(i) := '1'; -- set sbf flag
|
||||
end if;
|
||||
end if;
|
||||
end if; -- act_bbit='1'
|
||||
|
||||
end if;
|
||||
|
||||
end if;
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
-- process cpu->iist responses
|
||||
if IIST_SRES.ack_lock = '1' then
|
||||
n.req_lock := '0';
|
||||
end if;
|
||||
if IIST_SRES.ack_boot = '1' then
|
||||
n.req_boot := '0';
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
IB_SRES.dout <= idout;
|
||||
IB_SRES.ack <= ibsel;
|
||||
IB_SRES.busy <= ibbusy;
|
||||
|
||||
EI_REQ <= r.pgc_ie and int_or;
|
||||
|
||||
if r.mtc_dsdrv = '1' then -- if driver disconnected
|
||||
iout.dcf := '1'; -- set dcf flag
|
||||
iout.req := '0'; -- suppress requests
|
||||
end if;
|
||||
IIST_OUT <= iout; -- and finally send it out...
|
||||
|
||||
IIST_MREQ.lock <= r.req_lock;
|
||||
IIST_MREQ.boot <= r.req_boot;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
|
||||
end syn;
|
||||
5
rtl/ibus/ibd_kw11l.vbom
Normal file
5
rtl/ibus/ibd_kw11l.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
# design
|
||||
ibd_kw11l.vhd
|
||||
161
rtl/ibus/ibd_kw11l.vhd
Normal file
161
rtl/ibus/ibd_kw11l.vhd
Normal file
@@ -0,0 +1,161 @@
|
||||
-- $Id: ibd_kw11l.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2008-2009 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ibd_kw11l - syn
|
||||
-- Description: ibus dev(loc): KW11-L (line clock)
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 10.1; ghdl 0.18-0.25
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2009-07-11 232 10.1.03 K39 xc3s1000-4 8 25 0 15 s 5.3
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2009-06-01 221 1.0.5 BUGFIX: add RESET; don't clear tcnt on ibus reset
|
||||
-- 2008-08-22 161 1.0.4 use iblib; add EI_ACK to proc_next sens. list
|
||||
-- 2008-05-09 144 1.0.3 use intreq flop, use EI_ACK
|
||||
-- 2008-01-20 112 1.0.2 fix proc_next sensitivity list; use BRESET
|
||||
-- 2008-01-06 111 1.0.1 Renamed to ibd_kw11l (RRI_REQ not used)
|
||||
-- 2008-01-05 110 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
entity ibd_kw11l is -- ibus dev(loc): KW11-L (line clock)
|
||||
-- fixed address: 177546
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_MSEC : in slbit; -- msec pulse
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit -- interrupt acknowledge
|
||||
);
|
||||
end ibd_kw11l;
|
||||
|
||||
architecture syn of ibd_kw11l is
|
||||
|
||||
constant ibaddr_kw11l : slv16 := conv_std_logic_vector(8#177546#,16);
|
||||
|
||||
constant lks_ibf_ie : integer := 6;
|
||||
constant lks_ibf_moni : integer := 7;
|
||||
|
||||
constant twidth : natural := 5;
|
||||
constant tdivide : natural := 20;
|
||||
|
||||
type regs_type is record -- state registers
|
||||
ie : slbit; -- interrupt enable
|
||||
moni : slbit; -- monitor bit
|
||||
intreq : slbit; -- interrupt request
|
||||
tcnt : slv(twidth-1 downto 0); -- timer counter
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
'0', -- ie
|
||||
'1', -- moni (set on reset !!)
|
||||
'0', -- intreq
|
||||
(others=>'0') -- tcnt
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init;
|
||||
signal N_REGS : regs_type := regs_init;
|
||||
|
||||
begin
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
if CLK'event and CLK='1' then
|
||||
if BRESET = '1' then -- BRESET is 1 for system and ibus reset
|
||||
R_REGS <= regs_init;
|
||||
if RESET = '0' then -- if RESET=0 we do just an ibus reset
|
||||
R_REGS.tcnt <= N_REGS.tcnt; -- don't clear msec tick counter
|
||||
end if;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
end process proc_regs;
|
||||
|
||||
proc_next : process (R_REGS, IB_MREQ, CE_MSEC, EI_ACK)
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable ibsel : slbit := '0';
|
||||
variable idout : slv16 := (others=>'0');
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
|
||||
ibsel := '0';
|
||||
idout := (others=>'0');
|
||||
|
||||
-- ibus address decoder
|
||||
if IB_MREQ.req='1' and IB_MREQ.addr=ibaddr_kw11l(12 downto 1) then
|
||||
ibsel := '1';
|
||||
end if;
|
||||
|
||||
-- ibus output driver
|
||||
if ibsel = '1' then
|
||||
idout(lks_ibf_ie) := R_REGS.ie;
|
||||
idout(lks_ibf_moni) := R_REGS.moni;
|
||||
end if;
|
||||
|
||||
-- ibus write transactions
|
||||
if ibsel='1' and IB_MREQ.we='1' and IB_MREQ.be0='1' then
|
||||
n.ie := IB_MREQ.din(lks_ibf_ie);
|
||||
n.moni := IB_MREQ.din(lks_ibf_moni);
|
||||
if IB_MREQ.din(lks_ibf_ie)='0' or IB_MREQ.din(lks_ibf_moni)='0' then
|
||||
n.intreq := '0';
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- other state changes
|
||||
if CE_MSEC = '1' then
|
||||
n.tcnt := unsigned(r.tcnt) + 1;
|
||||
if unsigned(r.tcnt) = tdivide-1 then
|
||||
n.tcnt := (others=>'0');
|
||||
n.moni := '1';
|
||||
if r.ie = '1' then
|
||||
n.intreq := '1';
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
if EI_ACK = '1' then
|
||||
n.intreq := '0';
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
IB_SRES.dout <= idout;
|
||||
IB_SRES.ack <= ibsel;
|
||||
IB_SRES.busy <= '0';
|
||||
|
||||
EI_REQ <= r.intreq;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
end syn;
|
||||
268
rtl/ibus/ibdlib.vhd
Normal file
268
rtl/ibus/ibdlib.vhd
Normal file
@@ -0,0 +1,268 @@
|
||||
-- $Id: ibdlib.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2008-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Package Name: ibdlib
|
||||
-- Description: Definitions for ibus devices
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-11 303 1.1 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2009-07-12 233 1.0.5 add RESET, CE_USEC to _dl11, CE_USEC to _minisys
|
||||
-- 2009-06-07 224 1.0.4 add iist_mreq and iist_sreq;
|
||||
-- 2009-06-01 221 1.0.3 add RESET to kw11l; add iist;
|
||||
-- 2009-05-30 220 1.0.2 add most additional device def's
|
||||
-- 2009-05-24 219 1.0.1 add CE_MSEC to _rk11; add _maxisys
|
||||
-- 2008-08-22 161 1.0 Initial version (extracted from pdp11.vhd)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
package ibdlib is
|
||||
|
||||
type iist_line_type is record -- iist line
|
||||
dcf : slbit; -- disconnect flag
|
||||
req : slbit; -- request
|
||||
stf : slbit; -- sanity timer flag
|
||||
imask : slv4; -- interrupt mask
|
||||
bmask : slv4; -- boot mask
|
||||
par : slbit; -- parity (odd)
|
||||
frm : slbit; -- frame error flag
|
||||
end record iist_line_type;
|
||||
|
||||
constant iist_line_init : iist_line_type := ('1','0','0',"0000","0000",'0','0');
|
||||
|
||||
type iist_bus_type is array (3 downto 0) of iist_line_type;
|
||||
constant iist_bus_init : iist_bus_type := (others=>iist_line_init);
|
||||
|
||||
type iist_mreq_type is record -- iist->cpu requests
|
||||
lock : slbit; -- lock-up CPU
|
||||
boot : slbit; -- boot-up CPU
|
||||
end record iist_mreq_type;
|
||||
|
||||
constant iist_mreq_init : iist_mreq_type := ('0','0');
|
||||
|
||||
type iist_sres_type is record -- cpu->iist responses
|
||||
ack_lock : slbit; -- release lock
|
||||
ack_boot : slbit; -- boot started
|
||||
end record iist_sres_type;
|
||||
|
||||
constant iist_sres_init : iist_sres_type := ('0','0');
|
||||
|
||||
component ibd_iist is -- ibus dev(loc): IIST
|
||||
-- fixed address: 177500
|
||||
generic (
|
||||
SID : slv2 := "00"); -- self id
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_USEC : in slbit; -- usec pulse
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit; -- interrupt acknowledge
|
||||
IIST_BUS : in iist_bus_type; -- iist bus (input from all iist's)
|
||||
IIST_OUT : out iist_line_type; -- iist output
|
||||
IIST_MREQ : out iist_mreq_type; -- iist->cpu requests
|
||||
IIST_SRES : in iist_sres_type -- cpu->iist responses
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibd_kw11p is -- ibus dev(loc): KW11-P (line clock)
|
||||
-- fixed address: 172540
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_USEC : in slbit; -- usec pulse
|
||||
CE_MSEC : in slbit; -- msec pulse
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit -- interrupt acknowledge
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibd_kw11l is -- ibus dev(loc): KW11-L (line clock)
|
||||
-- fixed address: 177546
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_MSEC : in slbit; -- msec pulse
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit -- interrupt acknowledge
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_rl11 is -- ibus dev(rem): RL11
|
||||
-- fixed address: 174400
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit -- interrupt acknowledge
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_rk11 is -- ibus dev(rem): RK11
|
||||
-- fixed address: 177400
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_MSEC : in slbit; -- msec pulse
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit -- interrupt acknowledge
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_tm11 is -- ibus dev(rem): TM11
|
||||
-- fixed address: 172520
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit -- interrupt acknowledge
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_dz11 is -- ibus dev(rem): DZ11
|
||||
generic (
|
||||
IB_ADDR : slv16 := conv_std_logic_vector(8#160100#,16));
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ_RX : out slbit; -- interrupt request, receiver
|
||||
EI_REQ_TX : out slbit; -- interrupt request, transmitter
|
||||
EI_ACK_RX : in slbit; -- interrupt acknowledge, receiver
|
||||
EI_ACK_TX : in slbit -- interrupt acknowledge, transmitter
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_dl11 is -- ibus dev(rem): DL11-A/B
|
||||
generic (
|
||||
IB_ADDR : slv16 := conv_std_logic_vector(8#177560#,16));
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_USEC : in slbit; -- usec pulse
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ_RX : out slbit; -- interrupt request, receiver
|
||||
EI_REQ_TX : out slbit; -- interrupt request, transmitter
|
||||
EI_ACK_RX : in slbit; -- interrupt acknowledge, receiver
|
||||
EI_ACK_TX : in slbit -- interrupt acknowledge, transmitter
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_pc11 is -- ibus dev(rem): PC11
|
||||
-- fixed address: 177550
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ_PTR : out slbit; -- interrupt request, reader
|
||||
EI_REQ_PTP : out slbit; -- interrupt request, punch
|
||||
EI_ACK_PTR : in slbit; -- interrupt acknowledge, reader
|
||||
EI_ACK_PTP : in slbit -- interrupt acknowledge, punch
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_lp11 is -- ibus dev(rem): LP11
|
||||
-- fixed address: 177514
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit -- interrupt acknowledge
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_sdreg is -- ibus dev(rem): Switch/Display regs
|
||||
-- fixed address: 177570
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
DISPREG : out slv16 -- display register
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_minisys is -- ibus(rem) minimal sys:SDR+KW+DL+RK
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_USEC : in slbit; -- usec pulse
|
||||
CE_MSEC : in slbit; -- msec pulse
|
||||
RESET : in slbit; -- reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slv16_1; -- remote attention vector
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_ACKM : in slbit; -- interrupt acknowledge (from master)
|
||||
EI_PRI : out slv3; -- interrupt priority (to cpu)
|
||||
EI_VECT : out slv9_2; -- interrupt vector (to cpu)
|
||||
DISPREG : out slv16 -- display register
|
||||
);
|
||||
end component;
|
||||
|
||||
component ibdr_maxisys is -- ibus(rem) full system
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_USEC : in slbit; -- usec pulse
|
||||
CE_MSEC : in slbit; -- msec pulse
|
||||
RESET : in slbit; -- reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slv16_1; -- remote attention vector
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_ACKM : in slbit; -- interrupt acknowledge (from master)
|
||||
EI_PRI : out slv3; -- interrupt priority (to cpu)
|
||||
EI_VECT : out slv9_2; -- interrupt vector (to cpu)
|
||||
DISPREG : out slv16 -- display register
|
||||
);
|
||||
end component;
|
||||
|
||||
end package ibdlib;
|
||||
5
rtl/ibus/ibdr_dl11.vbom
Normal file
5
rtl/ibus/ibdr_dl11.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
# design
|
||||
ibdr_dl11.vhd
|
||||
341
rtl/ibus/ibdr_dl11.vhd
Normal file
341
rtl/ibus/ibdr_dl11.vhd
Normal file
@@ -0,0 +1,341 @@
|
||||
-- $Id: ibdr_dl11.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2008-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ibdr_dl11 - syn
|
||||
-- Description: ibus dev(rem): DL11-A/B
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 10.1; ghdl 0.18-0.25
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2009-07-12 233 10.1.03 K39 xc3s1000-4 38 119 0 69 s 6.3
|
||||
-- 2009-07-11 232 10.1.03 K39 xc3s1000-4 23 61 0 40 s 5.5
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-11 303 1.1 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2009-07-12 233 1.0.5 add RESET, CE_USEC port; implement input rate limit
|
||||
-- 2008-08-22 161 1.0.6 use iblib; add EI_ACK_* to proc_next sens. list
|
||||
-- 2008-05-09 144 1.0.5 use intreq flop, use EI_ACK
|
||||
-- 2008-03-22 128 1.0.4 rename xdone -> xval (no functional change)
|
||||
-- 2008-01-27 115 1.0.3 bugfix: set ilam when rbuf read by cpu;
|
||||
-- add xdone and rrdy bits to rri xbuf read
|
||||
-- 2008-01-20 113 1.0.2 fix maint mode logic (proper double buffer now)
|
||||
-- 2008-01-20 112 1.0.1 use BRESET
|
||||
-- 2008-01-05 108 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
entity ibdr_dl11 is -- ibus dev(rem): DL11-A/B
|
||||
generic (
|
||||
IB_ADDR : slv16 := conv_std_logic_vector(8#177560#,16));
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_USEC : in slbit; -- usec pulse
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ_RX : out slbit; -- interrupt request, receiver
|
||||
EI_REQ_TX : out slbit; -- interrupt request, transmitter
|
||||
EI_ACK_RX : in slbit; -- interrupt acknowledge, receiver
|
||||
EI_ACK_TX : in slbit -- interrupt acknowledge, transmitter
|
||||
);
|
||||
end ibdr_dl11;
|
||||
|
||||
architecture syn of ibdr_dl11 is
|
||||
|
||||
constant ibaddr_rcsr : slv2 := "00"; -- rcsr address offset
|
||||
constant ibaddr_rbuf : slv2 := "01"; -- rbuf address offset
|
||||
constant ibaddr_xcsr : slv2 := "10"; -- xcsr address offset
|
||||
constant ibaddr_xbuf : slv2 := "11"; -- xbuf address offset
|
||||
|
||||
subtype rcsr_ibf_rrlim is integer range 14 downto 12;
|
||||
constant rcsr_ibf_rdone : integer := 7;
|
||||
constant rcsr_ibf_rie : integer := 6;
|
||||
|
||||
constant xcsr_ibf_xrdy : integer := 7;
|
||||
constant xcsr_ibf_xie : integer := 6;
|
||||
constant xcsr_ibf_xmaint: integer := 2;
|
||||
|
||||
constant xbuf_ibf_xval : integer := 8;
|
||||
constant xbuf_ibf_rrdy : integer := 9;
|
||||
|
||||
type regs_type is record -- state registers
|
||||
rrlim : slv3; -- rcsr: receiver rate limit
|
||||
rdone : slbit; -- rcsr: receiver done
|
||||
rie : slbit; -- rcsr: receiver interrupt enable
|
||||
rbuf : slv8; -- rbuf:
|
||||
rval : slbit; -- rx rbuf valid
|
||||
rintreq : slbit; -- rx interrupt request
|
||||
rdlybsy : slbit; -- rx delay busy
|
||||
rdlycnt : slv10; -- rx delay counter
|
||||
xrdy : slbit; -- xcsr: transmitter ready
|
||||
xie : slbit; -- xcsr: transmitter interrupt enable
|
||||
xmaint : slbit; -- xcsr: maintenance mode
|
||||
xbuf : slv8; -- xbuf:
|
||||
xintreq : slbit; -- tx interrupt request
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
(others=>'0'), -- rrlim
|
||||
'0','0', -- rdone, rie
|
||||
(others=>'0'), -- rbuf
|
||||
'0','0','0', -- rval,rintreq,rdlybsy
|
||||
(others=>'0'), -- rdlycnt
|
||||
'1', -- xrdy !! is set !!
|
||||
'0','0', -- xie,xmaint
|
||||
(others=>'0'), -- xbuf
|
||||
'0' -- xintreq
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init;
|
||||
signal N_REGS : regs_type := regs_init;
|
||||
|
||||
begin
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
if CLK'event and CLK='1' then
|
||||
if BRESET = '1' then
|
||||
R_REGS <= regs_init;
|
||||
if RESET = '0' then -- if RESET=0 we do just an ibus reset
|
||||
R_REGS.rrlim <= N_REGS.rrlim; -- don't reset rx rate limit
|
||||
R_REGS.rdlybsy <= N_REGS.rdlybsy; -- don't reset rx delay busy
|
||||
R_REGS.rdlycnt <= N_REGS.rdlycnt; -- don't reset rx delay counter
|
||||
end if;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
end process proc_regs;
|
||||
|
||||
proc_next : process (CE_USEC, R_REGS, IB_MREQ, EI_ACK_RX, EI_ACK_TX)
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable ibsel : slbit := '0';
|
||||
variable idout : slv16 := (others=>'0');
|
||||
variable ibrd : slbit := '0';
|
||||
variable ibw0 : slbit := '0';
|
||||
variable ibw1 : slbit := '0';
|
||||
variable ilam : slbit := '0';
|
||||
variable rdlystart : slbit := '0';
|
||||
variable rdlyinit : slv10 := (others=>'0');
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
|
||||
ibsel := '0';
|
||||
idout := (others=>'0');
|
||||
ibrd := not IB_MREQ.we;
|
||||
ibw0 := IB_MREQ.we and IB_MREQ.be0;
|
||||
ibw1 := IB_MREQ.we and IB_MREQ.be1;
|
||||
ilam := '0';
|
||||
rdlystart := '0';
|
||||
|
||||
-- ibus address decoder
|
||||
if IB_MREQ.req='1' and IB_MREQ.addr(12 downto 3)=IB_ADDR(12 downto 3) then
|
||||
ibsel := '1';
|
||||
end if;
|
||||
|
||||
-- ibus transactions
|
||||
if ibsel = '1' then
|
||||
case IB_MREQ.addr(2 downto 1) is
|
||||
|
||||
when ibaddr_rcsr => -- RCSR -- receive control status ----
|
||||
idout(rcsr_ibf_rdone) := r.rdone;
|
||||
idout(rcsr_ibf_rie) := r.rie;
|
||||
|
||||
if IB_MREQ.racc = '0' then -- cpu ---------------------
|
||||
if ibw0 = '1' then
|
||||
n.rie := IB_MREQ.din(rcsr_ibf_rie);
|
||||
if IB_MREQ.din(rcsr_ibf_rie) = '1' then
|
||||
if r.rdone='1' and r.rie='0' then -- ie set while done=1
|
||||
n.rintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
else
|
||||
n.rintreq := '0';
|
||||
end if;
|
||||
end if;
|
||||
|
||||
else -- rri ---------------------
|
||||
idout(rcsr_ibf_rrlim) := r.rrlim;
|
||||
if ibw1 = '1' then
|
||||
n.rrlim := IB_MREQ.din(rcsr_ibf_rrlim);
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when ibaddr_rbuf => -- RBUF -- receive data buffer -------
|
||||
|
||||
idout(r.rbuf'range) := r.rbuf;
|
||||
|
||||
if IB_MREQ.racc = '0' then -- cpu ---------------------
|
||||
if ibrd = '1' then
|
||||
n.rdone := '0'; -- clear DONE
|
||||
n.rval := '0'; -- clear rbuf valid
|
||||
n.rintreq := '0'; -- clear pending interrupts
|
||||
rdlystart := '1'; -- start rx delay counter
|
||||
if r.xmaint = '0' then -- if not in loop-back
|
||||
ilam := '1'; -- request rb attention
|
||||
end if;
|
||||
end if;
|
||||
|
||||
else -- rri ---------------------
|
||||
if ibw0 = '1' then
|
||||
n.rbuf := IB_MREQ.din(n.rbuf'range);
|
||||
n.rval := '1'; -- set rbuf valid
|
||||
if r.rdlybsy = '0' then -- if rdly timer not running
|
||||
n.rdone := '1'; -- set DONE
|
||||
if r.rie = '1' then -- if rx interrupt enabled
|
||||
n.rintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when ibaddr_xcsr => -- XCSR -- transmit control status ---
|
||||
|
||||
idout(xcsr_ibf_xrdy) := r.xrdy;
|
||||
idout(xcsr_ibf_xie) := r.xie;
|
||||
idout(xcsr_ibf_xmaint):= r.xmaint;
|
||||
|
||||
if IB_MREQ.racc = '0' then -- cpu ---------------------
|
||||
if ibw0 = '1' then
|
||||
n.xie := IB_MREQ.din(xcsr_ibf_xie);
|
||||
if IB_MREQ.din(xcsr_ibf_xie) = '1' then
|
||||
if r.xrdy='1' and r.xie='0' then -- ie set while ready=1
|
||||
n.xintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
else
|
||||
n.xintreq := '0';
|
||||
end if;
|
||||
n.xmaint := IB_MREQ.din(xcsr_ibf_xmaint);
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when ibaddr_xbuf => -- XBUF -- transmit data buffer ------
|
||||
|
||||
if IB_MREQ.racc = '0' then -- cpu ---------------------
|
||||
if ibw0 = '1' then
|
||||
n.xbuf := IB_MREQ.din(n.xbuf'range);
|
||||
n.xrdy := '0';
|
||||
n.xintreq := '0';
|
||||
if r.xmaint = '0' then
|
||||
ilam := '1';
|
||||
end if;
|
||||
end if;
|
||||
|
||||
else -- rri ---------------------
|
||||
idout(r.xbuf'range) := r.xbuf;
|
||||
if r.xmaint = '0' then -- if not in maintenace mode
|
||||
idout(xbuf_ibf_xval) := not r.xrdy;
|
||||
idout(xbuf_ibf_rrdy) := not r.rval;
|
||||
end if;
|
||||
if ibrd = '1' then
|
||||
n.xrdy := '1';
|
||||
if r.xie = '1' then
|
||||
n.xintreq := '1';
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
else -- if unselected handle loop-back
|
||||
if r.xmaint = '1' and -- if in maintenace mode
|
||||
r.xrdy='0' and -- and transmit pending
|
||||
r.rdone='0' and -- and receive buffer empty
|
||||
r.rdlybsy='0' then -- and rdly timer not running
|
||||
n.rbuf := r.xbuf; -- copy transmit to receive buffer
|
||||
n.xrdy := '1'; -- mark transmit done
|
||||
n.rdone := '1'; -- make receive done
|
||||
if r.rie = '1' then -- if rx interrupt enabled
|
||||
n.rintreq := '1'; -- request it
|
||||
end if;
|
||||
if r.xie = '1' then -- if tx interrupt enabled
|
||||
n.xintreq := '1'; -- request it
|
||||
end if;
|
||||
end if;
|
||||
|
||||
end if;
|
||||
|
||||
-- other state changes
|
||||
|
||||
rdlyinit := (others=>'0');
|
||||
case r.rrlim is
|
||||
when "000" => rdlyinit := "0000000000"; -- rlim=0 -> disabled
|
||||
when "001" => rdlyinit := "0000000011"; -- rlim=1 -> delay by 3+ usec
|
||||
when "010" => rdlyinit := "0000001111"; -- rlim=2 -> delay by 15+ usec
|
||||
when "011" => rdlyinit := "0000111111"; -- rlim=3 -> delay by 63+ usec
|
||||
when "100" => rdlyinit := "0001111111"; -- rlim=4 -> delay by 127+ usec
|
||||
when "101" => rdlyinit := "0011111111"; -- rlim=5 -> delay by 255+ usec
|
||||
when "110" => rdlyinit := "0111111111"; -- rlim=6 -> delay by 511+ usec
|
||||
when "111" => rdlyinit := "1111111111"; -- rlim=7 -> delay by 1023+ usec
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
if rdlystart = '1' then -- if rdly timer start requested
|
||||
n.rdlycnt := rdlyinit; -- init counter
|
||||
if r.rrlim /= "000" then -- rate limiter enabled ?
|
||||
n.rdlybsy := '1'; -- set busy
|
||||
end if;
|
||||
elsif CE_USEC = '1' then -- if end-of-usec
|
||||
n.rdlycnt := unsigned(r.rdlycnt) - 1; -- decrement
|
||||
if r.rdlybsy='1' and -- if delay busy
|
||||
unsigned(r.rdlycnt) = 0 then -- and counter at zero
|
||||
n.rdlybsy := '0'; -- clear busy
|
||||
if n.rval = '1' then -- if rbuf is valid or is set
|
||||
-- valid this cycle (use n.!!)
|
||||
n.rdone := '1'; -- set DONE
|
||||
if r.rie = '1' then -- if rx interrupt enabled
|
||||
n.rintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
if EI_ACK_RX = '1' then
|
||||
n.rintreq := '0';
|
||||
end if;
|
||||
if EI_ACK_TX = '1' then
|
||||
n.xintreq := '0';
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
IB_SRES.dout <= idout;
|
||||
IB_SRES.ack <= ibsel;
|
||||
IB_SRES.busy <= '0';
|
||||
|
||||
RRI_LAM <= ilam;
|
||||
EI_REQ_RX <= r.rintreq;
|
||||
EI_REQ_TX <= r.xintreq;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
|
||||
end syn;
|
||||
5
rtl/ibus/ibdr_lp11.vbom
Normal file
5
rtl/ibus/ibdr_lp11.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
# design
|
||||
ibdr_lp11.vhd
|
||||
205
rtl/ibus/ibdr_lp11.vhd
Normal file
205
rtl/ibus/ibdr_lp11.vhd
Normal file
@@ -0,0 +1,205 @@
|
||||
-- $Id: ibdr_lp11.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2009-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ibdr_lp11 - syn
|
||||
-- Description: ibus dev(rem): LP11
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 10.1; ghdl 0.18-0.25
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2009-07-11 232 10.1.03 K39 xc3s1000-4 11 30 0 19 s 5.8
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-11 303 1.1 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2009-06-21 228 1.0.1 generate interrupt locally when err=1
|
||||
-- 2009-05-30 220 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
-- Notes:
|
||||
-- - the ERR bit is just a status flag
|
||||
-- - no hardware interlock (DONE forced 0 when ERR=1), like in simh
|
||||
-- - also no interrupt when ERR goes 1, like in simh
|
||||
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
entity ibdr_lp11 is -- ibus dev(rem): LP11
|
||||
-- fixed address: 177514
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit -- interrupt acknowledge
|
||||
);
|
||||
end ibdr_lp11;
|
||||
|
||||
architecture syn of ibdr_lp11 is
|
||||
|
||||
constant ibaddr_lp11 : slv16 := conv_std_logic_vector(8#177514#,16);
|
||||
|
||||
constant ibaddr_csr : slv1 := "0"; -- csr address offset
|
||||
constant ibaddr_buf : slv1 := "1"; -- buf address offset
|
||||
|
||||
constant csr_ibf_err : integer := 15;
|
||||
constant csr_ibf_done : integer := 7;
|
||||
constant csr_ibf_ie : integer := 6;
|
||||
constant buf_ibf_val : integer := 8;
|
||||
|
||||
type regs_type is record -- state registers
|
||||
err : slbit; -- csr: error flag
|
||||
done : slbit; -- csr: done flag
|
||||
ie : slbit; -- csr: interrupt enable
|
||||
buf : slv7; -- buf:
|
||||
intreq : slbit; -- interrupt request
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
'1', -- err !! is set !!
|
||||
'1', -- done !! is set !!
|
||||
'0', -- ie
|
||||
(others=>'0'), -- buf
|
||||
'0' -- intreq
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init;
|
||||
signal N_REGS : regs_type := regs_init;
|
||||
|
||||
begin
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
if CLK'event and CLK='1' then
|
||||
if BRESET = '1' then -- BRESET is 1 for system and ibus reset
|
||||
R_REGS <= regs_init;
|
||||
if RESET = '0' then -- if RESET=0 we do just an ibus reset
|
||||
R_REGS.err <= N_REGS.err; -- don't reset ERR flag
|
||||
end if;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
end process proc_regs;
|
||||
|
||||
proc_next : process (R_REGS, IB_MREQ, EI_ACK)
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable ibsel : slbit := '0';
|
||||
variable idout : slv16 := (others=>'0');
|
||||
variable ibrd : slbit := '0';
|
||||
variable ibw0 : slbit := '0';
|
||||
variable ilam : slbit := '0';
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
|
||||
ibsel := '0';
|
||||
idout := (others=>'0');
|
||||
ibrd := not IB_MREQ.we;
|
||||
ibw0 := IB_MREQ.we and IB_MREQ.be0;
|
||||
ilam := '0';
|
||||
|
||||
-- ibus address decoder
|
||||
if IB_MREQ.req='1' and
|
||||
IB_MREQ.addr(12 downto 2)=ibaddr_lp11(12 downto 2) then
|
||||
ibsel := '1';
|
||||
end if;
|
||||
|
||||
-- ibus transactions
|
||||
if ibsel = '1' then
|
||||
case IB_MREQ.addr(1 downto 1) is
|
||||
|
||||
when ibaddr_csr => -- CSR -- control status -------------
|
||||
idout(csr_ibf_err) := r.err;
|
||||
idout(csr_ibf_done) := r.done;
|
||||
idout(csr_ibf_ie) := r.ie;
|
||||
if IB_MREQ.racc = '0' then -- cpu
|
||||
if ibw0 = '1' then
|
||||
n.ie := IB_MREQ.din(csr_ibf_ie);
|
||||
if IB_MREQ.din(csr_ibf_ie) = '1' then
|
||||
if r.done='1' and r.ie='0' then -- ie set while done=1
|
||||
n.intreq := '1'; -- request interrupt
|
||||
end if;
|
||||
else
|
||||
n.intreq := '0';
|
||||
end if;
|
||||
end if;
|
||||
else -- rri
|
||||
n.err := IB_MREQ.din(csr_ibf_err);
|
||||
end if;
|
||||
|
||||
when ibaddr_buf => -- BUF -- data buffer ----------------
|
||||
if IB_MREQ.racc = '0' then -- cpu
|
||||
if ibw0 = '1' then
|
||||
n.buf := IB_MREQ.din(n.buf'range);
|
||||
if r.err = '0' then -- if online (handle via rbus)
|
||||
ilam := '1'; -- request attention
|
||||
n.done := '0'; -- clear done
|
||||
n.intreq := '0'; -- clear interrupt
|
||||
else -- if offline (discard locally)
|
||||
n.done := '1'; -- set done
|
||||
if r.ie = '1' then -- if interrupts enabled
|
||||
n.intreq := '1'; -- request interrupt
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
else -- rri
|
||||
idout(r.buf'range) := r.buf;
|
||||
idout(buf_ibf_val) := not r.done;
|
||||
if ibrd = '1' then
|
||||
n.done := '1';
|
||||
if r.ie = '1' then
|
||||
n.intreq := '1';
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
end if;
|
||||
|
||||
-- other state changes
|
||||
if EI_ACK = '1' then
|
||||
n.intreq := '0';
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
IB_SRES.dout <= idout;
|
||||
IB_SRES.ack <= ibsel;
|
||||
IB_SRES.busy <= '0';
|
||||
|
||||
RRI_LAM <= ilam;
|
||||
EI_REQ <= r.intreq;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
|
||||
end syn;
|
||||
17
rtl/ibus/ibdr_maxisys.vbom
Normal file
17
rtl/ibus/ibdr_maxisys.vbom
Normal file
@@ -0,0 +1,17 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
ibdlib.vhd
|
||||
# components
|
||||
ibd_iist.vbom
|
||||
ibd_kw11l.vbom
|
||||
ibdr_rk11.vbom
|
||||
ibdr_dl11.vbom
|
||||
ibdr_pc11.vbom
|
||||
ibdr_lp11.vbom
|
||||
ibdr_sdreg.vbom
|
||||
ib_sres_or_4.vbom
|
||||
ib_sres_or_3.vbom
|
||||
ib_intmap.vbom
|
||||
# design
|
||||
ibdr_maxisys.vhd
|
||||
414
rtl/ibus/ibdr_maxisys.vhd
Normal file
414
rtl/ibus/ibdr_maxisys.vhd
Normal file
@@ -0,0 +1,414 @@
|
||||
-- $Id: ibdr_maxisys.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2009-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ibdr_maxisys - syn
|
||||
-- Description: ibus(rem) devices for full system
|
||||
--
|
||||
-- Dependencies: ibd_iist
|
||||
-- ibd_kw11l
|
||||
-- ibdr_rk11
|
||||
-- ibdr_dl11
|
||||
-- ibdr_pc11
|
||||
-- ibdr_lp11
|
||||
-- ibdr_sdreg
|
||||
-- ib_sres_or_4
|
||||
-- ib_sres_or_3
|
||||
-- ib_intmap
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-11 303 1.1 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2009-07-12 233 1.0.4 reorder ports; add RESET, CE_USEC to _dl11
|
||||
-- 2009-06-20 227 1.0.3 rename generate labels.
|
||||
-- 2009-06-07 224 1.0.2 add iist_mreq and iist_sres interfaces
|
||||
-- 2009-06-01 221 1.0.1 add CE_USEC; add RESET to kw11l; add _pc11, _iist
|
||||
-- 2009-05-24 219 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
--
|
||||
-- full system setup
|
||||
--
|
||||
-- ibbase vec pri slot attn sror device name
|
||||
--
|
||||
-- 172540 104 ?7 14 17 - 1/1 KW11-P
|
||||
-- 177500 260 6 13 16 - 1/2 IIST
|
||||
-- 177546 100 6 12 15 - 1/3 KW11-L
|
||||
-- 174510 120 5 14 9 1/4 DEUNA
|
||||
-- 176700 254 5 13 6 2/1 RH70/RP06
|
||||
-- 174400 160 5 11 12 5 2/2 RL11
|
||||
-- 177400 220 5 10 11 4 2/3 RK11
|
||||
-- 172520 224 5 10 7 2/4 TM11
|
||||
-- 160100 310? 5 9 9 3 3/1 DZ11-RX
|
||||
-- 314? 5 8 8 ^ DZ11-TX
|
||||
-- 177560 060 4 7 7 1 3/2 DL11-RX 1st
|
||||
-- 064 4 6 6 ^ DL11-TX 1st
|
||||
-- 176500 300 4 5 5 2 3/3 DL11-RX 2nd
|
||||
-- 304 4 4 4 ^ DL11-TX 2nd
|
||||
-- 177550 070 4 3 3 10 4/1 PC11/PTR
|
||||
-- 074 4 2 2 ^ PC11/PTP
|
||||
-- 177514 200 4 1 1 8 4/2 LP11
|
||||
-- 177570 - - - - 4/3 sdreg
|
||||
--
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
use work.ibdlib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
entity ibdr_maxisys is -- ibus(rem) full system
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_USEC : in slbit; -- usec pulse
|
||||
CE_MSEC : in slbit; -- msec pulse
|
||||
RESET : in slbit; -- reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slv16_1; -- remote attention vector
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_ACKM : in slbit; -- interrupt acknowledge (from master)
|
||||
EI_PRI : out slv3; -- interrupt priority (to cpu)
|
||||
EI_VECT : out slv9_2; -- interrupt vector (to cpu)
|
||||
DISPREG : out slv16 -- display register
|
||||
);
|
||||
end ibdr_maxisys;
|
||||
|
||||
architecture syn of ibdr_maxisys is
|
||||
|
||||
constant conf_intmap : intmap_array_type :=
|
||||
(intmap_init, -- line 15
|
||||
(8#104#,6), -- line 14 KW11-P
|
||||
(8#260#,6), -- line 13 IIST
|
||||
(8#100#,6), -- line 12 KW11-L
|
||||
(8#160#,5), -- line 11 RL11
|
||||
(8#220#,5), -- line 10 RK11
|
||||
(8#310#,5), -- line 9 DZ11-RX
|
||||
(8#314#,5), -- line 8 DZ11-TX
|
||||
(8#060#,4), -- line 7 DL11-RX 1st
|
||||
(8#064#,4), -- line 6 DL11-TX 1st
|
||||
(8#300#,4), -- line 5 DL11-RX 2nd
|
||||
(8#304#,4), -- line 4 DL11-TX 2nd
|
||||
(8#070#,4), -- line 3 PC11-PTR
|
||||
(8#074#,4), -- line 2 PC11-PTP
|
||||
(8#200#,4), -- line 1 LP11
|
||||
intmap_init -- line 0
|
||||
);
|
||||
|
||||
signal RRI_LAM_DENUA : slbit := '0';
|
||||
signal RRI_LAM_RP06 : slbit := '0';
|
||||
signal RRI_LAM_RL11 : slbit := '0';
|
||||
signal RRI_LAM_RK11 : slbit := '0';
|
||||
signal RRI_LAM_TM11 : slbit := '0';
|
||||
signal RRI_LAM_DZ11 : slbit := '0';
|
||||
signal RRI_LAM_DL11_0 : slbit := '0';
|
||||
signal RRI_LAM_DL11_1 : slbit := '0';
|
||||
signal RRI_LAM_PC11 : slbit := '0';
|
||||
signal RRI_LAM_LP11 : slbit := '0';
|
||||
|
||||
signal IB_SRES_IIST : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_KW11P : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_KW11L : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_DEUNA : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_RP06 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_RL11 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_RK11 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_TM11 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_DZ11 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_DL11_0 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_DL11_1 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_PC11 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_LP11 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_SDREG : ib_sres_type := ib_sres_init;
|
||||
|
||||
signal IB_SRES_1 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_2 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_3 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_4 : ib_sres_type := ib_sres_init;
|
||||
|
||||
signal EI_REQ : slv16_1 := (others=>'0');
|
||||
signal EI_ACK : slv16_1 := (others=>'0');
|
||||
|
||||
signal EI_REQ_IIST : slbit := '0';
|
||||
signal EI_REQ_KW11P : slbit := '0';
|
||||
signal EI_REQ_KW11L : slbit := '0';
|
||||
signal EI_REQ_DEUNA : slbit := '0';
|
||||
signal EI_REQ_RP06 : slbit := '0';
|
||||
signal EI_REQ_RL11 : slbit := '0';
|
||||
signal EI_REQ_RK11 : slbit := '0';
|
||||
signal EI_REQ_TM11 : slbit := '0';
|
||||
signal EI_REQ_DZ11RX : slbit := '0';
|
||||
signal EI_REQ_DZ11TX : slbit := '0';
|
||||
signal EI_REQ_DL11RX_0 : slbit := '0';
|
||||
signal EI_REQ_DL11TX_0 : slbit := '0';
|
||||
signal EI_REQ_DL11RX_1 : slbit := '0';
|
||||
signal EI_REQ_DL11TX_1 : slbit := '0';
|
||||
signal EI_REQ_PC11PTR : slbit := '0';
|
||||
signal EI_REQ_PC11PTP : slbit := '0';
|
||||
signal EI_REQ_LP11 : slbit := '0';
|
||||
|
||||
signal EI_ACK_IIST : slbit := '0';
|
||||
signal EI_ACK_KW11P : slbit := '0';
|
||||
signal EI_ACK_KW11L : slbit := '0';
|
||||
signal EI_ACK_DEUNA : slbit := '0';
|
||||
signal EI_ACK_RP06 : slbit := '0';
|
||||
signal EI_ACK_RL11 : slbit := '0';
|
||||
signal EI_ACK_RK11 : slbit := '0';
|
||||
signal EI_ACK_TM11 : slbit := '0';
|
||||
signal EI_ACK_DZ11RX : slbit := '0';
|
||||
signal EI_ACK_DZ11TX : slbit := '0';
|
||||
signal EI_ACK_DL11RX_0 : slbit := '0';
|
||||
signal EI_ACK_DL11TX_0 : slbit := '0';
|
||||
signal EI_ACK_DL11RX_1 : slbit := '0';
|
||||
signal EI_ACK_DL11TX_1 : slbit := '0';
|
||||
signal EI_ACK_PC11PTR : slbit := '0';
|
||||
signal EI_ACK_PC11PTP : slbit := '0';
|
||||
signal EI_ACK_LP11 : slbit := '0';
|
||||
|
||||
signal IIST_BUS : iist_bus_type := iist_bus_init;
|
||||
signal IIST_OUT_0 : iist_line_type := iist_line_init;
|
||||
signal IIST_MREQ : iist_mreq_type := iist_mreq_init;
|
||||
signal IIST_SRES : iist_sres_type := iist_sres_init;
|
||||
|
||||
begin
|
||||
|
||||
IIST: if true generate
|
||||
begin
|
||||
I0 : ibd_iist
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
RESET => RESET,
|
||||
BRESET => BRESET,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_IIST,
|
||||
EI_REQ => EI_REQ_IIST,
|
||||
EI_ACK => EI_ACK_IIST,
|
||||
IIST_BUS => IIST_BUS,
|
||||
IIST_OUT => IIST_OUT_0,
|
||||
IIST_MREQ => IIST_MREQ,
|
||||
IIST_SRES => IIST_SRES
|
||||
);
|
||||
|
||||
IIST_BUS(0) <= IIST_OUT_0;
|
||||
IIST_BUS(1) <= iist_line_init;
|
||||
IIST_BUS(2) <= iist_line_init;
|
||||
IIST_BUS(3) <= iist_line_init;
|
||||
|
||||
end generate IIST;
|
||||
|
||||
KW11L : ibd_kw11l
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_MSEC => CE_MSEC,
|
||||
RESET => RESET,
|
||||
BRESET => BRESET,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_KW11L,
|
||||
EI_REQ => EI_REQ_KW11L,
|
||||
EI_ACK => EI_ACK_KW11L
|
||||
);
|
||||
|
||||
RK11: if true generate
|
||||
begin
|
||||
I0 : ibdr_rk11
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_MSEC => CE_MSEC,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RRI_LAM_RK11,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_RK11,
|
||||
EI_REQ => EI_REQ_RK11,
|
||||
EI_ACK => EI_ACK_RK11
|
||||
);
|
||||
end generate RK11;
|
||||
|
||||
DL11_0 : ibdr_dl11
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
RESET => RESET,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RRI_LAM_DL11_0,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_DL11_0,
|
||||
EI_REQ_RX => EI_REQ_DL11RX_0,
|
||||
EI_REQ_TX => EI_REQ_DL11TX_0,
|
||||
EI_ACK_RX => EI_ACK_DL11RX_0,
|
||||
EI_ACK_TX => EI_ACK_DL11TX_0
|
||||
);
|
||||
|
||||
DL11_1: if true generate
|
||||
begin
|
||||
I0 : ibdr_dl11
|
||||
generic map (
|
||||
IB_ADDR => conv_std_logic_vector(8#176500#,16))
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
RESET => RESET,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RRI_LAM_DL11_1,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_DL11_1,
|
||||
EI_REQ_RX => EI_REQ_DL11RX_1,
|
||||
EI_REQ_TX => EI_REQ_DL11TX_1,
|
||||
EI_ACK_RX => EI_ACK_DL11RX_1,
|
||||
EI_ACK_TX => EI_ACK_DL11TX_1
|
||||
);
|
||||
end generate DL11_1;
|
||||
|
||||
PC11: if true generate
|
||||
begin
|
||||
I0 : ibdr_pc11
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RRI_LAM_PC11,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_PC11,
|
||||
EI_REQ_PTR => EI_REQ_PC11PTR,
|
||||
EI_REQ_PTP => EI_REQ_PC11PTP,
|
||||
EI_ACK_PTR => EI_ACK_PC11PTR,
|
||||
EI_ACK_PTP => EI_ACK_PC11PTP
|
||||
);
|
||||
end generate PC11;
|
||||
|
||||
LP11: if true generate
|
||||
begin
|
||||
I0 : ibdr_lp11
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RRI_LAM_LP11,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_LP11,
|
||||
EI_REQ => EI_REQ_LP11,
|
||||
EI_ACK => EI_ACK_LP11
|
||||
);
|
||||
end generate LP11;
|
||||
|
||||
SDREG : ibdr_sdreg
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_SDREG,
|
||||
DISPREG => DISPREG
|
||||
);
|
||||
|
||||
SRES_OR_1 : ib_sres_or_4
|
||||
port map (
|
||||
IB_SRES_1 => IB_SRES_KW11P,
|
||||
IB_SRES_2 => IB_SRES_IIST,
|
||||
IB_SRES_3 => IB_SRES_KW11L,
|
||||
IB_SRES_4 => IB_SRES_DEUNA,
|
||||
IB_SRES_OR => IB_SRES_1
|
||||
);
|
||||
|
||||
SRES_OR_2 : ib_sres_or_4
|
||||
port map (
|
||||
IB_SRES_1 => IB_SRES_RP06,
|
||||
IB_SRES_2 => IB_SRES_RL11,
|
||||
IB_SRES_3 => IB_SRES_RK11,
|
||||
IB_SRES_4 => IB_SRES_TM11,
|
||||
IB_SRES_OR => IB_SRES_2
|
||||
);
|
||||
|
||||
SRES_OR_3 : ib_sres_or_3
|
||||
port map (
|
||||
IB_SRES_1 => IB_SRES_DZ11,
|
||||
IB_SRES_2 => IB_SRES_DL11_0,
|
||||
IB_SRES_3 => IB_SRES_DL11_1,
|
||||
IB_SRES_OR => IB_SRES_3
|
||||
);
|
||||
|
||||
SRES_OR_4 : ib_sres_or_3
|
||||
port map (
|
||||
IB_SRES_1 => IB_SRES_PC11,
|
||||
IB_SRES_2 => IB_SRES_LP11,
|
||||
IB_SRES_3 => IB_SRES_SDREG,
|
||||
IB_SRES_OR => IB_SRES_4
|
||||
);
|
||||
|
||||
SRES_OR : ib_sres_or_4
|
||||
port map (
|
||||
IB_SRES_1 => IB_SRES_1,
|
||||
IB_SRES_2 => IB_SRES_2,
|
||||
IB_SRES_3 => IB_SRES_3,
|
||||
IB_SRES_4 => IB_SRES_4,
|
||||
IB_SRES_OR => IB_SRES
|
||||
);
|
||||
|
||||
INTMAP : ib_intmap
|
||||
generic map (
|
||||
INTMAP => conf_intmap)
|
||||
port map (
|
||||
EI_REQ => EI_REQ,
|
||||
EI_ACKM => EI_ACKM,
|
||||
EI_ACK => EI_ACK,
|
||||
EI_PRI => EI_PRI,
|
||||
EI_VECT => EI_VECT
|
||||
);
|
||||
|
||||
EI_REQ(14) <= EI_REQ_KW11P;
|
||||
EI_REQ(13) <= EI_REQ_IIST;
|
||||
EI_REQ(12) <= EI_REQ_KW11L;
|
||||
EI_REQ(11) <= EI_REQ_RL11;
|
||||
EI_REQ(10) <= EI_REQ_RK11;
|
||||
EI_REQ( 9) <= EI_REQ_DZ11RX;
|
||||
EI_REQ( 8) <= EI_REQ_DZ11TX;
|
||||
EI_REQ( 7) <= EI_REQ_DL11RX_0;
|
||||
EI_REQ( 6) <= EI_REQ_DL11TX_0;
|
||||
EI_REQ( 5) <= EI_REQ_DL11RX_1;
|
||||
EI_REQ( 4) <= EI_REQ_DL11TX_1;
|
||||
EI_REQ( 3) <= EI_REQ_PC11PTR;
|
||||
EI_REQ( 2) <= EI_REQ_PC11PTP;
|
||||
EI_REQ( 1) <= EI_REQ_LP11;
|
||||
|
||||
EI_ACK_KW11P <= EI_ACK(14);
|
||||
EI_ACK_IIST <= EI_ACK(13);
|
||||
EI_ACK_KW11L <= EI_ACK(12);
|
||||
EI_ACK_RL11 <= EI_ACK(11);
|
||||
EI_ACK_RK11 <= EI_ACK(10);
|
||||
EI_ACK_DZ11RX <= EI_ACK( 9);
|
||||
EI_ACK_DZ11TX <= EI_ACK( 8);
|
||||
EI_ACK_DL11RX_0 <= EI_ACK( 7);
|
||||
EI_ACK_DL11TX_0 <= EI_ACK( 6);
|
||||
EI_ACK_DL11RX_1 <= EI_ACK( 5);
|
||||
EI_ACK_DL11TX_1 <= EI_ACK( 4);
|
||||
EI_ACK_PC11PTR <= EI_ACK( 3);
|
||||
EI_ACK_PC11PTP <= EI_ACK( 2);
|
||||
EI_ACK_LP11 <= EI_ACK( 1);
|
||||
|
||||
RRI_LAM(15 downto 11) <= (others=>'0');
|
||||
RRI_LAM(10) <= RRI_LAM_PC11;
|
||||
RRI_LAM( 9) <= RRI_LAM_DENUA;
|
||||
RRI_LAM( 8) <= RRI_LAM_LP11;
|
||||
RRI_LAM( 7) <= RRI_LAM_TM11;
|
||||
RRI_LAM( 6) <= RRI_LAM_RP06;
|
||||
RRI_LAM( 5) <= RRI_LAM_RL11;
|
||||
RRI_LAM( 4) <= RRI_LAM_RK11;
|
||||
RRI_LAM( 3) <= RRI_LAM_DZ11;
|
||||
RRI_LAM( 2) <= RRI_LAM_DL11_1;
|
||||
RRI_LAM( 1) <= RRI_LAM_DL11_0;
|
||||
|
||||
end syn;
|
||||
13
rtl/ibus/ibdr_minisys.vbom
Normal file
13
rtl/ibus/ibdr_minisys.vbom
Normal file
@@ -0,0 +1,13 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
ibdlib.vhd
|
||||
# components
|
||||
ibdr_sdreg.vbom
|
||||
ibd_kw11l.vbom
|
||||
ibdr_dl11.vbom
|
||||
ibdr_rk11.vbom
|
||||
ib_sres_or_4.vbom
|
||||
ib_intmap.vbom
|
||||
# design
|
||||
ibdr_minisys.vhd
|
||||
206
rtl/ibus/ibdr_minisys.vhd
Normal file
206
rtl/ibus/ibdr_minisys.vhd
Normal file
@@ -0,0 +1,206 @@
|
||||
-- $Id: ibdr_minisys.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2008-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ibdr_minisys - syn
|
||||
-- Description: ibus(rem) devices for minimal system:SDR+KW+DL+RK
|
||||
--
|
||||
-- Dependencies: ibdr_sdreg
|
||||
-- ibd_kw11l
|
||||
-- ibdr_dl11
|
||||
-- ibdr_rk11
|
||||
-- ib_sres_or_4
|
||||
-- ib_intmap
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-11 303 1.1 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2009-07-12 233 1.0.7 reorder ports, add CE_USEC; add RESET and CE_USEC
|
||||
-- to _dl11
|
||||
-- 2009-05-31 221 1.0.6 add RESET to kw11l;
|
||||
-- 2009-05-24 219 1.0.5 _rk11 uses now CE_MSEC
|
||||
-- 2008-08-22 161 1.0.4 use iblib, ibdlib
|
||||
-- 2008-05-09 144 1.0.3 use EI_ACK with _kw11l, _dl11
|
||||
-- 2008-04-18 136 1.0.2 add RESET port, use for ibdr_sdreg
|
||||
-- 2008-01-20 113 1.0.1 RRI_LAM now vector
|
||||
-- 2008-01-20 112 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
-- mini system setup
|
||||
--
|
||||
-- ibbase vec pri slot attn device name
|
||||
--
|
||||
-- 177546 100 6 4 - KW11-L
|
||||
-- 177400 220 5 3 4 RK11
|
||||
-- 177560 060 4 2 1 DL11-RX 1st
|
||||
-- 064 4 1 ^ DL11-TX 1st
|
||||
-- 177570 - - - - sdreg
|
||||
--
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
use work.ibdlib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
entity ibdr_minisys is -- ibus(rem) minimal sys:SDR+KW+DL+RK
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_USEC : in slbit; -- usec pulse
|
||||
CE_MSEC : in slbit; -- msec pulse
|
||||
RESET : in slbit; -- reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slv16_1; -- remote attention vector
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_ACKM : in slbit; -- interrupt acknowledge (from master)
|
||||
EI_PRI : out slv3; -- interrupt priority (to cpu)
|
||||
EI_VECT : out slv9_2; -- interrupt vector (to cpu)
|
||||
DISPREG : out slv16 -- display register
|
||||
);
|
||||
end ibdr_minisys;
|
||||
|
||||
architecture syn of ibdr_minisys is
|
||||
|
||||
constant conf_intmap : intmap_array_type :=
|
||||
(intmap_init, -- line 15
|
||||
intmap_init, -- line 14
|
||||
intmap_init, -- line 13
|
||||
intmap_init, -- line 12
|
||||
intmap_init, -- line 11
|
||||
intmap_init, -- line 10
|
||||
intmap_init, -- line 9
|
||||
intmap_init, -- line 8
|
||||
intmap_init, -- line 7
|
||||
intmap_init, -- line 6
|
||||
intmap_init, -- line 5
|
||||
(8#100#,6), -- line 4 KW11-L
|
||||
(8#220#,5), -- line 3 RK11
|
||||
(8#060#,4), -- line 2 DL11-RX
|
||||
(8#064#,4), -- line 1 DL11-TX
|
||||
intmap_init -- line 0
|
||||
);
|
||||
|
||||
signal RRI_LAM_DL11 : slbit := '0';
|
||||
signal RRI_LAM_RK11 : slbit := '0';
|
||||
|
||||
signal IB_SRES_SDREG : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_KW11L : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_DL11 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_RK11 : ib_sres_type := ib_sres_init;
|
||||
|
||||
signal EI_REQ : slv16_1 := (others=>'0');
|
||||
signal EI_ACK : slv16_1 := (others=>'0');
|
||||
|
||||
signal EI_REQ_KW11L : slbit := '0';
|
||||
signal EI_REQ_DL11RX : slbit := '0';
|
||||
signal EI_REQ_DL11TX : slbit := '0';
|
||||
signal EI_REQ_RK11 : slbit := '0';
|
||||
|
||||
signal EI_ACK_KW11L : slbit := '0';
|
||||
signal EI_ACK_DL11RX : slbit := '0';
|
||||
signal EI_ACK_DL11TX : slbit := '0';
|
||||
signal EI_ACK_RK11 : slbit := '0';
|
||||
|
||||
begin
|
||||
|
||||
SDREG : ibdr_sdreg
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_SDREG,
|
||||
DISPREG => DISPREG
|
||||
);
|
||||
|
||||
KW11L : ibd_kw11l
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_MSEC => CE_MSEC,
|
||||
RESET => RESET,
|
||||
BRESET => BRESET,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_KW11L,
|
||||
EI_REQ => EI_REQ_KW11L,
|
||||
EI_ACK => EI_ACK_KW11L
|
||||
);
|
||||
|
||||
DL11 : ibdr_dl11
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
RESET => RESET,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RRI_LAM_DL11,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_DL11,
|
||||
EI_REQ_RX => EI_REQ_DL11RX,
|
||||
EI_REQ_TX => EI_REQ_DL11TX,
|
||||
EI_ACK_RX => EI_ACK_DL11RX,
|
||||
EI_ACK_TX => EI_ACK_DL11TX
|
||||
);
|
||||
|
||||
RK11 : ibdr_rk11
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_MSEC => CE_MSEC,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RRI_LAM_RK11,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_RK11,
|
||||
EI_REQ => EI_REQ_RK11,
|
||||
EI_ACK => EI_ACK_RK11
|
||||
);
|
||||
|
||||
SRES_OR : ib_sres_or_4
|
||||
port map (
|
||||
IB_SRES_1 => IB_SRES_SDREG,
|
||||
IB_SRES_2 => IB_SRES_KW11L,
|
||||
IB_SRES_3 => IB_SRES_DL11,
|
||||
IB_SRES_4 => IB_SRES_RK11,
|
||||
IB_SRES_OR => IB_SRES
|
||||
);
|
||||
|
||||
INTMAP : ib_intmap
|
||||
generic map (
|
||||
INTMAP => conf_intmap)
|
||||
port map (
|
||||
EI_REQ => EI_REQ,
|
||||
EI_ACKM => EI_ACKM,
|
||||
EI_ACK => EI_ACK,
|
||||
EI_PRI => EI_PRI,
|
||||
EI_VECT => EI_VECT
|
||||
);
|
||||
|
||||
EI_REQ(4) <= EI_REQ_KW11L;
|
||||
EI_REQ(3) <= EI_REQ_RK11;
|
||||
EI_REQ(2) <= EI_REQ_DL11RX;
|
||||
EI_REQ(1) <= EI_REQ_DL11TX;
|
||||
|
||||
EI_ACK_KW11L <= EI_ACK(4);
|
||||
EI_ACK_RK11 <= EI_ACK(3);
|
||||
EI_ACK_DL11RX <= EI_ACK(2);
|
||||
EI_ACK_DL11TX <= EI_ACK(1);
|
||||
|
||||
RRI_LAM(1) <= RRI_LAM_DL11;
|
||||
RRI_LAM(2) <= '0'; -- for 2nd DL11
|
||||
RRI_LAM(3) <= '0'; -- for DZ11
|
||||
RRI_LAM(4) <= RRI_LAM_RK11;
|
||||
RRI_LAM(15 downto 5) <= (others=>'0');
|
||||
|
||||
end syn;
|
||||
5
rtl/ibus/ibdr_pc11.vbom
Normal file
5
rtl/ibus/ibdr_pc11.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
# design
|
||||
ibdr_pc11.vhd
|
||||
314
rtl/ibus/ibdr_pc11.vhd
Normal file
314
rtl/ibus/ibdr_pc11.vhd
Normal file
@@ -0,0 +1,314 @@
|
||||
-- $Id: ibdr_pc11.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2009-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ibdr_pc11 - syn
|
||||
-- Description: ibus dev(rem): PC11
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: xxdp: zpcae0
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2009-06-28 230 10.1.03 K39 xc3s1000-4 25 92 0 54 s 4.9
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-11 303 1.1 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2009-06-28 230 1.0 prdy now inits to '1'; setting err bit in csr now
|
||||
-- causes interrupt, if enabled; validated with zpcae0
|
||||
-- 2009-06-01 221 0.9 Initial version (untested)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
entity ibdr_pc11 is -- ibus dev(rem): PC11
|
||||
-- fixed address: 177550
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- system reset
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ_PTR : out slbit; -- interrupt request, reader
|
||||
EI_REQ_PTP : out slbit; -- interrupt request, punch
|
||||
EI_ACK_PTR : in slbit; -- interrupt acknowledge, reader
|
||||
EI_ACK_PTP : in slbit -- interrupt acknowledge, punch
|
||||
);
|
||||
end ibdr_pc11;
|
||||
|
||||
architecture syn of ibdr_pc11 is
|
||||
|
||||
constant ibaddr_pc11 : slv16 := conv_std_logic_vector(8#177550#,16);
|
||||
|
||||
constant ibaddr_rcsr : slv2 := "00"; -- rcsr address offset
|
||||
constant ibaddr_rbuf : slv2 := "01"; -- rbuf address offset
|
||||
constant ibaddr_pcsr : slv2 := "10"; -- pcsr address offset
|
||||
constant ibaddr_pbuf : slv2 := "11"; -- pbuf address offset
|
||||
|
||||
constant rcsr_ibf_rerr : integer := 15;
|
||||
constant rcsr_ibf_rbusy : integer := 11;
|
||||
constant rcsr_ibf_rdone : integer := 7;
|
||||
constant rcsr_ibf_rie : integer := 6;
|
||||
constant rcsr_ibf_renb : integer := 0;
|
||||
|
||||
constant pcsr_ibf_perr : integer := 15;
|
||||
constant pcsr_ibf_prdy : integer := 7;
|
||||
constant pcsr_ibf_pie : integer := 6;
|
||||
|
||||
constant pbuf_ibf_pval : integer := 8;
|
||||
constant pbuf_ibf_rbusy : integer := 9;
|
||||
|
||||
type regs_type is record -- state registers
|
||||
rerr : slbit; -- rcsr: reader error
|
||||
rbusy : slbit; -- rcsr: reader busy
|
||||
rdone : slbit; -- rcsr: reader done
|
||||
rie : slbit; -- rcsr: reader interrupt enable
|
||||
rbuf : slv8; -- rbuf:
|
||||
rintreq : slbit; -- ptr interrupt request
|
||||
perr : slbit; -- pcsr: punch error
|
||||
prdy : slbit; -- pcsr: punch ready
|
||||
pie : slbit; -- pcsr: punch interrupt enable
|
||||
pbuf : slv8; -- pbuf:
|
||||
pintreq : slbit; -- ptp interrupt request
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
'1', -- rerr (init=1!)
|
||||
'0','0','0', -- rbusy,rdone,rie
|
||||
(others=>'0'), -- rbuf
|
||||
'0', -- rintreq
|
||||
'1', -- perr (init=1!)
|
||||
'1', -- prdy (init=1!)
|
||||
'0', -- pie
|
||||
(others=>'0'), -- pbuf
|
||||
'0' -- pintreq
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init;
|
||||
signal N_REGS : regs_type := regs_init;
|
||||
|
||||
begin
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
if CLK'event and CLK='1' then
|
||||
if BRESET = '1' then -- BRESET is 1 for system and ibus reset
|
||||
R_REGS <= regs_init; --
|
||||
if RESET = '0' then -- if RESET=0 we do just an ibus reset
|
||||
R_REGS.rerr <= N_REGS.rerr; -- don't reset RERR flag
|
||||
R_REGS.perr <= N_REGS.perr; -- don't reset PERR flag
|
||||
end if;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
end process proc_regs;
|
||||
|
||||
proc_next : process (R_REGS, IB_MREQ, EI_ACK_PTR, EI_ACK_PTP)
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable ibsel : slbit := '0';
|
||||
variable idout : slv16 := (others=>'0');
|
||||
variable ibrd : slbit := '0';
|
||||
variable ibw0 : slbit := '0';
|
||||
variable ibw1 : slbit := '0';
|
||||
variable ilam : slbit := '0';
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
|
||||
ibsel := '0';
|
||||
idout := (others=>'0');
|
||||
ibrd := not IB_MREQ.we;
|
||||
ibw0 := IB_MREQ.we and IB_MREQ.be0;
|
||||
ibw1 := IB_MREQ.we and IB_MREQ.be1;
|
||||
ilam := '0';
|
||||
|
||||
-- ibus address decoder
|
||||
if IB_MREQ.req='1' and
|
||||
IB_MREQ.addr(12 downto 3)=ibaddr_pc11(12 downto 3) then
|
||||
ibsel := '1';
|
||||
end if;
|
||||
|
||||
-- ibus transactions
|
||||
if ibsel = '1' then
|
||||
case IB_MREQ.addr(2 downto 1) is
|
||||
|
||||
when ibaddr_rcsr => -- RCSR -- reader control status -----
|
||||
|
||||
idout(rcsr_ibf_rerr) := r.rerr;
|
||||
idout(rcsr_ibf_rbusy) := r.rbusy;
|
||||
idout(rcsr_ibf_rdone) := r.rdone;
|
||||
idout(rcsr_ibf_rie) := r.rie;
|
||||
|
||||
if IB_MREQ.racc = '0' then -- cpu ---------------------
|
||||
if ibw0 = '1' then
|
||||
n.rie := IB_MREQ.din(rcsr_ibf_rie);
|
||||
if IB_MREQ.din(rcsr_ibf_rie) = '1' then-- set IE to 1
|
||||
if r.rie = '0' and -- IE 0->1 transition
|
||||
IB_MREQ.din(rcsr_ibf_renb)='0' and -- when RENB not set
|
||||
(r.rerr='1' or r.rdone='1') then -- but err or done set
|
||||
n.rintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
else -- set IE to 0
|
||||
n.rintreq := '0'; -- cancel interrupts
|
||||
end if;
|
||||
if IB_MREQ.din(rcsr_ibf_renb) = '1' then -- set RENB
|
||||
if r.rerr = '0' then -- if not in error state
|
||||
n.rbusy := '1'; -- set busy
|
||||
n.rdone := '0'; -- clear done
|
||||
n.rbuf := (others=>'0'); -- clear buffer
|
||||
n.rintreq := '0'; -- cancel interrupt
|
||||
ilam := '1'; -- rri lam
|
||||
else -- if in error state
|
||||
if r.rie = '1' then -- if interrupts on
|
||||
n.rintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
else -- rri ---------------------
|
||||
if ibw1 = '1' then
|
||||
n.rerr := IB_MREQ.din(rcsr_ibf_rerr); -- set ERR bit
|
||||
if IB_MREQ.din(rcsr_ibf_rerr)='1' -- if 0->1 transition
|
||||
and r.rerr='0' then
|
||||
n.rbusy := '0'; -- clear busy
|
||||
n.rdone := '0'; -- clear done
|
||||
if r.rie = '1' then -- if interrupts on
|
||||
n.rintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when ibaddr_rbuf => -- RBUF -- reader data buffer --------
|
||||
|
||||
idout(r.rbuf'range) := r.rbuf;
|
||||
|
||||
if IB_MREQ.racc = '0' then -- cpu ---------------------
|
||||
if true then -- !! PC11 is unusual !!
|
||||
n.rdone := '0'; -- any read or write will clear done
|
||||
n.rbuf := (others=>'0'); -- and the reader buffer
|
||||
n.rintreq := '0'; -- also interrupt is canceled
|
||||
end if;
|
||||
|
||||
else -- rri ---------------------
|
||||
if ibw0 = '1' then
|
||||
n.rbuf := IB_MREQ.din(n.rbuf'range);
|
||||
n.rbusy := '0';
|
||||
n.rdone := '1';
|
||||
if r.rie = '1' then
|
||||
n.rintreq := '1';
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when ibaddr_pcsr => -- PCSR -- punch control status ------
|
||||
|
||||
idout(pcsr_ibf_perr) := r.perr;
|
||||
idout(pcsr_ibf_prdy) := r.prdy;
|
||||
idout(pcsr_ibf_pie) := r.pie;
|
||||
|
||||
if IB_MREQ.racc = '0' then -- cpu ---------------------
|
||||
if ibw0 = '1' then
|
||||
n.pie := IB_MREQ.din(pcsr_ibf_pie);
|
||||
if IB_MREQ.din(pcsr_ibf_pie) = '1' then-- set IE to 1
|
||||
if r.pie='0' and -- IE 0->1 transition
|
||||
(r.perr='1' or r.prdy='1') then -- but err or done set
|
||||
n.pintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
else -- set IE to 0
|
||||
n.pintreq := '0'; -- cancel interrupts
|
||||
end if;
|
||||
end if;
|
||||
|
||||
else -- rri ---------------------
|
||||
if ibw1 = '1' then
|
||||
n.perr := IB_MREQ.din(pcsr_ibf_perr); -- set ERR bit
|
||||
if IB_MREQ.din(pcsr_ibf_perr)='1' -- if 0->1 transition
|
||||
and r.perr='0' then
|
||||
n.prdy := '1'; -- set ready
|
||||
if r.pie = '1' then -- if interrupts on
|
||||
n.pintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when ibaddr_pbuf => -- PBUF -- punch data buffer ---------
|
||||
|
||||
if IB_MREQ.racc = '0' then -- cpu ---------------------
|
||||
if ibw0 = '1' then
|
||||
if r.perr = '0' then -- if not in error state
|
||||
n.pbuf := IB_MREQ.din(n.pbuf'range);
|
||||
n.prdy := '0'; -- clear ready
|
||||
n.pintreq := '0'; -- cancel interrupts
|
||||
ilam := '1'; -- rri lam
|
||||
else -- if in error state
|
||||
if r.pie = '1' then -- if interrupts on
|
||||
n.pintreq := '1'; -- request interrupt
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
else -- rri ---------------------
|
||||
idout(r.pbuf'range) := r.pbuf;
|
||||
idout(pbuf_ibf_pval) := not r.prdy;
|
||||
idout(pbuf_ibf_rbusy) := r.rbusy;
|
||||
if ibrd = '1' then
|
||||
n.prdy := '1';
|
||||
if r.pie = '1' then
|
||||
n.pintreq := '1';
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
end if;
|
||||
|
||||
-- other state changes
|
||||
if EI_ACK_PTR = '1' then
|
||||
n.rintreq := '0';
|
||||
end if;
|
||||
if EI_ACK_PTP = '1' then
|
||||
n.pintreq := '0';
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
IB_SRES.dout <= idout;
|
||||
IB_SRES.ack <= ibsel;
|
||||
IB_SRES.busy <= '0';
|
||||
|
||||
RRI_LAM <= ilam;
|
||||
EI_REQ_PTR <= r.rintreq;
|
||||
EI_REQ_PTP <= r.pintreq;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
|
||||
end syn;
|
||||
9
rtl/ibus/ibdr_rk11.vbom
Normal file
9
rtl/ibus/ibdr_rk11.vbom
Normal file
@@ -0,0 +1,9 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
../vlib/memlib/memlib.vhd
|
||||
iblib.vhd
|
||||
# components
|
||||
[ghdl,isim]../vlib/memlib/ram_1swar_gen.vbom
|
||||
[xst]../vlib/memlib/ram_1swar_gen_unisim.vbom
|
||||
# design
|
||||
ibdr_rk11.vhd
|
||||
474
rtl/ibus/ibdr_rk11.vhd
Normal file
474
rtl/ibus/ibdr_rk11.vhd
Normal file
@@ -0,0 +1,474 @@
|
||||
-- $Id: ibdr_rk11.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2008-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ibdr_rk11 - syn
|
||||
-- Description: ibus dev(rem): RK11-A/B
|
||||
--
|
||||
-- Dependencies: ram_1swar_gen
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2009-06-01 221 10.1.03 K39 xc3s1000-4 46 249 16 148 s 7.1
|
||||
-- 2008-01-06 111 8.2.03 I34 xc3s1000-4 36 189 16 111 s 6.0
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-11 303 1.1 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2009-05-24 219 1.0.9 add CE_MSEC input; inc sector counter every msec
|
||||
-- BUGFIX: sector counter now counts 000,...,013.
|
||||
-- 2009-05-21 217 1.0.8 cancel pending interrupt requests when IE=0
|
||||
-- 2009-05-16 216 1.0.7 BUGFIX: correct interrupt on IE 0->1 logic
|
||||
-- BUGFIX: re-work the seek complete handling
|
||||
-- 2008-08-22 161 1.0.6 use iblib
|
||||
-- 2008-05-30 151 1.0.5 BUGFIX: do control reset locally now, add CRDONE
|
||||
-- 2008-03-30 131 1.0.4 issue interrupt when IDE bit set with GO=0
|
||||
-- 2008-02-23 118 1.0.3 remove redundant condition in rkda access code
|
||||
-- fix bug in control reset logic (we's missing)
|
||||
-- 2008-01-20 113 1.0.2 Fix busy handling when control reset done
|
||||
-- 2008-01-20 112 1.0.1 Fix scp handling; use BRESET
|
||||
-- 2008-01-06 111 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.memlib.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
entity ibdr_rk11 is -- ibus dev(rem): RK11
|
||||
-- fixed address: 177400
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
CE_MSEC : in slbit; -- msec pulse
|
||||
BRESET : in slbit; -- ibus reset
|
||||
RRI_LAM : out slbit; -- remote attention
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
EI_REQ : out slbit; -- interrupt request
|
||||
EI_ACK : in slbit -- interrupt acknowledge
|
||||
);
|
||||
end ibdr_rk11;
|
||||
|
||||
architecture syn of ibdr_rk11 is
|
||||
|
||||
constant ibaddr_rk11 : slv16 := conv_std_logic_vector(8#177400#,16);
|
||||
|
||||
constant ibaddr_rkds : slv3 := "000"; -- rkds address offset
|
||||
constant ibaddr_rker : slv3 := "001"; -- rker address offset
|
||||
constant ibaddr_rkcs : slv3 := "010"; -- rkcs address offset
|
||||
constant ibaddr_rkwc : slv3 := "011"; -- rkwc address offset
|
||||
constant ibaddr_rkba : slv3 := "100"; -- rkba address offset
|
||||
constant ibaddr_rkda : slv3 := "101"; -- rkba address offset
|
||||
constant ibaddr_rkmr : slv3 := "110"; -- rkmr address offset
|
||||
constant ibaddr_rkdb : slv3 := "111"; -- rkdb address offset
|
||||
|
||||
subtype rkds_ibf_id is integer range 15 downto 13;
|
||||
constant rkds_ibf_adry : integer := 6;
|
||||
constant rkds_ibf_scsa : integer := 4;
|
||||
subtype rkds_ibf_sc is integer range 3 downto 0;
|
||||
|
||||
subtype rker_ibf_he is integer range 15 downto 5;
|
||||
constant rker_ibf_cse : integer := 1;
|
||||
constant rker_ibf_wce : integer := 0;
|
||||
|
||||
constant rkcs_ibf_err : integer := 15;
|
||||
constant rkcs_ibf_he : integer := 14;
|
||||
constant rkcs_ibf_scp : integer := 13;
|
||||
constant rkcs_ibf_maint : integer := 12;
|
||||
constant rkcs_ibf_rdy : integer := 7;
|
||||
constant rkcs_ibf_ide : integer := 6;
|
||||
subtype rkcs_ibf_mex is integer range 5 downto 4;
|
||||
subtype rkcs_ibf_func is integer range 3 downto 1;
|
||||
constant rkcs_ibf_go : integer := 0;
|
||||
|
||||
subtype rkda_ibf_drsel is integer range 15 downto 13;
|
||||
|
||||
subtype rkmr_ibf_rid is integer range 15 downto 13; -- rem id
|
||||
constant rkmr_ibf_crdone: integer := 11; -- contr. reset done
|
||||
constant rkmr_ibf_sbclr : integer := 10; -- clear sbusy's
|
||||
constant rkmr_ibf_creset: integer := 9; -- control reset
|
||||
constant rkmr_ibf_fdone : integer := 8; -- func done
|
||||
subtype rkmr_ibf_sdone is integer range 7 downto 0; -- seek done
|
||||
|
||||
type state_type is (
|
||||
s_idle,
|
||||
s_init
|
||||
);
|
||||
|
||||
type regs_type is record -- state registers
|
||||
state : state_type; -- state
|
||||
id : slv3; -- rkds: drive id of search done
|
||||
sc : slv4; -- rkds: sector counter
|
||||
cse : slbit; -- rker: check sum error
|
||||
wce : slbit; -- rker: write check error
|
||||
he : slbit; -- rkcs: hard error
|
||||
scp : slbit; -- rkcs: seek complete
|
||||
maint : slbit; -- rkcs: maintenance mode
|
||||
rdy : slbit; -- rkcs: control ready
|
||||
ide : slbit; -- rkcs: interrupt on done enable
|
||||
drsel : slv3; -- rkda: currently selected drive
|
||||
fireq : slbit; -- func done interrupt request flag
|
||||
sireq : slv8; -- seek done interrupt request flags
|
||||
sbusy : slv8; -- seek busy flags
|
||||
rid : slv3; -- drive id for rem ds reads
|
||||
icnt : slv3; -- init state counter
|
||||
creset : slbit; -- control reset flag
|
||||
crdone : slbit; -- control reset done since last fdone
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
s_init, --
|
||||
(others=>'0'), -- id
|
||||
(others=>'0'), -- sc
|
||||
'0','0', -- cse, wce
|
||||
'0','0','0', -- he, scp, maint
|
||||
'1', -- rdy (SET TO 1)
|
||||
'0', -- ide
|
||||
(others=>'0'), -- drsel
|
||||
'0', -- fireq
|
||||
(others=>'0'), -- sireq
|
||||
(others=>'0'), -- sbusy
|
||||
(others=>'0'), -- rid
|
||||
(others=>'0'), -- icnt
|
||||
'0','1' -- creset, crdone
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init;
|
||||
signal N_REGS : regs_type := regs_init;
|
||||
|
||||
signal MEM_1_WE : slbit := '0';
|
||||
signal MEM_0_WE : slbit := '0';
|
||||
signal MEM_ADDR : slv4 := (others=>'0');
|
||||
signal MEM_DIN : slv16 := (others=>'0');
|
||||
signal MEM_DOUT : slv16 := (others=>'0');
|
||||
|
||||
begin
|
||||
|
||||
MEM_1 : ram_1swar_gen
|
||||
generic map (
|
||||
AWIDTH => 4,
|
||||
DWIDTH => 8)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
WE => MEM_1_WE,
|
||||
ADDR => MEM_ADDR,
|
||||
DI => MEM_DIN(ibf_byte1),
|
||||
DO => MEM_DOUT(ibf_byte1));
|
||||
|
||||
MEM_0 : ram_1swar_gen
|
||||
generic map (
|
||||
AWIDTH => 4,
|
||||
DWIDTH => 8)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
WE => MEM_0_WE,
|
||||
ADDR => MEM_ADDR,
|
||||
DI => MEM_DIN(ibf_byte0),
|
||||
DO => MEM_DOUT(ibf_byte0));
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
if CLK'event and CLK='1' then
|
||||
if BRESET='1' or R_REGS.creset='1' then
|
||||
R_REGS <= regs_init;
|
||||
if R_REGS.creset = '1' then
|
||||
R_REGS.sbusy <= N_REGS.sbusy;
|
||||
end if;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
end process proc_regs;
|
||||
|
||||
proc_next : process (R_REGS, CE_MSEC, IB_MREQ, MEM_DOUT, EI_ACK)
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable ibsel : slbit := '0';
|
||||
variable ibbusy : slbit := '0';
|
||||
variable icrip : slbit := '0';
|
||||
variable idout : slv16 := (others=>'0');
|
||||
variable ibrd : slbit := '0';
|
||||
variable ibrem : slbit := '0';
|
||||
variable ibw0 : slbit := '0';
|
||||
variable ibw1 : slbit := '0';
|
||||
variable ibwrem : slbit := '0';
|
||||
variable ilam : slbit := '0';
|
||||
variable iscval : slbit := '0';
|
||||
variable iscid : slv3 := (others=>'0');
|
||||
variable iei_req : slbit := '0';
|
||||
|
||||
variable imem_we0 : slbit := '0';
|
||||
variable imem_we1 : slbit := '0';
|
||||
variable imem_addr : slv4 := (others=>'0');
|
||||
variable imem_din : slv16 := (others=>'0');
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
|
||||
ibsel := '0';
|
||||
ibbusy := '0';
|
||||
icrip := '0';
|
||||
idout := (others=>'0');
|
||||
ibrd := not IB_MREQ.we;
|
||||
ibrem := IB_MREQ.racc or r.maint;
|
||||
ibw0 := IB_MREQ.we and IB_MREQ.be0;
|
||||
ibw1 := IB_MREQ.we and IB_MREQ.be1;
|
||||
ibwrem := IB_MREQ.we and ibrem;
|
||||
ilam := '0';
|
||||
iscval := '0';
|
||||
iscid := (others=>'0');
|
||||
iei_req := '0';
|
||||
|
||||
imem_we0 := '0';
|
||||
imem_we1 := '0';
|
||||
imem_addr := '0' & IB_MREQ.addr(3 downto 1);
|
||||
imem_din := IB_MREQ.din;
|
||||
|
||||
-- ibus address decoder
|
||||
if IB_MREQ.req = '1' and
|
||||
IB_MREQ.addr(12 downto 4)=ibaddr_rk11(12 downto 4) then
|
||||
ibsel := '1';
|
||||
end if;
|
||||
|
||||
-- internal state machine (for control reset)
|
||||
case r.state is
|
||||
when s_idle =>
|
||||
null;
|
||||
|
||||
when s_init =>
|
||||
ibbusy := ibsel; -- keep req pending if selected
|
||||
ibsel := '0'; -- but don't process selection
|
||||
icrip := '1';
|
||||
n.icnt := unsigned(r.icnt) + 1;
|
||||
if unsigned(r.icnt) = 7 then
|
||||
n.state := s_idle;
|
||||
end if;
|
||||
|
||||
when others => null;
|
||||
end case;
|
||||
|
||||
|
||||
-- ibus transactions
|
||||
if ibsel = '1' then
|
||||
idout := MEM_DOUT;
|
||||
imem_we0 := ibw0;
|
||||
imem_we1 := ibw1;
|
||||
|
||||
case IB_MREQ.addr(3 downto 1) is
|
||||
|
||||
when ibaddr_rkds => -- RKDS -- drive status register ----
|
||||
if ibrem = '0' then
|
||||
imem_addr := '1' & r.drsel; -- loc read ds data: drsel as addr.
|
||||
else
|
||||
imem_addr := '1' & r.rid; -- rem read ds data: rid as addr.
|
||||
end if;
|
||||
idout(rkds_ibf_id) := r.id;
|
||||
if ibrem = '0' then -- loc ? simulate drive sector monitor
|
||||
if r.sc = MEM_DOUT(rkds_ibf_sc) then
|
||||
idout(rkds_ibf_scsa) := '1';
|
||||
else
|
||||
idout(rkds_ibf_scsa) := '0';
|
||||
end if;
|
||||
idout(rkds_ibf_sc) := r.sc;
|
||||
end if;
|
||||
|
||||
if r.sbusy(conv_integer(unsigned(imem_addr(2 downto 0))))='1' then
|
||||
idout(rkds_ibf_adry) := '0'; -- clear drive access rdy
|
||||
end if;
|
||||
|
||||
if ibwrem = '1' then -- rem write ? than update ds data
|
||||
imem_addr := '1' & IB_MREQ.din(rkds_ibf_id); -- use id field as addr
|
||||
else -- loc write ?
|
||||
imem_we0 := '0'; -- suppress we, is read-only
|
||||
imem_we1 := '0';
|
||||
end if;
|
||||
|
||||
when ibaddr_rker => -- RKER -- error register ------------
|
||||
idout(4 downto 2) := (others=>'0'); -- unassigned bits
|
||||
idout(rker_ibf_cse) := r.cse; -- use state bits (cleared at go !)
|
||||
idout(rker_ibf_wce) := r.wce;
|
||||
|
||||
if ibwrem = '1' then -- rem write ?
|
||||
if unsigned(IB_MREQ.din(rker_ibf_he)) /= 0 then -- hard errors set ?
|
||||
n.he := '1';
|
||||
else
|
||||
n.he := '0';
|
||||
end if;
|
||||
n.cse := IB_MREQ.din(rker_ibf_cse); -- mirror cse bit
|
||||
n.wce := IB_MREQ.din(rker_ibf_wce); -- mirror wce bit
|
||||
else -- loc write ?
|
||||
imem_we0 := '0'; -- suppress we, is read-only
|
||||
imem_we1 := '0';
|
||||
end if;
|
||||
|
||||
when ibaddr_rkcs => -- RKCS -- control status register ---
|
||||
idout(rkcs_ibf_err) := r.he or r.cse or r.wce;
|
||||
idout(rkcs_ibf_he) := r.he;
|
||||
idout(rkcs_ibf_scp) := r.scp;
|
||||
idout(rkcs_ibf_rdy) := r.rdy;
|
||||
idout(rkcs_ibf_go) := not r.rdy;
|
||||
|
||||
if ibw1 = '1' then
|
||||
n.maint := IB_MREQ.din(rkcs_ibf_maint); -- mirror maint bit
|
||||
end if;
|
||||
|
||||
if ibw0 = '1' then
|
||||
n.ide := IB_MREQ.din(rkcs_ibf_ide); -- mirror ide bit
|
||||
if n.ide = '0' then -- if IE 0 or set to 0
|
||||
n.fireq := '0'; -- cancel all pending
|
||||
n.sireq := (others=>'0'); -- interrupt requests
|
||||
end if;
|
||||
|
||||
if IB_MREQ.din(rkcs_ibf_go) = '1' then -- GO=1 ?
|
||||
if r.rdy = '1' then -- ready and GO ?
|
||||
n.scp := '0'; -- go clears scp !
|
||||
n.rdy := '0'; -- mark busy
|
||||
n.cse := '0'; -- clear soft errors
|
||||
n.wce := '0';
|
||||
n.fireq := '0'; -- cancel pend. int
|
||||
|
||||
if unsigned(IB_MREQ.din(rkcs_ibf_func))=0 then -- control reset?
|
||||
n.creset := '1'; -- handle locally
|
||||
else
|
||||
ilam := '1'; -- issue lam
|
||||
end if;
|
||||
|
||||
if unsigned(IB_MREQ.din(rkcs_ibf_func))=4 or -- if seek
|
||||
unsigned(IB_MREQ.din(rkcs_ibf_func))=6 then -- or drive reset
|
||||
n.sbusy(conv_integer(unsigned(r.drsel))) := '1'; -- set busy
|
||||
end if;
|
||||
|
||||
end if;
|
||||
else -- GO=0
|
||||
if r.ide = '0' and -- if ide now 0
|
||||
IB_MREQ.din(rkcs_ibf_ide)='1' and -- and is set to 1
|
||||
r.rdy='1' then -- and controller ready
|
||||
n.fireq := '1'; -- issue interrupt
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when ibaddr_rkda => -- RKDA -- disk address register -----
|
||||
if ibrem = '0' then -- loc access ?
|
||||
if r.rdy = '0' then -- controller busy ?
|
||||
imem_we0 := '0'; -- suppress write
|
||||
imem_we1 := '0';
|
||||
end if;
|
||||
end if;
|
||||
if imem_we1 = '1' then
|
||||
n.drsel := IB_MREQ.din(rkda_ibf_drsel); -- mirror drsel bits
|
||||
end if;
|
||||
|
||||
when ibaddr_rkmr => -- RKMR -- maintenance register ------
|
||||
idout := (others=>'0');
|
||||
idout(rkmr_ibf_rid) := r.rid;
|
||||
idout(rkmr_ibf_crdone) := r.crdone;
|
||||
idout(rkmr_ibf_sdone) := r.sbusy;
|
||||
if ibwrem = '1' then -- rem write ?
|
||||
n.rid := IB_MREQ.din(rkmr_ibf_rid);
|
||||
|
||||
if r.ide='1' and IB_MREQ.din(rkmr_ibf_sbclr)='0' then
|
||||
n.sireq := r.sireq or (IB_MREQ.din(rkmr_ibf_sdone) and r.sbusy);
|
||||
end if;
|
||||
n.sbusy := r.sbusy and not IB_MREQ.din(rkmr_ibf_sdone);
|
||||
|
||||
if IB_MREQ.din(rkmr_ibf_fdone) = '1' then -- func completed
|
||||
n.rdy := '1';
|
||||
n.crdone := '0';
|
||||
if r.ide = '1' then
|
||||
n.fireq := '1';
|
||||
end if;
|
||||
end if;
|
||||
if IB_MREQ.din(rkmr_ibf_creset) = '1' then -- control reset
|
||||
n.creset := '1';
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when others => -- all other regs
|
||||
null;
|
||||
|
||||
end case;
|
||||
|
||||
end if;
|
||||
|
||||
iscval := '1';
|
||||
if r.sireq(7) = '1' then iscid := "111";
|
||||
elsif r.sireq(6) = '1' then iscid := "110";
|
||||
elsif r.sireq(5) = '1' then iscid := "101";
|
||||
elsif r.sireq(4) = '1' then iscid := "100";
|
||||
elsif r.sireq(3) = '1' then iscid := "011";
|
||||
elsif r.sireq(2) = '1' then iscid := "010";
|
||||
elsif r.sireq(1) = '1' then iscid := "001";
|
||||
elsif r.sireq(0) = '1' then iscid := "000";
|
||||
else
|
||||
iscval := '0';
|
||||
end if;
|
||||
|
||||
if r.ide = '1' then
|
||||
if r.fireq='1' or iscval='1' then
|
||||
iei_req := '1';
|
||||
end if;
|
||||
end if;
|
||||
|
||||
if EI_ACK = '1' then -- interrupt executed
|
||||
if r.fireq = '1' then
|
||||
n.scp := '0'; -- clear scp flag, is command end
|
||||
n.fireq := '0';
|
||||
elsif iscval = '1' then -- was a seek done
|
||||
n.scp := '1'; -- signal seek complete interrupt
|
||||
n.id := iscid; -- load id
|
||||
n.sireq(conv_integer(unsigned(iscid))) := '0'; -- reset sireq bit
|
||||
end if;
|
||||
end if;
|
||||
|
||||
if icrip = '1' then -- control reset in progress ?
|
||||
imem_addr := '0' & r.icnt; -- use icnt as addr
|
||||
imem_din := (others=>'0'); -- force data to zero
|
||||
imem_we0 := '1'; -- enable writes
|
||||
imem_we1 := '1';
|
||||
end if;
|
||||
|
||||
if CE_MSEC = '1' then -- advance sector counter every msec
|
||||
if unsigned(r.sc) = 8#13# then -- sector counter (count to 8#13#)
|
||||
n.sc := (others=>'0');
|
||||
else
|
||||
n.sc := unsigned(r.sc) + 1;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
MEM_0_WE <= imem_we0;
|
||||
MEM_1_WE <= imem_we1;
|
||||
MEM_ADDR <= imem_addr;
|
||||
MEM_DIN <= imem_din;
|
||||
|
||||
IB_SRES.dout <= idout;
|
||||
IB_SRES.ack <= ibsel;
|
||||
IB_SRES.busy <= ibbusy;
|
||||
|
||||
RRI_LAM <= ilam;
|
||||
EI_REQ <= iei_req;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
|
||||
end syn;
|
||||
5
rtl/ibus/ibdr_sdreg.vbom
Normal file
5
rtl/ibus/ibdr_sdreg.vbom
Normal file
@@ -0,0 +1,5 @@
|
||||
# libs
|
||||
../vlib/slvtypes.vhd
|
||||
iblib.vhd
|
||||
# design
|
||||
ibdr_sdreg.vhd
|
||||
140
rtl/ibus/ibdr_sdreg.vhd
Normal file
140
rtl/ibus/ibdr_sdreg.vhd
Normal file
@@ -0,0 +1,140 @@
|
||||
-- $Id: ibdr_sdreg.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: ibdr_sdreg - syn
|
||||
-- Description: ibus dev(rem): Switch/Display register
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Test bench: -
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 10.1; ghdl 0.18-0.25
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2009-07-11 232 10.1.03 K39 xc3s1000-4 32 39 0 29 s 2.5
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-11 303 1.1 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2008-08-22 161 1.0.4 use iblib
|
||||
-- 2008-04-18 136 1.0.3 use RESET. Switch/Display not cleared by console
|
||||
-- reset or reset instruction, only by cpu_reset
|
||||
-- 2008-01-20 112 1.0.2 use BRESET
|
||||
-- 2008-01-05 110 1.0.1 rename IB_MREQ(ena->req) SRES(sel->ack, hold->busy)
|
||||
-- reorganize code, all in state_type/proc_next
|
||||
-- 2007-12-31 108 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.iblib.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
entity ibdr_sdreg is -- ibus dev(rem): Switch/Display regs
|
||||
-- fixed address: 177570
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
RESET : in slbit; -- reset
|
||||
IB_MREQ : in ib_mreq_type; -- ibus request
|
||||
IB_SRES : out ib_sres_type; -- ibus response
|
||||
DISPREG : out slv16 -- display register
|
||||
);
|
||||
end ibdr_sdreg;
|
||||
|
||||
architecture syn of ibdr_sdreg is
|
||||
|
||||
constant ibaddr_sdreg : slv16 := conv_std_logic_vector(8#177570#,16);
|
||||
|
||||
type regs_type is record -- state registers
|
||||
sreg : slv16; -- switch register
|
||||
dreg : slv16; -- display register
|
||||
end record regs_type;
|
||||
|
||||
constant regs_init : regs_type := (
|
||||
(others=>'0'),
|
||||
(others=>'0')
|
||||
);
|
||||
|
||||
signal R_REGS : regs_type := regs_init;
|
||||
signal N_REGS : regs_type := regs_init;
|
||||
|
||||
begin
|
||||
|
||||
proc_regs: process (CLK)
|
||||
begin
|
||||
if CLK'event and CLK='1' then
|
||||
if RESET = '1' then
|
||||
R_REGS <= regs_init;
|
||||
else
|
||||
R_REGS <= N_REGS;
|
||||
end if;
|
||||
end if;
|
||||
end process proc_regs;
|
||||
|
||||
proc_next : process (R_REGS, IB_MREQ)
|
||||
variable r : regs_type := regs_init;
|
||||
variable n : regs_type := regs_init;
|
||||
variable ibsel : slbit := '0';
|
||||
variable idout : slv16 := (others=>'0');
|
||||
begin
|
||||
|
||||
r := R_REGS;
|
||||
n := R_REGS;
|
||||
|
||||
ibsel := '0';
|
||||
idout := (others=>'0');
|
||||
|
||||
-- ibus address decoder
|
||||
if IB_MREQ.req='1' and IB_MREQ.addr=ibaddr_sdreg(12 downto 1) then
|
||||
ibsel := '1';
|
||||
end if;
|
||||
|
||||
-- ibus output driver
|
||||
if ibsel = '1' then
|
||||
if IB_MREQ.racc = '0' then
|
||||
idout := r.sreg; -- cpu will read switch register
|
||||
else
|
||||
idout := r.dreg; -- rri will read display register
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- ibus write transactions
|
||||
if ibsel='1' and IB_MREQ.we='1' then
|
||||
if IB_MREQ.racc = '0' then -- cpu will write display register
|
||||
if IB_MREQ.be1 = '1' then
|
||||
n.dreg(ibf_byte1) := IB_MREQ.din(ibf_byte1);
|
||||
end if;
|
||||
if IB_MREQ.be0 = '1' then
|
||||
n.dreg(ibf_byte0) := IB_MREQ.din(ibf_byte0);
|
||||
end if;
|
||||
else -- rri will write switch register
|
||||
n.sreg := IB_MREQ.din; -- byte write not supported
|
||||
end if;
|
||||
end if;
|
||||
|
||||
N_REGS <= n;
|
||||
|
||||
IB_SRES.dout <= idout;
|
||||
IB_SRES.ack <= ibsel;
|
||||
IB_SRES.busy <= '0';
|
||||
|
||||
DISPREG <= r.dreg;
|
||||
|
||||
end process proc_next;
|
||||
|
||||
|
||||
end syn;
|
||||
123
rtl/ibus/iblib.vhd
Normal file
123
rtl/ibus/iblib.vhd
Normal file
@@ -0,0 +1,123 @@
|
||||
-- $Id: iblib.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2008-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Package Name: iblib
|
||||
-- Description: Definitions for ibus interface and bus entities
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-11 303 1.1 added racc,cacc signals to ib_mreq_type
|
||||
-- 2009-06-01 221 1.0.1 added dip signal to ib_mreq_type
|
||||
-- 2008-08-22 161 1.0 Initial version (extracted from pdp11.vhd)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
package iblib is
|
||||
|
||||
type ib_mreq_type is record -- ibus - master request
|
||||
req : slbit; -- request
|
||||
we : slbit; -- write enable
|
||||
be0 : slbit; -- byte enable low
|
||||
be1 : slbit; -- byte enable high
|
||||
dip : slbit; -- data in pause: rmw cycle 1st part
|
||||
cacc : slbit; -- console access
|
||||
racc : slbit; -- remote access
|
||||
addr : slv13_1; -- address bit(12:1)
|
||||
din : slv16; -- data (input to slave)
|
||||
end record ib_mreq_type;
|
||||
|
||||
constant ib_mreq_init : ib_mreq_type :=
|
||||
('0','0','0','0', -- req, we, be0, be1,
|
||||
'0','0','0', -- dip, cacc, racc
|
||||
(others=>'0'), -- addr
|
||||
(others=>'0')); -- din
|
||||
|
||||
type ib_sres_type is record -- ibus - slave response
|
||||
ack : slbit; -- acknowledge
|
||||
busy : slbit; -- busy
|
||||
dout : slv16; -- data (output from slave)
|
||||
end record ib_sres_type;
|
||||
|
||||
constant ib_sres_init : ib_sres_type :=
|
||||
('0','0', -- ack, busy
|
||||
(others=>'0')); -- dout
|
||||
|
||||
type ib_sres_vector is array (natural range <>) of ib_sres_type;
|
||||
|
||||
subtype ibf_byte1 is integer range 15 downto 8;
|
||||
subtype ibf_byte0 is integer range 7 downto 0;
|
||||
|
||||
component ib_sres_or_2 is -- ibus result or, 2 input
|
||||
port (
|
||||
IB_SRES_1 : in ib_sres_type; -- ib_sres input 1
|
||||
IB_SRES_2 : in ib_sres_type := ib_sres_init; -- ib_sres input 2
|
||||
IB_SRES_OR : out ib_sres_type -- ib_sres or'ed output
|
||||
);
|
||||
end component;
|
||||
component ib_sres_or_3 is -- ibus result or, 3 input
|
||||
port (
|
||||
IB_SRES_1 : in ib_sres_type; -- ib_sres input 1
|
||||
IB_SRES_2 : in ib_sres_type := ib_sres_init; -- ib_sres input 2
|
||||
IB_SRES_3 : in ib_sres_type := ib_sres_init; -- ib_sres input 3
|
||||
IB_SRES_OR : out ib_sres_type -- ib_sres or'ed output
|
||||
);
|
||||
end component;
|
||||
component ib_sres_or_4 is -- ibus result or, 4 input
|
||||
port (
|
||||
IB_SRES_1 : in ib_sres_type; -- ib_sres input 1
|
||||
IB_SRES_2 : in ib_sres_type := ib_sres_init; -- ib_sres input 2
|
||||
IB_SRES_3 : in ib_sres_type := ib_sres_init; -- ib_sres input 3
|
||||
IB_SRES_4 : in ib_sres_type := ib_sres_init; -- ib_sres input 4
|
||||
IB_SRES_OR : out ib_sres_type -- ib_sres or'ed output
|
||||
);
|
||||
end component;
|
||||
|
||||
component ib_sres_or_gen is -- ibus result or, generic
|
||||
generic (
|
||||
WIDTH : natural := 4); -- number of input ports
|
||||
port (
|
||||
IB_SRES_IN : in ib_sres_vector(1 to WIDTH); -- ib_sres input array
|
||||
IB_SRES_OR : out ib_sres_type -- ib_sres or'ed output
|
||||
);
|
||||
end component;
|
||||
|
||||
type intmap_type is record -- interrupt map entry type
|
||||
vec : integer; -- vector address
|
||||
pri : integer; -- priority
|
||||
end record intmap_type;
|
||||
constant intmap_init : intmap_type := (0,0);
|
||||
|
||||
type intmap_array_type is array (15 downto 0) of intmap_type;
|
||||
constant intmap_array_init : intmap_array_type := (others=>intmap_init);
|
||||
|
||||
component ib_intmap is -- external interrupt mapper
|
||||
generic (
|
||||
INTMAP : intmap_array_type := intmap_array_init);
|
||||
port (
|
||||
EI_REQ : in slv16_1; -- interrupt request lines
|
||||
EI_ACKM : in slbit; -- interrupt acknowledge (from master)
|
||||
EI_ACK : out slv16_1; -- interrupt acknowledge (to requestor)
|
||||
EI_PRI : out slv3; -- interrupt priority
|
||||
EI_VECT : out slv9_2 -- interrupt vector
|
||||
);
|
||||
end component;
|
||||
|
||||
end package iblib;
|
||||
4
rtl/sys_gen/w11a/nexys2/.cvsignore
Normal file
4
rtl/sys_gen/w11a/nexys2/.cvsignore
Normal file
@@ -0,0 +1,4 @@
|
||||
sys_w11a_n2.ucf
|
||||
*.dep_ucf_cpp
|
||||
log_*
|
||||
_impact*
|
||||
32
rtl/sys_gen/w11a/nexys2/Makefile
Normal file
32
rtl/sys_gen/w11a/nexys2/Makefile
Normal file
@@ -0,0 +1,32 @@
|
||||
# $Id: Makefile 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2010-05-28 295 1.0 Initial version (derived from _s3 version)
|
||||
#
|
||||
VBOM_all = $(wildcard *.vbom)
|
||||
BIT_all = $(VBOM_all:.vbom=.bit)
|
||||
#
|
||||
ISE_BOARD = nexys2
|
||||
ISE_PATH = xc3s1200e-fg320-4
|
||||
#
|
||||
.phony : all clean
|
||||
#
|
||||
all : $(BIT_all)
|
||||
#
|
||||
clean : ise_clean
|
||||
rm -f sys_w11a_n2.ucf
|
||||
#
|
||||
sys_w11a_n2.mcs : sys_w11a_n2.bit
|
||||
promgen -w -x xcf04s -p mcs -u 0 sys_w11a_n2
|
||||
mv sys_w11a_n2.prm sys_w11a_n2_prm.log
|
||||
mv sys_w11a_n2.cfi sys_w11a_n2_cfi.log
|
||||
#
|
||||
#----
|
||||
#
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.xflow
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.ghdl
|
||||
#
|
||||
include $(VBOM_all:.vbom=.dep_xst)
|
||||
include $(VBOM_all:.vbom=.dep_ghdl)
|
||||
#
|
||||
58
rtl/sys_gen/w11a/nexys2/sys_conf.vhd
Normal file
58
rtl/sys_gen/w11a/nexys2/sys_conf.vhd
Normal file
@@ -0,0 +1,58 @@
|
||||
-- $Id: sys_conf.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Package Name: sys_conf
|
||||
-- Description: Definitions for sys_w11a_n2 (for synthesis)
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-05 295 1.0 Initial version (derived from _s3 version)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
package sys_conf is
|
||||
|
||||
constant sys_conf_hio_debounce : boolean := true; -- instantiate debouncers
|
||||
constant sys_conf_ser2rri_cdinit : integer := 434-1; -- 50000000/115200
|
||||
|
||||
constant sys_conf_bram : integer := 0; -- no bram, use cache
|
||||
constant sys_conf_bram_awidth : integer := 14; -- bram size (16 kB)
|
||||
constant sys_conf_mem_losize : integer := 8#167777#; -- 4 MByte
|
||||
--constant sys_conf_mem_losize : integer := 8#003777#; -- 128 kByte (debug)
|
||||
|
||||
-- constant sys_conf_bram : integer := 1; -- bram only
|
||||
-- constant sys_conf_bram_awidth : integer := 15; -- bram size (32 kB)
|
||||
-- constant sys_conf_mem_losize : integer := 8#000777#; -- 32 kByte
|
||||
|
||||
constant sys_conf_cache_fmiss : slbit := '0'; -- cache enabled
|
||||
|
||||
end package sys_conf;
|
||||
|
||||
-- Note: mem_losize holds 16 MSB of the PA of the addressable memory
|
||||
-- 2 211 111 111 110 000 000 000
|
||||
-- 1 098 765 432 109 876 543 210
|
||||
--
|
||||
-- 0 000 000 011 111 111 000 000 -> 00037777 --> 14bit --> 16 kByte
|
||||
-- 0 000 000 111 111 111 000 000 -> 00077777 --> 15bit --> 32 kByte
|
||||
-- 0 000 001 111 111 111 000 000 -> 00177777 --> 16bit --> 64 kByte
|
||||
-- 0 000 011 111 111 111 000 000 -> 00377777 --> 17bit --> 128 kByte
|
||||
-- 0 011 111 111 111 111 000 000 -> 03777777 --> 20bit --> 1 MByte
|
||||
-- 1 110 111 111 111 111 000 000 -> 16777777 --> 22bit --> 4 MByte
|
||||
-- upper 256 kB excluded for 11/70 UB
|
||||
19
rtl/sys_gen/w11a/nexys2/sys_w11a_n2.ucf_cpp
Normal file
19
rtl/sys_gen/w11a/nexys2/sys_w11a_n2.ucf_cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
## $Id: sys_w11a_n2.ucf_cpp 311 2010-06-30 17:52:37Z mueller $
|
||||
##
|
||||
## Revision History:
|
||||
## Date Rev Version Comment
|
||||
## 2010-05-26 295 1.0 Initial version
|
||||
##
|
||||
|
||||
NET "CLK" TNM_NET = "CLK";
|
||||
TIMESPEC "TS_CLK" = PERIOD "CLK" 20 ns HIGH 50 %;
|
||||
OFFSET = IN 10 ns BEFORE "CLK";
|
||||
OFFSET = OUT 20 ns AFTER "CLK";
|
||||
|
||||
## std board
|
||||
##
|
||||
#include "bplib/nexys2/nexys2_pins.ucf"
|
||||
##
|
||||
## Pmod B0 - RS232
|
||||
##
|
||||
#include "bplib/nexys2/nexys2_pins_pmb0_rs232.ucf"
|
||||
30
rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vbom
Normal file
30
rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vbom
Normal file
@@ -0,0 +1,30 @@
|
||||
# libs
|
||||
../../../vlib/slvtypes.vhd
|
||||
../../../vlib/genlib/genlib.vhd
|
||||
../../../vlib/rri/rrilib.vhd
|
||||
../../../bplib/s3board/s3boardlib.vbom
|
||||
../../../bplib/nexys2/nexys2lib.vhd
|
||||
../../../ibus/iblib.vhd
|
||||
../../../ibus/ibdlib.vhd
|
||||
../../../w11a/pdp11.vhd
|
||||
sys_conf = sys_conf.vhd
|
||||
# components
|
||||
../../../vlib/genlib/clkdivce.vbom
|
||||
../../../bplib/s3board/s3_rs232_iob_int_ext.vbom
|
||||
../../../bplib/s3board/s3_humanio_rri.vbom
|
||||
../../../vlib/rri/rri_core_serport.vbom
|
||||
../../../vlib/rri/rb_sres_or_3.vbom
|
||||
../../../w11a/pdp11_core_rri.vbom
|
||||
../../../w11a/pdp11_core.vbom
|
||||
../../../w11a/pdp11_bram.vbom
|
||||
../../../bplib/nexys2/n2_cram_dummy.vbom
|
||||
../../../w11a/pdp11_cache.vbom
|
||||
../../../w11a/pdp11_mem70.vbom
|
||||
../../../bplib/nexys2/n2_cram_memctl_as.vbom
|
||||
../../../ibus/ib_sres_or_2.vbom
|
||||
../../../ibus/ibdr_minisys.vbom
|
||||
../../../ibus/ibdr_maxisys.vbom
|
||||
[ghdl,isim]../../../w11a/pdp11_tmu_sb.vbom
|
||||
# design
|
||||
sys_w11a_n2.vhd
|
||||
@ucf_cpp: sys_w11a_n2.ucf
|
||||
553
rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vhd
Normal file
553
rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vhd
Normal file
@@ -0,0 +1,553 @@
|
||||
-- $Id: sys_w11a_n2.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: sys_w11a_n2 - syn
|
||||
-- Description: w11a test design for nexys2
|
||||
--
|
||||
-- Dependencies: vlib/genlib/clkdivce
|
||||
-- bplib/s3board/s3_rs232_iob_int_ext
|
||||
-- bplib/s3board/s3_humanio_rri
|
||||
-- vlib/rri/rri_core_serport
|
||||
-- vlib/rri/rb_sres_or_3
|
||||
-- w11a/pdp11_core_rri
|
||||
-- w11a/pdp11_core
|
||||
-- w11a/pdp11_bram
|
||||
-- vlib/nexys2/n2_cram_dummy
|
||||
-- w11a/pdp11_cache
|
||||
-- w11a/pdp11_mem70
|
||||
-- bplib/nexys2/n2_cram_memctl
|
||||
-- ibus/ib_sres_or_2
|
||||
-- ibus/ibdr_minisys
|
||||
-- ibus/ibdr_maxisys
|
||||
-- w11a/pdp11_tmu_sb [sim only]
|
||||
--
|
||||
-- Test bench: tb/tb_s3board_w11a_n2
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.2, 9.1, 9.2, 10.1, 11.4, 12.1; ghdl 0.26 - 0.29
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2010-06-27 310 12.1 M53d xc3s1200e-4 1337 4307 242 2630 ok: LP+PC+DL+I
|
||||
-- 2010-06-26 309 11.4 L68 xc3s1200e-4 1318 4293 242 2612 ok: LP+PC+DL+II
|
||||
-- 2010-06-18 306 12.1 M53d xc3s1200e-4 1319 4300 242 2624 ok: LP+PC+DL+II
|
||||
-- " 306 11.4 L68 xc3s1200e-4 1319 4286 242 2618 ok: LP+PC+DL+II
|
||||
-- " 306 10.1.02 K39 xc3s1200e-4 1309 4311 242 2665 ok: LP+PC+DL+II
|
||||
-- " 306 9.2.02 J40 xc3s1200e-4 1316 4259 242 2656 ok: LP+PC+DL+II
|
||||
-- " 306 9.1 J30 xc3s1200e-4 1311 4260 242 2643 ok: LP+PC+DL+II
|
||||
-- " 306 8.2.03 I34 xc3s1200e-4 1371 4394 242 2765 ok: LP+PC+DL+II
|
||||
-- 2010-06-13 305 11.4 L68 xc3s1200e-4 1318 4360 242 2629 ok: LP+PC+DL+II
|
||||
-- 2010-06-12 304 11.4 L68 xc3s1200e-4 1323 4201 242 2574 ok: LP+PC+DL+II
|
||||
-- 2010-06-03 300 11.4 L68 xc3s1200e-4 1318 4181 242 2572 ok: LP+PC+DL+II
|
||||
-- 2010-06-03 299 11.4 L68 xc3s1200e-4 1250 4071 224 2489 ok: LP+PC+DL+II
|
||||
-- 2010-05-26 296 11.4 L68 xc3s1200e-4 1284 4079 224 2492 ok: LP+PC+DL+II
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-26 309 1.1.4 use constants for rbus addresses (rbaddr_...)
|
||||
-- BUGFIX: resolve rbus address clash hio<->ibr
|
||||
-- 2010-06-18 306 1.1.3 change proc_led sensitivity list to avoid xst warn;
|
||||
-- rename RB_ADDR->RB_ADDR_CORE, add RB_ADDR_IBUS;
|
||||
-- remove pdp11_ibdr_rri
|
||||
-- 2010-06-13 305 1.1.2 add CP_ADDR, wire up pdp11_core_rri->pdp11_core
|
||||
-- 2010-06-12 304 1.1.1 re-do LED driver logic (show cpu modes or cpurust)
|
||||
-- 2010-06-11 303 1.1 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2010-06-03 300 1.0.2 use default FAWIDTH for rri_core_serport
|
||||
-- use s3_humanio_rri
|
||||
-- 2010-05-30 297 1.0.1 put MEM_ACT_(R|W) on LED 6,7
|
||||
-- 2010-05-28 295 1.0 Initial version (derived from sys_w11a_s3)
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
-- w11a test design for nexys2
|
||||
-- w11a + rri + serport
|
||||
--
|
||||
-- Usage of Nexys 2 Switches, Buttons, LEDs:
|
||||
--
|
||||
-- SWI(0): 0 -> main board RS232 port
|
||||
-- 1 -> Pmod B/top RS232 port
|
||||
--
|
||||
-- LED(0:4): if cpugo=1 show cpu mode activity
|
||||
-- (0) user mode
|
||||
-- (1) supervisor mode
|
||||
-- (2) kernel mode, wait
|
||||
-- (3) kernel mode, pri=0
|
||||
-- (4) kernel mode, pri>0
|
||||
-- if cpugo=0 shows cpurust
|
||||
-- (3:0) cpurust code
|
||||
-- (4) '1'
|
||||
-- (5) cmdbusy (all rri access, mostly rdma)
|
||||
-- (6) MEM_ACT_R
|
||||
-- (7) MEM_ACT_W
|
||||
--
|
||||
-- DP(0): RXSD (inverted to signal activity)
|
||||
-- DP(1): RTS_N (shows rx back preasure)
|
||||
-- DP(2): TXSD (inverted to signal activity)
|
||||
-- DP(3): CTS_N (shows tx back preasure)
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.genlib.all;
|
||||
use work.rrilib.all;
|
||||
use work.s3boardlib.all;
|
||||
use work.nexys2lib.all;
|
||||
use work.iblib.all;
|
||||
use work.ibdlib.all;
|
||||
use work.pdp11.all;
|
||||
use work.sys_conf.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity sys_w11a_n2 is -- top level
|
||||
-- implements nexys2_fusp_aif
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
I_RXD : in slbit; -- receive data (board view)
|
||||
O_TXD : out slbit; -- transmit data (board view)
|
||||
I_SWI : in slv8; -- s3 switches
|
||||
I_BTN : in slv4; -- s3 buttons
|
||||
O_LED : out slv8; -- s3 leds
|
||||
O_ANO_N : out slv4; -- 7 segment disp: anodes (act.low)
|
||||
O_SEG_N : out slv8; -- 7 segment disp: segments (act.low)
|
||||
O_MEM_CE_N : out slbit; -- cram: chip enable (act.low)
|
||||
O_MEM_BE_N : out slv2; -- cram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- cram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- cram: output enable (act.low)
|
||||
O_MEM_ADV_N : out slbit; -- cram: address valid (act.low)
|
||||
O_MEM_CLK : out slbit; -- cram: clock
|
||||
O_MEM_CRE : out slbit; -- cram: command register enable
|
||||
I_MEM_WAIT : in slbit; -- cram: mem wait
|
||||
O_FLA_CE_N : out slbit; -- flash ce.. (act.low)
|
||||
O_MEM_ADDR : out slv23; -- cram: address lines
|
||||
IO_MEM_DATA : inout slv16; -- cram: data lines
|
||||
O_FUSP_RTS_N : out slbit; -- fusp: rs232 rts_n
|
||||
I_FUSP_CTS_N : in slbit; -- fusp: rs232 cts_n
|
||||
I_FUSP_RXD : in slbit; -- fusp: rs232 rx
|
||||
O_FUSP_TXD : out slbit -- fusp: rs232 tx
|
||||
);
|
||||
end sys_w11a_n2;
|
||||
|
||||
architecture syn of sys_w11a_n2 is
|
||||
|
||||
signal RXD : slbit := '1';
|
||||
signal TXD : slbit := '0';
|
||||
signal RTS_N : slbit := '0';
|
||||
signal CTS_N : slbit := '0';
|
||||
|
||||
signal SWI : slv8 := (others=>'0');
|
||||
signal BTN : slv4 := (others=>'0');
|
||||
signal LED : slv8 := (others=>'0');
|
||||
signal DSP_DAT : slv16 := (others=>'0');
|
||||
signal DSP_DP : slv4 := (others=>'0');
|
||||
|
||||
signal RB_LAM : slv16 := (others=>'0');
|
||||
signal RB_STAT : slv3 := (others=>'0');
|
||||
|
||||
signal RB_MREQ : rb_mreq_type := rb_mreq_init;
|
||||
signal RB_SRES : rb_sres_type := rb_sres_init;
|
||||
signal RB_SRES_CPU : rb_sres_type := rb_sres_init;
|
||||
signal RB_SRES_IBD : rb_sres_type := rb_sres_init;
|
||||
signal RB_SRES_HIO : rb_sres_type := rb_sres_init;
|
||||
|
||||
signal RESET : slbit := '0';
|
||||
signal CE_USEC : slbit := '0';
|
||||
signal CE_MSEC : slbit := '0';
|
||||
|
||||
signal CPU_RESET : slbit := '0';
|
||||
signal CP_CNTL : cp_cntl_type := cp_cntl_init;
|
||||
signal CP_ADDR : cp_addr_type := cp_addr_init;
|
||||
signal CP_DIN : slv16 := (others=>'0');
|
||||
signal CP_STAT : cp_stat_type := cp_stat_init;
|
||||
signal CP_DOUT : slv16 := (others=>'0');
|
||||
|
||||
signal EI_PRI : slv3 := (others=>'0');
|
||||
signal EI_VECT : slv9_2 := (others=>'0');
|
||||
signal EI_ACKM : slbit := '0';
|
||||
|
||||
signal EM_MREQ : em_mreq_type := em_mreq_init;
|
||||
signal EM_SRES : em_sres_type := em_sres_init;
|
||||
|
||||
signal HM_ENA : slbit := '0';
|
||||
signal MEM70_FMISS : slbit := '0';
|
||||
signal CACHE_FMISS : slbit := '0';
|
||||
signal CACHE_CHIT : slbit := '0';
|
||||
|
||||
signal MEM_REQ : slbit := '0';
|
||||
signal MEM_WE : slbit := '0';
|
||||
signal MEM_BUSY : slbit := '0';
|
||||
signal MEM_ACK_R : slbit := '0';
|
||||
signal MEM_ACT_R : slbit := '0';
|
||||
signal MEM_ACT_W : slbit := '0';
|
||||
signal MEM_ADDR : slv20 := (others=>'0');
|
||||
signal MEM_BE : slv4 := (others=>'0');
|
||||
signal MEM_DI : slv32 := (others=>'0');
|
||||
signal MEM_DO : slv32 := (others=>'0');
|
||||
|
||||
signal MEM_ADDR_EXT : slv22 := (others=>'0');
|
||||
|
||||
signal BRESET : slbit := '0';
|
||||
signal IB_MREQ : ib_mreq_type := ib_mreq_init;
|
||||
signal IB_SRES : ib_sres_type := ib_sres_init;
|
||||
|
||||
signal IB_SRES_MEM70 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_IBDR : ib_sres_type := ib_sres_init;
|
||||
|
||||
signal DM_STAT_DP : dm_stat_dp_type := dm_stat_dp_init;
|
||||
signal DM_STAT_VM : dm_stat_vm_type := dm_stat_vm_init;
|
||||
signal DM_STAT_CO : dm_stat_co_type := dm_stat_co_init;
|
||||
signal DM_STAT_SY : dm_stat_sy_type := dm_stat_sy_init;
|
||||
|
||||
signal DISPREG : slv16 := (others=>'0');
|
||||
|
||||
constant rbaddr_core0 : slv8 := "00000000";
|
||||
constant rbaddr_ibus : slv8 := "10000000";
|
||||
constant rbaddr_hio : slv8 := "11000000";
|
||||
|
||||
begin
|
||||
|
||||
CLKDIV : clkdivce
|
||||
generic map (
|
||||
CDUWIDTH => 6,
|
||||
USECDIV => 50,
|
||||
MSECDIV => 1000)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
CE_MSEC => CE_MSEC
|
||||
);
|
||||
|
||||
IOB_RS232 : s3_rs232_iob_int_ext
|
||||
port map (
|
||||
CLK => CLK,
|
||||
SEL => SWI(0),
|
||||
RXD => RXD,
|
||||
TXD => TXD,
|
||||
CTS_N => CTS_N,
|
||||
RTS_N => RTS_N,
|
||||
I_RXD0 => I_RXD,
|
||||
O_TXD0 => O_TXD,
|
||||
I_RXD1 => I_FUSP_RXD,
|
||||
O_TXD1 => O_FUSP_TXD,
|
||||
I_CTS1_N => I_FUSP_CTS_N,
|
||||
O_RTS1_N => O_FUSP_RTS_N
|
||||
);
|
||||
|
||||
HIO : s3_humanio_rri
|
||||
generic map (
|
||||
DEBOUNCE => sys_conf_hio_debounce,
|
||||
RB_ADDR => rbaddr_hio)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
CE_MSEC => CE_MSEC,
|
||||
RB_MREQ => RB_MREQ,
|
||||
RB_SRES => RB_SRES_HIO,
|
||||
SWI => SWI,
|
||||
BTN => BTN,
|
||||
LED => LED,
|
||||
DSP_DAT => DSP_DAT,
|
||||
DSP_DP => DSP_DP,
|
||||
I_SWI => I_SWI,
|
||||
I_BTN => I_BTN,
|
||||
O_LED => O_LED,
|
||||
O_ANO_N => O_ANO_N,
|
||||
O_SEG_N => O_SEG_N
|
||||
);
|
||||
|
||||
RRI : rri_core_serport
|
||||
generic map (
|
||||
ATOWIDTH => 6, -- 64 cycles access timeout
|
||||
ITOWIDTH => 6, -- 64 periods max idle timeout
|
||||
CDWIDTH => 13,
|
||||
CDINIT => sys_conf_ser2rri_cdinit)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
CE_MSEC => CE_MSEC,
|
||||
CE_INT => CE_MSEC,
|
||||
RESET => RESET,
|
||||
RXSD => RXD,
|
||||
TXSD => TXD,
|
||||
CTS_N => CTS_N,
|
||||
RTS_N => RTS_N,
|
||||
RB_MREQ => RB_MREQ,
|
||||
RB_SRES => RB_SRES,
|
||||
RB_LAM => RB_LAM,
|
||||
RB_STAT => RB_STAT
|
||||
);
|
||||
|
||||
RB_SRES_OR : rb_sres_or_3
|
||||
port map (
|
||||
RB_SRES_1 => RB_SRES_CPU,
|
||||
RB_SRES_2 => RB_SRES_IBD,
|
||||
RB_SRES_3 => RB_SRES_HIO,
|
||||
RB_SRES_OR => RB_SRES
|
||||
);
|
||||
|
||||
RB2CP : pdp11_core_rri
|
||||
generic map (
|
||||
RB_ADDR_CORE => rbaddr_core0,
|
||||
RB_ADDR_IBUS => rbaddr_ibus)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
RB_MREQ => RB_MREQ,
|
||||
RB_SRES => RB_SRES_CPU,
|
||||
RB_STAT => RB_STAT,
|
||||
RRI_LAM => RB_LAM(0),
|
||||
CPU_RESET => CPU_RESET,
|
||||
CP_CNTL => CP_CNTL,
|
||||
CP_ADDR => CP_ADDR,
|
||||
CP_DIN => CP_DIN,
|
||||
CP_STAT => CP_STAT,
|
||||
CP_DOUT => CP_DOUT
|
||||
);
|
||||
|
||||
CORE : pdp11_core
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => CPU_RESET,
|
||||
CP_CNTL => CP_CNTL,
|
||||
CP_ADDR => CP_ADDR,
|
||||
CP_DIN => CP_DIN,
|
||||
CP_STAT => CP_STAT,
|
||||
CP_DOUT => CP_DOUT,
|
||||
EI_PRI => EI_PRI,
|
||||
EI_VECT => EI_VECT,
|
||||
EI_ACKM => EI_ACKM,
|
||||
EM_MREQ => EM_MREQ,
|
||||
EM_SRES => EM_SRES,
|
||||
BRESET => BRESET,
|
||||
IB_MREQ_M => IB_MREQ,
|
||||
IB_SRES_M => IB_SRES,
|
||||
DM_STAT_DP => DM_STAT_DP,
|
||||
DM_STAT_VM => DM_STAT_VM,
|
||||
DM_STAT_CO => DM_STAT_CO
|
||||
);
|
||||
|
||||
MEM_BRAM: if sys_conf_bram > 0 generate
|
||||
signal HM_VAL_BRAM : slbit := '0';
|
||||
begin
|
||||
|
||||
MEM : pdp11_bram
|
||||
generic map (
|
||||
AWIDTH => sys_conf_bram_awidth)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
GRESET => CPU_RESET,
|
||||
EM_MREQ => EM_MREQ,
|
||||
EM_SRES => EM_SRES
|
||||
);
|
||||
|
||||
HM_VAL_BRAM <= not EM_MREQ.we; -- assume hit if read, miss if write
|
||||
|
||||
MEM70: pdp11_mem70
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CRESET => BRESET,
|
||||
HM_ENA => EM_MREQ.req,
|
||||
HM_VAL => HM_VAL_BRAM,
|
||||
CACHE_FMISS => MEM70_FMISS,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_MEM70
|
||||
);
|
||||
|
||||
SRAM_PROT : n2_cram_dummy -- connect CRAM to protection dummy
|
||||
port map (
|
||||
O_MEM_CE_N => O_MEM_CE_N,
|
||||
O_MEM_BE_N => O_MEM_BE_N,
|
||||
O_MEM_WE_N => O_MEM_WE_N,
|
||||
O_MEM_OE_N => O_MEM_OE_N,
|
||||
O_MEM_ADV_N => O_MEM_ADV_N,
|
||||
O_MEM_CLK => O_MEM_CLK,
|
||||
O_MEM_CRE => O_MEM_CRE,
|
||||
I_MEM_WAIT => I_MEM_WAIT,
|
||||
O_FLA_CE_N => O_FLA_CE_N,
|
||||
O_MEM_ADDR => O_MEM_ADDR,
|
||||
IO_MEM_DATA => IO_MEM_DATA
|
||||
);
|
||||
|
||||
end generate MEM_BRAM;
|
||||
|
||||
MEM_SRAM: if sys_conf_bram = 0 generate
|
||||
|
||||
CACHE: pdp11_cache
|
||||
port map (
|
||||
CLK => CLK,
|
||||
GRESET => CPU_RESET,
|
||||
EM_MREQ => EM_MREQ,
|
||||
EM_SRES => EM_SRES,
|
||||
FMISS => CACHE_FMISS,
|
||||
CHIT => CACHE_CHIT,
|
||||
MEM_REQ => MEM_REQ,
|
||||
MEM_WE => MEM_WE,
|
||||
MEM_BUSY => MEM_BUSY,
|
||||
MEM_ACK_R => MEM_ACK_R,
|
||||
MEM_ADDR => MEM_ADDR,
|
||||
MEM_BE => MEM_BE,
|
||||
MEM_DI => MEM_DI,
|
||||
MEM_DO => MEM_DO
|
||||
);
|
||||
|
||||
MEM70: pdp11_mem70
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CRESET => BRESET,
|
||||
HM_ENA => HM_ENA,
|
||||
HM_VAL => CACHE_CHIT,
|
||||
CACHE_FMISS => MEM70_FMISS,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_MEM70
|
||||
);
|
||||
|
||||
HM_ENA <= EM_SRES.ack_r or EM_SRES.ack_w;
|
||||
CACHE_FMISS <= MEM70_FMISS or sys_conf_cache_fmiss;
|
||||
|
||||
MEM_ADDR_EXT <= "00" & MEM_ADDR; -- just use lower 4 MB (of 16 MB)
|
||||
|
||||
SRAM_CTL: n2_cram_memctl_as
|
||||
generic map (
|
||||
READ0DELAY => 2,
|
||||
READ1DELAY => 2,
|
||||
WRITEDELAY => 3)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => CPU_RESET,
|
||||
REQ => MEM_REQ,
|
||||
WE => MEM_WE,
|
||||
BUSY => MEM_BUSY,
|
||||
ACK_R => MEM_ACK_R,
|
||||
ACK_W => open,
|
||||
ACT_R => MEM_ACT_R,
|
||||
ACT_W => MEM_ACT_W,
|
||||
ADDR => MEM_ADDR_EXT,
|
||||
BE => MEM_BE,
|
||||
DI => MEM_DI,
|
||||
DO => MEM_DO,
|
||||
O_MEM_CE_N => O_MEM_CE_N,
|
||||
O_MEM_BE_N => O_MEM_BE_N,
|
||||
O_MEM_WE_N => O_MEM_WE_N,
|
||||
O_MEM_OE_N => O_MEM_OE_N,
|
||||
O_MEM_ADV_N => O_MEM_ADV_N,
|
||||
O_MEM_CLK => O_MEM_CLK,
|
||||
O_MEM_CRE => O_MEM_CRE,
|
||||
I_MEM_WAIT => I_MEM_WAIT,
|
||||
O_FLA_CE_N => O_FLA_CE_N,
|
||||
O_MEM_ADDR => O_MEM_ADDR,
|
||||
IO_MEM_DATA => IO_MEM_DATA
|
||||
);
|
||||
|
||||
end generate MEM_SRAM;
|
||||
|
||||
IB_SRES_OR : ib_sres_or_2
|
||||
port map (
|
||||
IB_SRES_1 => IB_SRES_MEM70,
|
||||
IB_SRES_2 => IB_SRES_IBDR,
|
||||
IB_SRES_OR => IB_SRES
|
||||
);
|
||||
|
||||
IBD_MINI : if false generate
|
||||
begin
|
||||
IBDR_SYS : ibdr_minisys
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
CE_MSEC => CE_MSEC,
|
||||
RESET => CPU_RESET,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RB_LAM(15 downto 1),
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_IBDR,
|
||||
EI_ACKM => EI_ACKM,
|
||||
EI_PRI => EI_PRI,
|
||||
EI_VECT => EI_VECT,
|
||||
DISPREG => DISPREG
|
||||
);
|
||||
end generate IBD_MINI;
|
||||
|
||||
IBD_MAXI : if true generate
|
||||
begin
|
||||
IBDR_SYS : ibdr_maxisys
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
CE_MSEC => CE_MSEC,
|
||||
RESET => CPU_RESET,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RB_LAM(15 downto 1),
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_IBDR,
|
||||
EI_ACKM => EI_ACKM,
|
||||
EI_PRI => EI_PRI,
|
||||
EI_VECT => EI_VECT,
|
||||
DISPREG => DISPREG
|
||||
);
|
||||
end generate IBD_MAXI;
|
||||
|
||||
DSP_DAT(15 downto 0) <= DISPREG;
|
||||
DSP_DP(0) <= not RXD;
|
||||
DSP_DP(1) <= RTS_N;
|
||||
DSP_DP(2) <= not TXD;
|
||||
DSP_DP(3) <= CTS_N;
|
||||
|
||||
proc_led: process (MEM_ACT_W, MEM_ACT_R, CP_STAT, DM_STAT_DP.psw)
|
||||
variable iled : slv8 := (others=>'0');
|
||||
begin
|
||||
iled := (others=>'0');
|
||||
iled(7) := MEM_ACT_W;
|
||||
iled(6) := MEM_ACT_R;
|
||||
iled(5) := CP_STAT.cmdbusy;
|
||||
if CP_STAT.cpugo = '1' then
|
||||
case DM_STAT_DP.psw.cmode is
|
||||
when c_psw_kmode =>
|
||||
if CP_STAT.cpuwait = '1' then
|
||||
iled(2) := '1';
|
||||
elsif unsigned(DM_STAT_DP.psw.pri) = 0 then
|
||||
iled(3) := '1';
|
||||
else
|
||||
iled(4) := '1';
|
||||
end if;
|
||||
when c_psw_smode =>
|
||||
iled(1) := '1';
|
||||
when c_psw_umode =>
|
||||
iled(0) := '1';
|
||||
when others => null;
|
||||
end case;
|
||||
else
|
||||
iled(4) := '1';
|
||||
iled(3 downto 0) := CP_STAT.cpurust;
|
||||
end if;
|
||||
LED <= iled;
|
||||
end process;
|
||||
|
||||
-- synthesis translate_off
|
||||
DM_STAT_SY.emmreq <= EM_MREQ;
|
||||
DM_STAT_SY.emsres <= EM_SRES;
|
||||
DM_STAT_SY.chit <= CACHE_CHIT;
|
||||
|
||||
TMU : pdp11_tmu_sb
|
||||
generic map (
|
||||
ENAPIN => 13)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
DM_STAT_DP => DM_STAT_DP,
|
||||
DM_STAT_VM => DM_STAT_VM,
|
||||
DM_STAT_CO => DM_STAT_CO,
|
||||
DM_STAT_SY => DM_STAT_SY
|
||||
);
|
||||
|
||||
-- synthesis translate_on
|
||||
end syn;
|
||||
8
rtl/sys_gen/w11a/nexys2/tb/.cvsignore
Normal file
8
rtl/sys_gen/w11a/nexys2/tb/.cvsignore
Normal file
@@ -0,0 +1,8 @@
|
||||
tb_w11a_n2
|
||||
tb_w11a_n2_[sft]sim
|
||||
tb_rriext_fifo_rx
|
||||
tb_rriext_fifo_tx
|
||||
tb_rriext_conf
|
||||
tmu_ofile
|
||||
sys_w11a_n2.ucf
|
||||
*.dep_ucf_cpp
|
||||
30
rtl/sys_gen/w11a/nexys2/tb/Makefile
Normal file
30
rtl/sys_gen/w11a/nexys2/tb/Makefile
Normal file
@@ -0,0 +1,30 @@
|
||||
# $Id: Makefile 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2010-05-26 295 1.0 Initial version
|
||||
#
|
||||
EXE_all = tb_w11a_n2
|
||||
#
|
||||
ISE_PATH = xc3s1200e-fg320-4
|
||||
#
|
||||
#
|
||||
.phony : all all_ssim all_tsim clean
|
||||
#
|
||||
all : $(EXE_all)
|
||||
all_ssim : $(EXE_all:=_ssim)
|
||||
all_tsim : $(EXE_all:=_tsim)
|
||||
#
|
||||
clean : ise_clean ghdl_clean
|
||||
#
|
||||
#-----
|
||||
#
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.ghdl
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.xflow
|
||||
#
|
||||
VBOM_all = $(wildcard *.vbom)
|
||||
#
|
||||
include $(VBOM_all:.vbom=.dep_xst)
|
||||
include $(VBOM_all:.vbom=.dep_ghdl)
|
||||
include $(wildcard *.o.dep_ghdl)
|
||||
#
|
||||
58
rtl/sys_gen/w11a/nexys2/tb/sys_conf_sim.vhd
Normal file
58
rtl/sys_gen/w11a/nexys2/tb/sys_conf_sim.vhd
Normal file
@@ -0,0 +1,58 @@
|
||||
-- $Id: sys_conf_sim.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Package Name: sys_conf
|
||||
-- Description: Definitions for sys_w11a_n2 (for simulation)
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Tool versions: xst 11.4; ghdl 0.26
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-28 295 1.0 Initial version (cloned from _s3)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
package sys_conf is
|
||||
|
||||
constant sys_conf_hio_debounce : boolean := false; -- no debouncers
|
||||
constant sys_conf_ser2rri_cdinit : integer := 1-1; -- 1 cycle/bit in sim
|
||||
|
||||
constant sys_conf_bram : integer := 0; -- no bram, use cache
|
||||
constant sys_conf_bram_awidth : integer := 14; -- bram size (16 kB)
|
||||
constant sys_conf_mem_losize : integer := 8#167777#; -- 4 MByte
|
||||
--constant sys_conf_mem_losize : integer := 8#003777#; -- 128 kByte (debug)
|
||||
|
||||
-- constant sys_conf_bram : integer := 1; -- bram only
|
||||
-- constant sys_conf_bram_awidth : integer := 16; -- bram size (64 kB)
|
||||
-- constant sys_conf_mem_losize : integer := 8#001777#; -- 64 kByte
|
||||
|
||||
constant sys_conf_cache_fmiss : slbit := '0'; -- cache enabled
|
||||
|
||||
end package sys_conf;
|
||||
|
||||
-- Note: mem_losize holds 16 MSB of the PA of the addressable memory
|
||||
-- 2 211 111 111 110 000 000 000
|
||||
-- 1 098 765 432 109 876 543 210
|
||||
--
|
||||
-- 0 000 000 011 111 111 000 000 -> 00037777 --> 14bit --> 16 kByte
|
||||
-- 0 000 000 111 111 111 000 000 -> 00077777 --> 15bit --> 32 kByte
|
||||
-- 0 000 001 111 111 111 000 000 -> 00177777 --> 16bit --> 64 kByte
|
||||
-- 0 000 011 111 111 111 000 000 -> 00377777 --> 17bit --> 128 kByte
|
||||
-- 0 011 111 111 111 111 000 000 -> 03777777 --> 20bit --> 1 MByte
|
||||
-- 1 110 111 111 111 111 000 000 -> 16777777 --> 22bit --> 4 MByte
|
||||
-- upper 256 kB excluded for 11/70 UB
|
||||
1
rtl/sys_gen/w11a/nexys2/tb/sys_w11a_n2.ucf_cpp
Symbolic link
1
rtl/sys_gen/w11a/nexys2/tb/sys_w11a_n2.ucf_cpp
Symbolic link
@@ -0,0 +1 @@
|
||||
../sys_w11a_n2.ucf_cpp
|
||||
7
rtl/sys_gen/w11a/nexys2/tb/tb_w11a_n2.vbom
Normal file
7
rtl/sys_gen/w11a/nexys2/tb/tb_w11a_n2.vbom
Normal file
@@ -0,0 +1,7 @@
|
||||
# configure tb_nexys2_fusp with sys_w11a_n2 target;
|
||||
# use vhdl configure file (tb_w11a_n2.vhd) to allow
|
||||
# that all configurations will co-exist in work library
|
||||
nexys2_fusp_aif = ../sys_w11a_n2.vbom
|
||||
sys_conf = sys_conf_sim.vhd
|
||||
../../../../bplib/nexys2/tb/tb_nexys2_fusp.vbom
|
||||
tb_w11a_n2.vhd
|
||||
40
rtl/sys_gen/w11a/nexys2/tb/tb_w11a_n2.vhd
Normal file
40
rtl/sys_gen/w11a/nexys2/tb/tb_w11a_n2.vhd
Normal file
@@ -0,0 +1,40 @@
|
||||
-- $Id: tb_w11a_n2.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2010- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: tb_w11a_n2
|
||||
-- Description: Configuration for tb_w11a_n2 for tb_nexys2_fusp
|
||||
--
|
||||
-- Dependencies: sys_w11a_n2
|
||||
--
|
||||
-- To test: sys_w11a_n2
|
||||
--
|
||||
-- Verified (with (#1) ../../tb/tb_rritba_pdp11core_stim.dat
|
||||
-- (#2) ../../tb/tb_pdp11_core_stim.dat):
|
||||
-- Date Rev Code ghdl ise Target Comment
|
||||
-- 2010-05-28 295 - -.-- - - -:--
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-26 295 1.0 Initial version (cloned from _s3)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
configuration tb_w11a_n2 of tb_nexys2_fusp is
|
||||
|
||||
for sim
|
||||
for all : nexys2_fusp_aif
|
||||
use entity work.sys_w11a_n2;
|
||||
end for;
|
||||
end for;
|
||||
|
||||
end tb_w11a_n2;
|
||||
6
rtl/sys_gen/w11a/nexys2/tb/tbw.dat
Normal file
6
rtl/sys_gen/w11a/nexys2/tb/tbw.dat
Normal file
@@ -0,0 +1,6 @@
|
||||
# $Id: tbw.dat 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
[tb_w11a_n2]
|
||||
tb_rriext_fifo_rx = <fifo>
|
||||
tb_rriext_fifo_tx = <fifo>
|
||||
tb_rriext_conf = <null>
|
||||
4
rtl/sys_gen/w11a/s3board/.cvsignore
Normal file
4
rtl/sys_gen/w11a/s3board/.cvsignore
Normal file
@@ -0,0 +1,4 @@
|
||||
sys_w11a_s3.ucf
|
||||
*.dep_ucf_cpp
|
||||
log_*
|
||||
_impact*
|
||||
37
rtl/sys_gen/w11a/s3board/Makefile
Normal file
37
rtl/sys_gen/w11a/s3board/Makefile
Normal file
@@ -0,0 +1,37 @@
|
||||
# $Id: Makefile 311 2010-06-30 17:52:37Z mueller $
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2010-05-28 295 1.1.4 rename sys_pdp11core -> sys_w11a_s3
|
||||
# 2010-04-24 282 1.1.3 use %.impact rule, all=BIT_all now
|
||||
# 2009-11-20 251 1.1.2 add .mcs rule
|
||||
# 2009-07-26 236 1.1.1 add program: rule
|
||||
# 2007-11-26 98 1.1 include $(RETROBASE)/vlib/Makefile.(ghdl|xflow)
|
||||
# 2007-07-08 65 1.0 Initial version
|
||||
#
|
||||
VBOM_all = $(wildcard *.vbom)
|
||||
BIT_all = $(VBOM_all:.vbom=.bit)
|
||||
#
|
||||
ISE_BOARD = s3board
|
||||
ISE_PATH = xc3s1000-ft256-4
|
||||
#
|
||||
.phony : all clean
|
||||
#
|
||||
all : $(BIT_all)
|
||||
#
|
||||
clean : ise_clean
|
||||
rm -f sys_w11a_s3.ucf
|
||||
#
|
||||
sys_w11a_s3.mcs : sys_w11a_s3.bit
|
||||
promgen -w -x xcf04s -p mcs -u 0 sys_w11a_s3
|
||||
mv sys_w11a_s3.prm sys_w11a_s3_prm.log
|
||||
mv sys_w11a_s3.cfi sys_w11a_s3_cfi.log
|
||||
#
|
||||
#----
|
||||
#
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.xflow
|
||||
include $(RETROBASE)/rtl/vlib/Makefile.ghdl
|
||||
#
|
||||
include $(VBOM_all:.vbom=.dep_xst)
|
||||
include $(VBOM_all:.vbom=.dep_ghdl)
|
||||
#
|
||||
60
rtl/sys_gen/w11a/s3board/sys_conf.vhd
Normal file
60
rtl/sys_gen/w11a/s3board/sys_conf.vhd
Normal file
@@ -0,0 +1,60 @@
|
||||
-- $Id: sys_conf.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2008 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Package Name: sys_conf
|
||||
-- Description: Definitions for sys_w11a_s3 (for synthesis)
|
||||
--
|
||||
-- Dependencies: -
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-05-05 288 1.1.1 add sys_conf_hio_debounce
|
||||
-- 2008-02-23 118 1.1 add memory config
|
||||
-- 2007-09-23 84 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
|
||||
package sys_conf is
|
||||
|
||||
constant sys_conf_hio_debounce : boolean := true; -- instantiate debouncers
|
||||
constant sys_conf_ser2rri_cdinit : integer := 434-1; -- 50000000/115200
|
||||
|
||||
constant sys_conf_bram : integer := 0; -- no bram, use cache
|
||||
constant sys_conf_bram_awidth : integer := 14; -- bram size (16 kB)
|
||||
constant sys_conf_mem_losize : integer := 8#037777#; -- 1 MByte
|
||||
--constant sys_conf_mem_losize : integer := 8#003777#; -- 128 kByte (debug)
|
||||
|
||||
-- constant sys_conf_bram : integer := 1; -- bram only
|
||||
-- constant sys_conf_bram_awidth : integer := 15; -- bram size (32 kB)
|
||||
-- constant sys_conf_mem_losize : integer := 8#000777#; -- 32 kByte
|
||||
|
||||
constant sys_conf_cache_fmiss : slbit := '0'; -- cache enabled
|
||||
|
||||
end package sys_conf;
|
||||
|
||||
-- Note: mem_losize holds 16 MSB of the PA of the addressable memory
|
||||
-- 2 211 111 111 110 000 000 000
|
||||
-- 1 098 765 432 109 876 543 210
|
||||
--
|
||||
-- 0 000 000 011 111 111 000 000 -> 00037777 --> 14bit --> 16 kByte
|
||||
-- 0 000 000 111 111 111 000 000 -> 00077777 --> 15bit --> 32 kByte
|
||||
-- 0 000 001 111 111 111 000 000 -> 00177777 --> 16bit --> 64 kByte
|
||||
-- 0 000 011 111 111 111 000 000 -> 00377777 --> 17bit --> 128 kByte
|
||||
-- 0 011 111 111 111 111 000 000 -> 03777777 --> 20bit --> 1 MByte
|
||||
-- 1 110 111 111 111 111 000 000 -> 16777777 --> 22bit --> 4 MByte
|
||||
-- upper 256 kB excluded for 11/70 UB
|
||||
21
rtl/sys_gen/w11a/s3board/sys_w11a_s3.ucf_cpp
Normal file
21
rtl/sys_gen/w11a/s3board/sys_w11a_s3.ucf_cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
## $Id: sys_w11a_s3.ucf_cpp 311 2010-06-30 17:52:37Z mueller $
|
||||
##
|
||||
## Revision History:
|
||||
## Date Rev Version Comment
|
||||
## 2010-05-02 287 2.0 added defs for pm1 rs232
|
||||
## 2007-12-16 101 1.1 converted to ucf_cpp, factor out std pins
|
||||
## 2007-12-09 100 1.0 Initial version
|
||||
##
|
||||
|
||||
NET "CLK" TNM_NET = "CLK";
|
||||
TIMESPEC "TS_CLK" = PERIOD "CLK" 20 ns HIGH 50 %;
|
||||
OFFSET = IN 10 ns BEFORE "CLK";
|
||||
OFFSET = OUT 20 ns AFTER "CLK";
|
||||
|
||||
## std board
|
||||
##
|
||||
#include "bplib/s3board/s3board_pins.ucf"
|
||||
##
|
||||
## Pmod1-RS232 on A2 connector
|
||||
##
|
||||
#include "bplib/s3board/s3board_a2_pm1_rs232.ucf"
|
||||
29
rtl/sys_gen/w11a/s3board/sys_w11a_s3.vbom
Normal file
29
rtl/sys_gen/w11a/s3board/sys_w11a_s3.vbom
Normal file
@@ -0,0 +1,29 @@
|
||||
# libs
|
||||
../../../vlib/slvtypes.vhd
|
||||
../../../vlib/genlib/genlib.vhd
|
||||
../../../vlib/rri/rrilib.vhd
|
||||
../../../bplib/s3board/s3boardlib.vbom
|
||||
../../../ibus/iblib.vhd
|
||||
../../../ibus/ibdlib.vhd
|
||||
../../../w11a/pdp11.vhd
|
||||
sys_conf = sys_conf.vhd
|
||||
# components
|
||||
../../../vlib/genlib/clkdivce.vbom
|
||||
../../../bplib/s3board/s3_rs232_iob_int_ext.vbom
|
||||
../../../bplib/s3board/s3_humanio.vbom
|
||||
../../../vlib/rri/rri_core_serport.vbom
|
||||
../../../vlib/rri/rb_sres_or_2.vbom
|
||||
../../../w11a/pdp11_core_rri.vbom
|
||||
../../../w11a/pdp11_core.vbom
|
||||
../../../w11a/pdp11_bram.vbom
|
||||
../../../bplib/s3board/s3_sram_dummy.vbom
|
||||
../../../w11a/pdp11_cache.vbom
|
||||
../../../w11a/pdp11_mem70.vbom
|
||||
../../../bplib/s3board/s3_sram_memctl.vbom
|
||||
../../../ibus/ib_sres_or_2.vbom
|
||||
../../../ibus/ibdr_minisys.vbom
|
||||
../../../ibus/ibdr_maxisys.vbom
|
||||
[ghdl,isim]../../../w11a/pdp11_tmu_sb.vbom
|
||||
# design
|
||||
sys_w11a_s3.vhd
|
||||
@ucf_cpp: sys_w11a_s3.ucf
|
||||
519
rtl/sys_gen/w11a/s3board/sys_w11a_s3.vhd
Normal file
519
rtl/sys_gen/w11a/s3board/sys_w11a_s3.vhd
Normal file
@@ -0,0 +1,519 @@
|
||||
-- $Id: sys_w11a_s3.vhd 314 2010-07-09 17:38:41Z mueller $
|
||||
--
|
||||
-- Copyright 2007-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
-- This program is free software; you may redistribute and/or modify it under
|
||||
-- the terms of the GNU General Public License as published by the Free
|
||||
-- Software Foundation, either version 2, or at your option any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful, but
|
||||
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
-- for complete details.
|
||||
--
|
||||
------------------------------------------------------------------------------
|
||||
-- Module Name: sys_w11a_s3 - syn
|
||||
-- Description: w11a test design for s3board
|
||||
--
|
||||
-- Dependencies: vlib/genlib/clkdivce
|
||||
-- bplib/s3board/s3_rs232_iob_int_ext
|
||||
-- bplib/s3board/s3_humanio
|
||||
-- vlib/rri/rri_core_serport
|
||||
-- vlib/rri/rb_sres_or_2
|
||||
-- w11a/pdp11_core_rri
|
||||
-- w11a/pdp11_core
|
||||
-- w11a/pdp11_bram
|
||||
-- vlib/s3board/s3_sram_dummy
|
||||
-- w11a/pdp11_cache
|
||||
-- w11a/pdp11_mem70
|
||||
-- bplib/s3board/s3_sram_memctl
|
||||
-- ibus/ib_sres_or_2
|
||||
-- ibus/ibdr_minisys
|
||||
-- ibus/ibdr_maxisys
|
||||
-- w11a/pdp11_tmu_sb [sim only]
|
||||
--
|
||||
-- Test bench: tb/tb_s3board_w11a_s3
|
||||
--
|
||||
-- Target Devices: generic
|
||||
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2, 10.1, 11.4; ghdl 0.18-0.26
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2010-05-01 285 11.4 L68 xc3s1000-4 1239 4086 224 2471 OK: LP+PC+DL+II
|
||||
-- 2010-04-26 283 11.4 L68 xc3s1000-4 1245 4083 224 2474 OK: LP+PC+DL+II
|
||||
-- 2009-07-12 233 11.2 L46 xc3s1000-4 1245 4078 224 2472 OK: LP+PC+DL+II
|
||||
-- 2009-07-12 233 10.1.03 K39 xc3s1000-4 1250 4097 224 2494 OK: LP+PC+DL+II
|
||||
-- 2009-06-01 221 10.1.03 K39 xc3s1000-4 1209 3986 224 2425 OK: LP+PC+DL+II
|
||||
-- 2009-05-17 216 10.1.03 K39 xc3s1000-4 1039 3542 224 2116 m+p; TIME OK
|
||||
-- 2009-05-09 213 10.1.03 K39 xc3s1000-4 1037 3500 224 2100 m+p; TIME OK
|
||||
-- 2009-04-26 209 8.2.03 I34 xc3s1000-4 1099 3557 224 2264 m+p; TIME OK
|
||||
-- 2008-12-13 176 8.2.03 I34 xc3s1000-4 1116 3672 224 2280 m+p; TIME OK
|
||||
-- 2008-12-06 174 10.1.02 K37 xc3s1000-4 1038 3503 224 2100 m+p; TIME OK
|
||||
-- 2008-12-06 174 8.2.03 I34 xc3s1000-4 1116 3682 224 2281 m+p; TIME OK
|
||||
-- 2008-08-22 161 8.2.03 I34 xc3s1000-4 1118 3677 224 2288 m+p; TIME OK
|
||||
-- 2008-08-22 161 10.1.02 K37 xc3s1000-4 1035 3488 224 2086 m+p; TIME OK
|
||||
-- 2008-05-01 140 8.2.03 I34 xc3s1000-4 1057 3344 224 2119 m+p; 21ns;BR-32
|
||||
-- 2008-05-01 140 8.2.03 I34 xc3s1000-4 1057 3357 224 2128 m+p; 21ns;BR-16
|
||||
-- 2008-05-01 140 8.2.03 I34 xc3s1000-4 1057 3509 224 2220 m+p; TIME OK
|
||||
-- 2008-05-01 140 9.2.04 J40 xc3s200-4 1009 3195 224 1918 m+p; T-OK;BR-16
|
||||
-- 2008-03-19 127 8.2.03 I34 xc3s1000-4 1077 3471 224 2207 m+p; TIME OK
|
||||
-- 2008-03-02 122 8.2.03 I34 xc3s1000-4 1068 3448 224 2179 m+p; TIME OK
|
||||
-- 2008-03-02 121 8.2.03 I34 xc3s1000-4 1064 3418 224 2148 m+p; TIME FAIL
|
||||
-- 2008-02-24 119 8.2.03 I34 xc3s1000-4 1071 3372 224 2141 m+p; TIME OK
|
||||
-- 2008-02-23 118 8.2.03 I34 xc3s1000-4 1035 3301 182 1996 m+p; TIME OK
|
||||
-- 2008-01-06 111 8.2.03 I34 xc3s1000-4 971 2898 182 1831 m+p; TIME OK
|
||||
-- 2007-12-30 107 8.2.03 I34 xc3s1000-4 891 2719 137 1515 s 18.8
|
||||
-- 2007-12-30 107 8.2.03 I34 xc3s1000-4 891 2661 137 1654 m+p; TIME OK
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2010-06-26 309 1.3.2 use constants for rbus addresses (rbaddr_...)
|
||||
-- 2010-06-18 306 1.3.1 rename RB_ADDR->RB_ADDR_CORE, add RB_ADDR_IBUS;
|
||||
-- remove pdp11_ibdr_rri
|
||||
-- 2010-06-13 305 1.6.1 add CP_ADDR, wire up pdp11_core_rri->pdp11_core
|
||||
-- 2010-06-11 303 1.6 use IB_MREQ.racc instead of RRI_REQ
|
||||
-- 2010-06-03 300 1.5.6 use default FAWIDTH for rri_core_serport
|
||||
-- 2010-05-28 295 1.5.5 rename sys_pdp11core -> sys_w11a_s3
|
||||
-- 2010-05-21 292 1.5.4 rename _PM1_ -> _FUSP_
|
||||
-- 2010-05-16 291 1.5.3 rename memctl_s3sram->s3_sram_memctl
|
||||
-- 2010-05-05 288 1.5.2 add sys_conf_hio_debounce
|
||||
-- 2010-05-02 287 1.5.1 ren CE_XSEC->CE_INT,RP_STAT->RB_STAT,AP_LAM->RB_LAM
|
||||
-- drop RP_IINT from interfaces; drop RTSFLUSH generic
|
||||
-- add pm1 rs232 (usp) support
|
||||
-- 2010-05-01 285 1.5 port to rri V2 interface, use rri_core_serport
|
||||
-- 2010-04-17 278 1.4.5 rename sram_dummy -> s3_sram_dummy
|
||||
-- 2010-04-10 275 1.4.4 use s3_humanio; invert DP(1,3)
|
||||
-- 2009-07-12 233 1.4.3 adapt to ibdr_(mini|maxi)sys interface changes
|
||||
-- 2009-06-01 221 1.4.2 support ibdr_maxisys as well as _minisys
|
||||
-- 2009-05-10 214 1.4.1 use pdp11_tmu_sb instead of pdp11_tmu
|
||||
-- 2008-08-22 161 1.4.0 use iblib, ibdlib; renames
|
||||
-- 2008-05-03 143 1.3.6 rename _cpursta->_cpurust
|
||||
-- 2008-05-01 142 1.3.5 reassign LED(cpugo,halt,rust) and DISP(dispreg)
|
||||
-- 2008-04-19 137 1.3.4 add DM_STAT_(DP|VM|CO|SY) signals, add pdp11_tmu
|
||||
-- 2008-04-18 136 1.3.3 add RESET for ibdr_minisys
|
||||
-- 2008-04-13 135 1.3.2 add _mem70 also for _bram configs
|
||||
-- 2008-02-23 118 1.3.1 add _mem70
|
||||
-- 2008-02-17 117 1.3 use ext. memory interface of _core;
|
||||
-- use _cache + memctl or _bram (configurable)
|
||||
-- 2008-01-20 113 1.2.1 finalize AP_LAM handling (0=cpu,1=dl11;4=rk05)
|
||||
-- 2008-01-20 112 1.2 rename clkgen->clkdivce; use ibdr_minisys, BRESET
|
||||
-- add _ib_mux2
|
||||
-- 2008-01-06 111 1.1 use now iob_reg_*; remove rricp_pdp11core hack
|
||||
-- instanciate all parts directly
|
||||
-- 2007-12-23 105 1.0.4 add rritb_cpmon_sb
|
||||
-- 2007-12-16 101 1.0.3 use _N for active low; set IOB attribute to RI/RO
|
||||
-- 2007-12-09 100 1.0.2 add sram memory signals, dummy handle them
|
||||
-- 2007-10-19 90 1.0.1 init RI_RXD,RO_TXD=1 to avoid startup glitch
|
||||
-- 2007-09-23 84 1.0 Initial version
|
||||
------------------------------------------------------------------------------
|
||||
--
|
||||
-- w11a test design for s3board
|
||||
-- w11a + rri + serport
|
||||
--
|
||||
-- Usage of S3BOARD Switches, Buttons, LEDs:
|
||||
-- LED(7..0):last RXDATA
|
||||
--
|
||||
-- DP(0): RXSD (inverted to signal activity)
|
||||
-- DP(1): RTS_N (shows rx back preasure)
|
||||
-- DP(2): TXSD (inverted to signal activity)
|
||||
-- DP(3): CTS_N (shows tx back preasure)
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_arith.all;
|
||||
|
||||
use work.slvtypes.all;
|
||||
use work.genlib.all;
|
||||
use work.rrilib.all;
|
||||
use work.s3boardlib.all;
|
||||
use work.iblib.all;
|
||||
use work.ibdlib.all;
|
||||
use work.pdp11.all;
|
||||
use work.sys_conf.all;
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
entity sys_w11a_s3 is -- top level
|
||||
-- implements s3board_fusp_aif
|
||||
port (
|
||||
CLK : in slbit; -- clock
|
||||
I_RXD : in slbit; -- receive data (board view)
|
||||
O_TXD : out slbit; -- transmit data (board view)
|
||||
I_SWI : in slv8; -- s3 switches
|
||||
I_BTN : in slv4; -- s3 buttons
|
||||
O_LED : out slv8; -- s3 leds
|
||||
O_ANO_N : out slv4; -- 7 segment disp: anodes (act.low)
|
||||
O_SEG_N : out slv8; -- 7 segment disp: segments (act.low)
|
||||
O_MEM_CE_N : out slv2; -- sram: chip enables (act.low)
|
||||
O_MEM_BE_N : out slv4; -- sram: byte enables (act.low)
|
||||
O_MEM_WE_N : out slbit; -- sram: write enable (act.low)
|
||||
O_MEM_OE_N : out slbit; -- sram: output enable (act.low)
|
||||
O_MEM_ADDR : out slv18; -- sram: address lines
|
||||
IO_MEM_DATA : inout slv32; -- sram: data lines
|
||||
O_FUSP_RTS_N : out slbit; -- fusp: rs232 rts_n
|
||||
I_FUSP_CTS_N : in slbit; -- fusp: rs232 cts_n
|
||||
I_FUSP_RXD : in slbit; -- fusp: rs232 rx
|
||||
O_FUSP_TXD : out slbit -- fusp: rs232 tx
|
||||
);
|
||||
end sys_w11a_s3;
|
||||
|
||||
architecture syn of sys_w11a_s3 is
|
||||
|
||||
signal RXD : slbit := '1';
|
||||
signal TXD : slbit := '0';
|
||||
signal RTS_N : slbit := '0';
|
||||
signal CTS_N : slbit := '0';
|
||||
|
||||
signal SWI : slv8 := (others=>'0');
|
||||
signal BTN : slv4 := (others=>'0');
|
||||
signal LED : slv8 := (others=>'0');
|
||||
signal DSP_DAT : slv16 := (others=>'0');
|
||||
signal DSP_DP : slv4 := (others=>'0');
|
||||
|
||||
signal RB_LAM : slv16 := (others=>'0');
|
||||
signal RB_STAT : slv3 := (others=>'0');
|
||||
|
||||
signal RB_MREQ : rb_mreq_type := rb_mreq_init;
|
||||
signal RB_SRES : rb_sres_type := rb_sres_init;
|
||||
signal RB_SRES_CPU : rb_sres_type := rb_sres_init;
|
||||
signal RB_SRES_IBD : rb_sres_type := rb_sres_init;
|
||||
|
||||
signal RESET : slbit := '0';
|
||||
signal CE_USEC : slbit := '0';
|
||||
signal CE_MSEC : slbit := '0';
|
||||
|
||||
signal CPU_RESET : slbit := '0';
|
||||
signal CP_CNTL : cp_cntl_type := cp_cntl_init;
|
||||
signal CP_ADDR : cp_addr_type := cp_addr_init;
|
||||
signal CP_DIN : slv16 := (others=>'0');
|
||||
signal CP_STAT : cp_stat_type := cp_stat_init;
|
||||
signal CP_DOUT : slv16 := (others=>'0');
|
||||
|
||||
signal EI_PRI : slv3 := (others=>'0');
|
||||
signal EI_VECT : slv9_2 := (others=>'0');
|
||||
signal EI_ACKM : slbit := '0';
|
||||
|
||||
signal EM_MREQ : em_mreq_type := em_mreq_init;
|
||||
signal EM_SRES : em_sres_type := em_sres_init;
|
||||
|
||||
signal HM_ENA : slbit := '0';
|
||||
signal MEM70_FMISS : slbit := '0';
|
||||
signal CACHE_FMISS : slbit := '0';
|
||||
signal CACHE_CHIT : slbit := '0';
|
||||
|
||||
signal MEM_REQ : slbit := '0';
|
||||
signal MEM_WE : slbit := '0';
|
||||
signal MEM_BUSY : slbit := '0';
|
||||
signal MEM_ACK_R : slbit := '0';
|
||||
signal MEM_ADDR : slv20 := (others=>'0');
|
||||
signal MEM_BE : slv4 := (others=>'0');
|
||||
signal MEM_DI : slv32 := (others=>'0');
|
||||
signal MEM_DO : slv32 := (others=>'0');
|
||||
|
||||
signal BRESET : slbit := '0';
|
||||
signal IB_MREQ : ib_mreq_type := ib_mreq_init;
|
||||
signal IB_SRES : ib_sres_type := ib_sres_init;
|
||||
|
||||
signal IB_SRES_MEM70 : ib_sres_type := ib_sres_init;
|
||||
signal IB_SRES_IBDR : ib_sres_type := ib_sres_init;
|
||||
|
||||
signal DM_STAT_DP : dm_stat_dp_type := dm_stat_dp_init;
|
||||
signal DM_STAT_VM : dm_stat_vm_type := dm_stat_vm_init;
|
||||
signal DM_STAT_CO : dm_stat_co_type := dm_stat_co_init;
|
||||
signal DM_STAT_SY : dm_stat_sy_type := dm_stat_sy_init;
|
||||
|
||||
signal DISPREG : slv16 := (others=>'0');
|
||||
|
||||
constant rbaddr_core0 : slv8 := "00000000";
|
||||
constant rbaddr_ibus : slv8 := "10000000";
|
||||
constant rbaddr_hio : slv8 := "11000000";
|
||||
|
||||
begin
|
||||
|
||||
CLKDIV : clkdivce
|
||||
generic map (
|
||||
CDUWIDTH => 6,
|
||||
USECDIV => 50,
|
||||
MSECDIV => 1000)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
CE_MSEC => CE_MSEC
|
||||
);
|
||||
|
||||
IOB_RS232 : s3_rs232_iob_int_ext
|
||||
port map (
|
||||
CLK => CLK,
|
||||
SEL => SWI(0),
|
||||
RXD => RXD,
|
||||
TXD => TXD,
|
||||
CTS_N => CTS_N,
|
||||
RTS_N => RTS_N,
|
||||
I_RXD0 => I_RXD,
|
||||
O_TXD0 => O_TXD,
|
||||
I_RXD1 => I_FUSP_RXD,
|
||||
O_TXD1 => O_FUSP_TXD,
|
||||
I_CTS1_N => I_FUSP_CTS_N,
|
||||
O_RTS1_N => O_FUSP_RTS_N
|
||||
);
|
||||
|
||||
HIO : s3_humanio
|
||||
generic map (
|
||||
DEBOUNCE => sys_conf_hio_debounce)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
CE_MSEC => CE_MSEC,
|
||||
SWI => SWI,
|
||||
BTN => BTN,
|
||||
LED => LED,
|
||||
DSP_DAT => DSP_DAT,
|
||||
DSP_DP => DSP_DP,
|
||||
I_SWI => I_SWI,
|
||||
I_BTN => I_BTN,
|
||||
O_LED => O_LED,
|
||||
O_ANO_N => O_ANO_N,
|
||||
O_SEG_N => O_SEG_N
|
||||
);
|
||||
|
||||
RRI : rri_core_serport
|
||||
generic map (
|
||||
ATOWIDTH => 6, -- 64 cycles access timeout
|
||||
ITOWIDTH => 6, -- 64 periods max idle timeout
|
||||
CDWIDTH => 13,
|
||||
CDINIT => sys_conf_ser2rri_cdinit)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
CE_MSEC => CE_MSEC,
|
||||
CE_INT => CE_MSEC,
|
||||
RESET => RESET,
|
||||
RXSD => RXD,
|
||||
TXSD => TXD,
|
||||
CTS_N => CTS_N,
|
||||
RTS_N => RTS_N,
|
||||
RB_MREQ => RB_MREQ,
|
||||
RB_SRES => RB_SRES,
|
||||
RB_LAM => RB_LAM,
|
||||
RB_STAT => RB_STAT
|
||||
);
|
||||
|
||||
RB_SRES_OR : rb_sres_or_2
|
||||
port map (
|
||||
RB_SRES_1 => RB_SRES_CPU,
|
||||
RB_SRES_2 => RB_SRES_IBD,
|
||||
RB_SRES_OR => RB_SRES
|
||||
);
|
||||
|
||||
RP2CP : pdp11_core_rri
|
||||
generic map (
|
||||
RB_ADDR_CORE => rbaddr_core0,
|
||||
RB_ADDR_IBUS => rbaddr_ibus)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => RESET,
|
||||
RB_MREQ => RB_MREQ,
|
||||
RB_SRES => RB_SRES_CPU,
|
||||
RB_STAT => RB_STAT,
|
||||
RRI_LAM => RB_LAM(0),
|
||||
CPU_RESET => CPU_RESET,
|
||||
CP_CNTL => CP_CNTL,
|
||||
CP_ADDR => CP_ADDR,
|
||||
CP_DIN => CP_DIN,
|
||||
CP_STAT => CP_STAT,
|
||||
CP_DOUT => CP_DOUT
|
||||
);
|
||||
|
||||
CORE : pdp11_core
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => CPU_RESET,
|
||||
CP_CNTL => CP_CNTL,
|
||||
CP_ADDR => CP_ADDR,
|
||||
CP_DIN => CP_DIN,
|
||||
CP_STAT => CP_STAT,
|
||||
CP_DOUT => CP_DOUT,
|
||||
EI_PRI => EI_PRI,
|
||||
EI_VECT => EI_VECT,
|
||||
EI_ACKM => EI_ACKM,
|
||||
EM_MREQ => EM_MREQ,
|
||||
EM_SRES => EM_SRES,
|
||||
BRESET => BRESET,
|
||||
IB_MREQ_M => IB_MREQ,
|
||||
IB_SRES_M => IB_SRES,
|
||||
DM_STAT_DP => DM_STAT_DP,
|
||||
DM_STAT_VM => DM_STAT_VM,
|
||||
DM_STAT_CO => DM_STAT_CO
|
||||
);
|
||||
|
||||
MEM_BRAM: if sys_conf_bram > 0 generate
|
||||
signal HM_VAL_BRAM : slbit := '0';
|
||||
begin
|
||||
|
||||
MEM : pdp11_bram
|
||||
generic map (
|
||||
AWIDTH => sys_conf_bram_awidth)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
GRESET => CPU_RESET,
|
||||
EM_MREQ => EM_MREQ,
|
||||
EM_SRES => EM_SRES
|
||||
);
|
||||
|
||||
HM_VAL_BRAM <= not EM_MREQ.we; -- assume hit if read, miss if write
|
||||
|
||||
MEM70: pdp11_mem70
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CRESET => BRESET,
|
||||
HM_ENA => EM_MREQ.req,
|
||||
HM_VAL => HM_VAL_BRAM,
|
||||
CACHE_FMISS => MEM70_FMISS,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_MEM70
|
||||
);
|
||||
|
||||
SRAM_PROT : s3_sram_dummy -- connect SRAM to protection dummy
|
||||
port map (
|
||||
O_MEM_CE_N => O_MEM_CE_N,
|
||||
O_MEM_BE_N => O_MEM_BE_N,
|
||||
O_MEM_WE_N => O_MEM_WE_N,
|
||||
O_MEM_OE_N => O_MEM_OE_N,
|
||||
O_MEM_ADDR => O_MEM_ADDR,
|
||||
IO_MEM_DATA => IO_MEM_DATA
|
||||
);
|
||||
|
||||
end generate MEM_BRAM;
|
||||
|
||||
MEM_SRAM: if sys_conf_bram = 0 generate
|
||||
|
||||
CACHE: pdp11_cache
|
||||
port map (
|
||||
CLK => CLK,
|
||||
GRESET => CPU_RESET,
|
||||
EM_MREQ => EM_MREQ,
|
||||
EM_SRES => EM_SRES,
|
||||
FMISS => CACHE_FMISS,
|
||||
CHIT => CACHE_CHIT,
|
||||
MEM_REQ => MEM_REQ,
|
||||
MEM_WE => MEM_WE,
|
||||
MEM_BUSY => MEM_BUSY,
|
||||
MEM_ACK_R => MEM_ACK_R,
|
||||
MEM_ADDR => MEM_ADDR,
|
||||
MEM_BE => MEM_BE,
|
||||
MEM_DI => MEM_DI,
|
||||
MEM_DO => MEM_DO
|
||||
);
|
||||
|
||||
MEM70: pdp11_mem70
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CRESET => BRESET,
|
||||
HM_ENA => HM_ENA,
|
||||
HM_VAL => CACHE_CHIT,
|
||||
CACHE_FMISS => MEM70_FMISS,
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_MEM70
|
||||
);
|
||||
|
||||
HM_ENA <= EM_SRES.ack_r or EM_SRES.ack_w;
|
||||
CACHE_FMISS <= MEM70_FMISS or sys_conf_cache_fmiss;
|
||||
|
||||
SRAM_CTL: s3_sram_memctl
|
||||
port map (
|
||||
CLK => CLK,
|
||||
RESET => CPU_RESET,
|
||||
REQ => MEM_REQ,
|
||||
WE => MEM_WE,
|
||||
BUSY => MEM_BUSY,
|
||||
ACK_R => MEM_ACK_R,
|
||||
ACK_W => open,
|
||||
ACT_R => open,
|
||||
ACT_W => open,
|
||||
ADDR => MEM_ADDR(17 downto 0),
|
||||
BE => MEM_BE,
|
||||
DI => MEM_DI,
|
||||
DO => MEM_DO,
|
||||
O_MEM_CE_N => O_MEM_CE_N,
|
||||
O_MEM_BE_N => O_MEM_BE_N,
|
||||
O_MEM_WE_N => O_MEM_WE_N,
|
||||
O_MEM_OE_N => O_MEM_OE_N,
|
||||
O_MEM_ADDR => O_MEM_ADDR,
|
||||
IO_MEM_DATA => IO_MEM_DATA
|
||||
);
|
||||
|
||||
end generate MEM_SRAM;
|
||||
|
||||
IB_SRES_OR : ib_sres_or_2
|
||||
port map (
|
||||
IB_SRES_1 => IB_SRES_MEM70,
|
||||
IB_SRES_2 => IB_SRES_IBDR,
|
||||
IB_SRES_OR => IB_SRES);
|
||||
|
||||
IBD_MINI : if false generate
|
||||
begin
|
||||
IBDR_SYS : ibdr_minisys
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
CE_MSEC => CE_MSEC,
|
||||
RESET => CPU_RESET,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RB_LAM(15 downto 1),
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_IBDR,
|
||||
EI_ACKM => EI_ACKM,
|
||||
EI_PRI => EI_PRI,
|
||||
EI_VECT => EI_VECT,
|
||||
DISPREG => DISPREG);
|
||||
end generate IBD_MINI;
|
||||
|
||||
IBD_MAXI : if true generate
|
||||
begin
|
||||
IBDR_SYS : ibdr_maxisys
|
||||
port map (
|
||||
CLK => CLK,
|
||||
CE_USEC => CE_USEC,
|
||||
CE_MSEC => CE_MSEC,
|
||||
RESET => CPU_RESET,
|
||||
BRESET => BRESET,
|
||||
RRI_LAM => RB_LAM(15 downto 1),
|
||||
IB_MREQ => IB_MREQ,
|
||||
IB_SRES => IB_SRES_IBDR,
|
||||
EI_ACKM => EI_ACKM,
|
||||
EI_PRI => EI_PRI,
|
||||
EI_VECT => EI_VECT,
|
||||
DISPREG => DISPREG);
|
||||
end generate IBD_MAXI;
|
||||
|
||||
DSP_DAT(15 downto 0) <= DISPREG;
|
||||
DSP_DP(0) <= not RXD;
|
||||
DSP_DP(1) <= RTS_N;
|
||||
DSP_DP(2) <= not TXD;
|
||||
DSP_DP(3) <= CTS_N;
|
||||
|
||||
LED(0) <= CP_STAT.cpugo;
|
||||
LED(1) <= CP_STAT.cpuhalt;
|
||||
LED(5 downto 2) <= CP_STAT.cpurust;
|
||||
LED(6) <= SWI(0) or SWI(1) or SWI(2) or SWI(3) or
|
||||
SWI(4) or SWI(5) or SWI(6) or SWI(7);
|
||||
LED(7) <= BTN(0) or BTN(1) or BTN(2) or BTN(3);
|
||||
|
||||
-- synthesis translate_off
|
||||
DM_STAT_SY.emmreq <= EM_MREQ;
|
||||
DM_STAT_SY.emsres <= EM_SRES;
|
||||
DM_STAT_SY.chit <= CACHE_CHIT;
|
||||
|
||||
TMU : pdp11_tmu_sb
|
||||
generic map (
|
||||
ENAPIN => 13)
|
||||
port map (
|
||||
CLK => CLK,
|
||||
DM_STAT_DP => DM_STAT_DP,
|
||||
DM_STAT_VM => DM_STAT_VM,
|
||||
DM_STAT_CO => DM_STAT_CO,
|
||||
DM_STAT_SY => DM_STAT_SY
|
||||
);
|
||||
|
||||
-- synthesis translate_on
|
||||
end syn;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user