⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vspi.v

📁 有关SPI的vhdl实现。包括SPI官方协议
💻 V
📖 第 1 页 / 共 2 页
字号:
// ----------------------------------------------------------------------//  Copyright 1997-1998 VAutomation Inc. Nashua NH USA. //  Visit HTTP://www.vautomation.com for mor details on our other//  Synthesizable microprocessor and peripheral cores.// //  This program is free software; you can redistribute it and/or modify//  it under the terms of the GNU General Public License version 2 as//  published by the Free Software Foundation.// //  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.// //  The GNU Public License can be found at HTTP://www.gnu.org.//  //  The copyright notice above MUST remain in the source code at all//  times!// //  File: vspi.vhd//  Revision: $Name: REV9910 $//  Gate Count: 500 gates (LSI Logic 10K)//  Description:// //       Serial Peripheral Interface (SPI)// //  The VSPI core implements an SPI interface compatible with the many//  serial EEPROMs, and microcontrollers. The VSPI core is typically used//  as an SPI master, but it can be configured as an SPI slave as well.// //  The SPI bus is a 3 wire bus that in effect links a serial shift//  register between the "master" and the "slave". Typically both the//  master and slave have an 8 bit shift register so the combined//  register is 16 bits. When an SPI transfer takes place, the master and//  slave shift their shift registers 8 bits and thus exchange their 8//  bit register values.// //  The VPSI core is completely software configurable. The clock//  polarity, clock phase, the clock frequency in master mode, and the//  number of bits to be transferred are all software programmable. These//  configuration bits are usually determined by the capabilities of the//  other device you wish to communicate with.// //  SPI supports multiple slaves on a single 3 wire bus by using seperate//  SLaVe SELect signals (SVLSEL) to enable the desired slave. Multiple//  masters are also supported and some support is provided for detecting//  collisions when multiple masters attempt to transfer at the same//  time.// //  A Wired-OR mode is provided which allows multiple masters to collide//  on the bus without risk of damage. In this mode, an external pullup//  resisitor is required on the SI and SO pins. WOR mode also allows the//  SPI bus to operate as a 2 wire bus by connecting the SI and SO pins//  together to form a single bidirectional data pin.// //  Generally, pullups are recommended on all of the external SPI signals//  to insure they are held in a valid state even when the VSPI core is//  disabled.// //  Limitations://       When operating as a slave, the SPI clock signal (SCK) must be//       slower than 1/8th of the CPU clock. 1/16th is recommended. Note//       that this core is fully synchronous to the cpu CLK and thus SCK//       is sampled and then operated on. This results in 3 to 4 clocks//       of delay which will violate the SPI spec if SCK is faster than//       1/8th of the CPU clock. When the VSPI core is in master mode, it//       operates exactly on the proper edges since it is generating SCK.// //       The VSPI core was specifically designed to be an SPI master and//       to be connected to a microprocessor such as VAutomations//       V8-uRISC CPU. This core also has the capability to be a slave//       but that feature is considered secondary which is why it is//       speed limited.// //  Register Definition://  Addr Name    R/W     Description//   0   DOUT    W       8 Bit data out register//   0   DIN     R       8 Bit data in register//   1   CTL     R/W     Control Register//                       [0]=Reserved.//                       [1]=MSTENB      Enable SPI master mode//                       [2]=WOR Wire-OR mode enabled//                       [3]=CKPOL       Clock Polarity 1=SCK idles high,//                                       0=SCK idles low//                       [4]=PHASE       Phase Select//                       [6:5]=DVD       Clock divide - 00=8, 01=16,//                                       10=32, 11=64//                       [7]=IRQENB      Interrupt enable//   2   STATUS  R/W     Interrupt Status register//                       Each bit of the status register is cleared to//                       zero by by writting ONE to the respective bit.//                       [7]=IRQ Interrupt active//                               Set at the end of a master mode//                               transfer, or when SLVSEL goes high on a//                               slave transfer//                       [6]=Overrun//                               This bit is set when the DOUT register//                               is written while an SPI transfer is in//                               progress.//                       [5]=COL//                               This bit is set when there is a master//                               mode collision between multiple SPI//                               masters. It is set when SLVSEL goes low//                               while MSTENB=1.//                       [2:4]=zero//                       [1]=TXRUN//                               1=Master mode operation underway.//                               This bit is read only.//                       [0]=SLVSEL//                               This bit corresponds to the SLVSEL pin//                               on the VSPI core (note that this is//                               normally interted at the IO pin). read//                               only.//   3   SSEL    R/W     Slave Select/bit count register//                       SSEL[7:5]//                               Number of bits to shift in master mode, //                               000=8 bits, 001=1 bit, 111=7 bits.//                       SSEL[4:0]//                               5 individual Slave Selects for master//                               mode// //  The VSPI core operates in two fundamentally different modes based on//  the PHASE bit (CTL[4]). The two modes are depicted in the timing//  diagrams below. The key difference centers around the fact that SPI//  data is clocked out on one edge of the clock, and sampled on the//  other. The two modes select where the opposite edge DFF is placed.//  When PHASE=0, a negative edge flop is inserted into the shift_in//  path. The shift_out data is tricky because we must output data from//  the TX_HOLD register for the first bit as we have not seen a clock on//  SCK to clock the data into the shift register. When PHASE=1, the//  negative edge flop is inserted into the shift_out path to hold the//  data for an extra 1/2 clock.// //  Microprocessor interface//       The VSPI microprocessor interface is quite simple and connects//  easily to VAutomations V8-uRISC CPU. Transfers are fully synchronous//  to the CLK signal. When CHIP_SEL and WRITE are both active at the//  rising edge of CLK, a write to the desired register occurs. CHIP_SEL//  and WRITE should only be active for 1 clock cycle.// //  Timing diagram:// //  PHASE=0 (POLCK=0 shown, invert SCKI if POLCK=1)//  Cycle #     | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |//                 _   _   _   _   _   _   _   _      //  SCK    _______| |_| |_| |_| |_| |_| |_| |_| |_____//               ___ ___ ___ ___ ___ ___ ___ ___//  MOSI  ------<_7_X_6_X_5_X_4_X_3_X_2_X_1_X_0_>-----//             _____ ___ ___ ___ ___ ___ ___ _______//  MISO  ----<___7_X_6_X_5_X_4_X_3_X_2_X_1_X_0_XXXX>-//             _____________________________________//  SLVSEL ___/                                     \_//  Shift register runs on the second edge of SCKI. A negative edge flop//  is placed in the shift_in path to sample data on the first edge of//  SCKI.//  PHASE=1 (POLCK=0 shown, invert SCKI if POLCK=1)//  Cycle #       | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |//                 _   _   _   _   _   _   _   _      //  SCK   ________| |_| |_| |_| |_| |_| |_| |_| |_______//                 ___ ___ ___ ___ ___ ___ ___ ___//  MOSI  --------<_7_X_6_X_5_X_4_X_3_X_2_X_1_X_0_>-----//                 _ ___ ___ ___ ___ ___ ___ _________//  MISO  ----XXXXX_7_X_6_X_5_X_4_X_3_X_2_X_1_X_0_____>-//             _______________________________________//  SLVSEL ___/                                       \_//  Shift register runs on the second edge of SCKI. A negative edge flop//  is placed in the shift_out path to hold data data for an extra 1/2//  clock.// //  Crude block diagram:// //  DATAIN--------------------------+//                                  |//                     |\           |//  MISO-------+-------> \      +---v--------+                |\//             |       |  >-----> 8bit Shift >-------+--------> \//             |    +--> /      |> Register  |       |        |  >-->MOSI//             |    |  |/       +---v--------+       |   +----> /        //             |    |               |                |   |    |///             |    |               +---DATAOUT      |   |      //             |    |                                |   |      //             |    +-------------------------+      |   |               //             |     +------------------------|------+   |//             |     |  |\                    |          | //             |     +--> \        +----+     |          | //             |        |  >------->Neg >-----+----------+ //             +--------> /        |DFF |                  //                      |/        O|>   |                  //                                 +----+                  //  Not shown are the control and status registers, the master mode bit//  counters and other control logic.//  //  IO cell Requirements://  The IO cells required for the SPI bus are quite simple. The following//  VHDL code will synthesize to the appropriate cells.// //    miso <= misoo when misoe='1' ELSE 'Z';  -- tristate buffer//    mosi <= mosio when mosie='1' ELSE 'Z';  -- tristate buffer//    sck  <= scko  when scke ='1' ELSE 'Z';  -- tristate buffer// ---------------------------------------------------------------------//  This product is licensed to://  $name$ of $company$//  for use at site(s)://  $site$// ------------Revision History-----------------------------------------//  $Log: vspi.vhd,v $//  Revision 1.7  1999/09/09 16:02:37  scott//  std_ulogic'ified, numeric_std'ified, RMM'ified// //  Revision 1.6  1999/02/17 00:51:50  eric//  Added more checking on various error conditions.// //  Revision 1.5  1999/02/02 19:56:13  eric//  Changes to fully sync to the CPU clock.// //  Revision 1.4  1998/10/16 13:54:57  eric//  Corrected missing sensitiviy list signals for FIRST_BIT.// //  Revision 1.3  1998/09/30 14:56:56  eric//  Initial release level.// //  Revision 1.2  1998/09/24 02:51:44  eric//  Master mode works in phase=0.// ---------------------------------------------------------------------// // --------------------------ENTITY---------------------module vspi (clk,   rst,   addr,   datain,   dataout,   write,   chip_sel,   irq,   misoe,   misoi,   misoo,   mosie,   mosii,   mosio,   scke,   scki,   scko,   slvsele,   slvselo,   slvsel);//    Title      : NUMERIC_STD arithmetic package for synthesis//               : Rev. 2.3 (Feb 27 1995)//               ://    Library    : This package shall be compiled into a library symbolically//               : named IEEE.//               ://    Developers : IEEE DASC Synthesis Working Group, PAR 1076.3//               ://    Purpose    : This package defines numeric types and arithmetic functions//               : for use with synthesis tools. Two numeric types are defined://               :     -- > UNSIGNED: represents UNSIGNED number in vector form//               :     -- > SIGNED: represents a SIGNED number in vector form//               : The base element type is type STD_LOGIC.//               : The leftmost bit is treated as the most significant bit.//               : Signed vectors are represented in two's complement form.//               : This package contains overloaded arithmetic operators on//               : the SIGNED and UNSIGNED types. The package also contains//               : useful type conversions functions.//               ://               : If any argument to a function is a null array, a null array is//               : returned (exceptions, if any, are noted individually).//               ://    Note       : No declarations or definitions shall be included in, or//               : excluded from, this package. The package declaration declares//               : the functions that can be used by a user. The package body//               : shall be considered the formal definition of the semantics of//               : this package. Tool developers may choose to implement the//               : package body in the most efficient manner available to them.//               ://  ----------------------------------------------------------------------------// ==================================================//  Numeric array type definitions// ==================================================input   clk; //  we use IEEE standard 1164 logic types.//  + and - operators//  everything clocks on rising edgeinput   rst; //  resetinput   [1:0] addr; //  address businput   [7:0] datain; //  data busoutput  [7:0] dataout; //  data businput   write; //  write enableinput   chip_sel; //  device Selectoutput  irq; //  interrupt requestoutput  misoe; //  MISO tristate enableinput   misoi; //  Master in/Slave out data inoutput  misoo; //  MISO data outoutput  mosie; //  MOSI tristate enableinput   mosii; //  Master out/Slave in data inoutput  mosio; //  MOSI data outoutput  scke; //  SCK Clock tristate enableinput   scki; output  scko; //  SCK clock outputoutput  slvsele; //  tristate enable for slave selectsoutput  [4:0] slvselo; input   slvsel; wire    [7:0] dataout; //  SPI interface without IO cellswire    irq; wire    misoe; wire    misoo; wire    mosie; wire    mosio; //  SCK Clock input (shift register runs on this)wire    scke; wire    scko; //  external slave selectswire    slvsele; //  Slave Selectwire    [4:0] slvselo; reg     [2:0] bit_ctr; //  control registerreg     [7:0] ctl_reg; reg     col_flag; //  collision flagreg     [4:0] dvd_ctr; //  clock dividerreg     dvd2; wire    dvd_zero; //  clk divider controls//  local version of IRQ before gated with IRQENBreg     irq_flag; wire    master_mode; //  Master mode when 1wire    misoe_lcl; //  local versionwire    mosie_lcl; //  local versionreg     oflow; wire    open_drain; wire    phase; wire    polck; reg     sck_r1; reg     sck_r2; reg     sck_r3; //  synchronizerswire    [1:0] sel_clk; //  THE SPI shift register 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -