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

📄 vspi.v

📁 Verilog HDL的程式
💻 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 edge
input   rst; //  reset
input   [1:0] addr; //  address bus
input   [7:0] datain; //  data bus
output  [7:0] dataout; //  data bus
input   write; //  write enable
input   chip_sel; //  device Select
output  irq; //  interrupt request
output  misoe; //  MISO tristate enable
input   misoi; //  Master in/Slave out data in
output  misoo; //  MISO data out
output  mosie; //  MOSI tristate enable
input   mosii; //  Master out/Slave in data in
output  mosio; //  MOSI data out
output  scke; //  SCK Clock tristate enable
input   scki; 
output  scko; //  SCK clock output
output  slvsele; //  tristate enable for slave selects
output  [4:0] slvselo; 
input   slvsel; 
wire    [7:0] dataout; 
//  SPI interface without IO cells
wire    irq; 
wire    misoe; 
wire    misoo; 
wire    mosie; 
wire    mosio; 
//  SCK Clock input (shift register runs on this)
wire    scke; 
wire    scko; 
//  external slave selects
wire    slvsele; 
//  Slave Select
wire    [4:0] slvselo; 
reg     [2:0] bit_ctr; 
//  control register
reg     [7:0] ctl_reg; 
reg     col_flag; //  collision flag
reg     [4:0] dvd_ctr; //  clock divider
reg     dvd2; 
wire    dvd_zero; //  clk divider controls
//  local version of IRQ before gated with IRQENB
reg     irq_flag; 
wire    master_mode; //  Master mode when 1
wire    misoe_lcl; //  local version
wire    mosie_lcl; //  local version
reg     oflow; 
wire    open_drain; 
wire    phase; 
wire    polck; 
reg     sck_r1; 
reg     sck_r2; 
reg     sck_r3; //  synchronizers
wire    [1:0] sel_clk; 
//  THE SPI shift register 
reg     [7:0] shift_reg; 
wire    shift_clk; 

⌨️ 快捷键说明

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