Tuesday, October 20, 2020

DAC7513 V1.1 --WORKING

 ---------------SPI MASTER -----------------------------------------------------------------

--

--   FileName:         spi_master.vhd

--   Dependencies:     none

--   Design Software:  Quartus II Version 9.0 Build 132 SJ Full Version

--

--   HDL CODE IS PROVIDED "AS IS."  DIGI-KEY EXPRESSLY DISCLAIMS ANY

--   WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT

--   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A

--   PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL DIGI-KEY

--   BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL

--   DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF

--   PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS

--   BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),

--   ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.

--

--   Version History

--   Version 1.0 7/23/2010 Scott Larson

--     Initial Public Release

--   Version 1.1 4/11/2013 Scott Larson

--     Corrected ModelSim simulation error (explicitly reset clk_toggles signal)

--    

--------------------------------------------------------------------------------


LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_arith.all;

USE ieee.std_logic_unsigned.all;


ENTITY spi_for_dac7513 IS

  GENERIC(

    slaves  : INTEGER := 4;  --number of spi slaves

    d_width : INTEGER := 2); --data bus width

  PORT(

    clock   : IN     STD_LOGIC;                             --system clock

    reset_n : IN     STD_LOGIC;                             --asynchronous reset

    enable  : IN     STD_LOGIC;                             --initiate transaction

    cpol    : IN     STD_LOGIC;                             --spi clock polarity

    cpha    : IN     STD_LOGIC;                             --spi clock phase

    cont    : IN     STD_LOGIC;                             --continuous mode command

    clk_div : IN     INTEGER;                               --system clock cycles per 1/2 period of sclk

    addr    : IN     INTEGER;                               --address of slave

    tx_data : IN     STD_LOGIC_VECTOR(d_width-1 DOWNTO 0);  --data to transmit

    miso    : IN     STD_LOGIC;                             --master in, slave out

    sclk    : BUFFER STD_LOGIC;                             --spi clock

    ss_n    : BUFFER STD_LOGIC_VECTOR(slaves-1 DOWNTO 0);   --slave select

    mosi    : OUT    STD_LOGIC;                             --master out, slave in

    busy    : OUT    STD_LOGIC;                             --busy / data ready signal

    rx_data : OUT    STD_LOGIC_VECTOR(d_width-1 DOWNTO 0)); --data received

END spi_for_dac7513;


ARCHITECTURE logic OF spi_for_dac7513 IS

  TYPE machine IS(ready, execute);                           --state machine data type

  SIGNAL state       : machine;                              --current state

  SIGNAL slave       : INTEGER;                              --slave selected for current transaction

  SIGNAL clk_ratio   : INTEGER;                              --current clk_div

  SIGNAL count       : INTEGER;                              --counter to trigger sclk from system clock

  SIGNAL clk_toggles : INTEGER RANGE 0 TO d_width*2 + 1;     --count spi clock toggles

  SIGNAL assert_data : STD_LOGIC;                            --'1' is tx sclk toggle, '0' is rx sclk toggle

  SIGNAL continue    : STD_LOGIC;                            --flag to continue transaction

  SIGNAL rx_buffer   : STD_LOGIC_VECTOR(d_width-1 DOWNTO 0); --receive data buffer

  SIGNAL tx_buffer   : STD_LOGIC_VECTOR(d_width-1 DOWNTO 0); --transmit data buffer

  SIGNAL last_bit_rx : INTEGER RANGE 0 TO d_width*2;         --last rx data bit location

BEGIN

  PROCESS(clock, reset_n)

  BEGIN


    IF(reset_n = '0') THEN        --reset system

      busy <= '1';                --set busy signal

      ss_n <= (OTHERS => '1');    --deassert all slave select lines

      mosi <= 'Z';                --set master out to high impedance

      rx_data <= (OTHERS => '0'); --clear receive data port

      state <= ready;             --go to ready state when reset is exited


    ELSIF(clock'EVENT AND clock = '1') THEN

      CASE state IS               --state machine


        WHEN ready =>

          busy <= '0';             --clock out not busy signal

          ss_n <= (OTHERS => '1'); --set all slave select outputs high

          mosi <= 'Z';             --set mosi output high impedance

          continue <= '0';         --clear continue flag


          --user input to initiate transaction

          IF(enable = '1') THEN      

           

              busy <= '1';             --set busy signal

              

               IF(addr < slaves) THEN   --check for valid slave address

                    slave <= addr;         --clock in current slave selection if valid

               ELSE

                  slave <= 0;            --set to first slave if not valid

                END IF;

                

                

              IF(clk_div = 0) THEN     --check for valid spi speed

                 clk_ratio <= 1;        --set to maximum speed if zero

                  count <= 1;            --initiate system-to-spi clock counter

               ELSE

                  clk_ratio <= clk_div;  --set to input selection if valid

                 count <= clk_div;      --initiate system-to-spi clock counter

               END IF;

            

            

            

            sclk <= cpol;            --set spi clock polarity

            assert_data <= NOT cpha; --set spi clock phase

            tx_buffer <= tx_data;    --clock in data for transmit into buffer

            clk_toggles <= 0;        --initiate clock toggle counter

            last_bit_rx <= d_width*2 + conv_integer(cpha) - 1; --set last rx data bit

            state <= execute;        --proceed to execute state

            

          ELSE

          

            state <= ready;          --remain in ready state

          END IF;

          

          


        WHEN execute =>

          busy <= '1';        --set busy signal

          ss_n(slave) <= '0'; --set proper slave select output

          

          

          --system clock to sclk ratio is met

          IF(count = clk_ratio) THEN        

            count <= 1;                     --reset system-to-spi clock counter

            

            assert_data <= NOT assert_data; --switch transmit/receive indicator

            

                IF(clk_toggles = d_width*2 + 1) THEN

                  clk_toggles <= 0;               --reset spi clock toggles counter

                ELSE

                  clk_toggles <= clk_toggles + 1; --increment spi clock toggles counter

                END IF;

                

                --spi clock toggle needed

                IF(clk_toggles <= d_width*2 AND ss_n(slave) = '0') THEN 

                  sclk <= NOT sclk; --toggle spi clock

                END IF;

            

            --receive spi clock toggle

                IF(assert_data = '0' AND clk_toggles < last_bit_rx + 1 AND ss_n(slave) = '0') THEN 

                  rx_buffer <= rx_buffer(d_width-2 DOWNTO 0) & miso; --shift in received bit

                END IF;

            

            --transmit spi clock toggle

                IF(assert_data = '1' AND clk_toggles < last_bit_rx) THEN 

                  mosi <= tx_buffer(d_width-1);                     --clock out data bit

                  tx_buffer <= tx_buffer(d_width-2 DOWNTO 0) & '0'; --shift data transmit buffer

                END IF;

            

            --last data receive, but continue

                IF(clk_toggles = last_bit_rx AND cont = '1') THEN 

                  tx_buffer <= tx_data;                       --reload transmit buffer

                  clk_toggles <= last_bit_rx - d_width*2 + 1; --reset spi clock toggle counter

                  continue <= '1';                            --set continue flag

                END IF;

            

            --normal end of transaction, but continue

                    IF(continue = '1') THEN  

                      continue <= '0';      --clear continue flag

                      busy <= '0';          --clock out signal that first receive data is ready

                      rx_data <= rx_buffer; --clock out received data to output port    

                    END IF;

            

            --end of transaction

                    IF((clk_toggles = d_width*2 + 1) AND cont = '0') THEN   

                      busy <= '0';             --clock out not busy signal

                      ss_n <= (OTHERS => '1'); --set all slave selects high

                      mosi <= 'Z';             --set mosi output high impedance

                      rx_data <= rx_buffer;    --clock out received data to output port

                      state <= ready;          --return to ready state

                    ELSE                       --not end of transaction

                      state <= execute;        --remain in execute state

                    END IF;

          

              ELSE        --system clock to sclk ratio not met

                count <= count + 1; --increment counter

                state <= execute;   --remain in execute state

              END IF;


        END CASE;

      END IF;

    END PROCESS; 

  END logic;



----------------------XXXX CONTROLLER  FILE -----
--------------------------------------------------------------------------------
--
--   FileName:         pmod_dac_ad5628.vhd
--   Dependencies:     spi_master.vhd
--   Design Software:  Quartus Prime Version 17.0.0 Build 595 SJ Lite Edition
--
--   HDL CODE IS PROVIDED "AS IS."  DIGI-KEY EXPRESSLY DISCLAIMS ANY
--   WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
--   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
--   PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL DIGI-KEY
--   BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
--   DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF
--   PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
--   BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
--   ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
--
--   Version History
--   Version 1.0 06/17/2020 Scott Larson
--     Initial Public Release
--    
--------------------------------------------------------------------------------

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY latest_dac7513_top IS
  GENERIC(
    clk_freq    : INTEGER := 50;  --system clock frequency in MHz
    spi_clk_div : INTEGER := 1);  --spi_clk_div = clk_freq/100 (answer rounded up)
  PORT(
    clk        : IN      STD_LOGIC;                      --system clock
    reset_n    : IN      STD_LOGIC;                      --active low asynchronous reset
    dac_tx_ena : IN      STD_LOGIC;                      --enable transaction with DAC
    dac_cmd    : IN      STD_LOGIC_VECTOR(3 DOWNTO 0);   --command to send to DAC
    dac_addr   : IN      STD_LOGIC_VECTOR(3 DOWNTO 0);   --address to send to DAC
    dac_data   : IN      STD_LOGIC_VECTOR(11 DOWNTO 0);  --data value to send to DAC
    busy       : OUT     STD_LOGIC;                      --indicates when transactions with DAC can be initiated
    mosi       : OUT     STD_LOGIC;                      --SPI bus to DAC: master out, slave in (DIN)
    sclk       : BUFFER  STD_LOGIC;                      --SPI bus to DAC: serial clock (SCLK)
    ss_n       : BUFFER  STD_LOGIC_VECTOR(0 DOWNTO 0));  --SPI bus to DAC: slave select (~SYNC)
END latest_dac7513_top;

ARCHITECTURE behavior OF latest_dac7513_top IS
  TYPE machine IS(start, configure, pause, ready, send_data); --needed states
  SIGNAL state         : machine := start;                    --state machine
  SIGNAL spi_busy_prev : STD_LOGIC;                           --previous value of the SPI component's busy signal
  SIGNAL spi_busy      : STD_LOGIC;                           --busy signal from SPI component
  SIGNAL spi_ena       : STD_LOGIC;                           --enable for SPI component
  SIGNAL spi_tx_data   : STD_LOGIC_VECTOR(15 DOWNTO 0);       --transmit data for SPI component

attribute keep : string;
attribute keep of state : signal is "true";

  --declare SPI Master component
  COMPONENT spi_for_dac7513 IS
    GENERIC(
      slaves  : INTEGER := 1;   --number of spi slaves
      d_width : INTEGER := 16); --data bus width
    PORT(
      clock   : IN     STD_LOGIC;                             --system clock
      reset_n : IN     STD_LOGIC;                             --asynchronous reset
      enable  : IN     STD_LOGIC;                             --initiate transaction
      cpol    : IN     STD_LOGIC;                             --spi clock polarity
      cpha    : IN     STD_LOGIC;                             --spi clock phase
      cont    : IN     STD_LOGIC;                             --continuous mode command
      clk_div : IN     INTEGER;                               --system clock cycles per 1/2 period of sclk
      addr    : IN     INTEGER;                               --address of slave
      tx_data : IN     STD_LOGIC_VECTOR(d_width-1 DOWNTO 0);  --data to transmit
      miso    : IN     STD_LOGIC;                             --master in, slave out
      sclk    : BUFFER STD_LOGIC;                             --spi clock
      ss_n    : BUFFER STD_LOGIC_VECTOR(slaves-1 DOWNTO 0);   --slave select
      mosi    : OUT    STD_LOGIC;                             --master out, slave in
      busy    : OUT    STD_LOGIC;                             --busy / data ready signal
      rx_data : OUT    STD_LOGIC_VECTOR(d_width-1 DOWNTO 0)); --data received
  END COMPONENT spi_for_dac7513;

BEGIN

  --instantiate the SPI Master component
  u1:  spi_for_dac7513
    GENERIC MAP(slaves => 1, d_width => 16)
    PORT MAP(clock => clk, reset_n => reset_n, enable => spi_ena, cpol => '1', cpha => '0',
             cont => '0', clk_div => spi_clk_div, addr => 0, tx_data => spi_tx_data, miso => '0',
             sclk => sclk, ss_n => ss_n, mosi => mosi, busy => spi_busy, rx_data => open);
       
  PROCESS(clk, reset_n)
    VARIABLE count : INTEGER RANGE 0 TO clk_freq*100 := 0; --counter
  BEGIN
  
    IF(reset_n = '0') THEN              --reset activated
      spi_ena <= '0';                     --clear SPI component enable
      spi_tx_data <= (OTHERS => '0');     --clear SPI component transmit data
      busy <= '1';                        --indication component is unavailable
      state <= start;                     --restart state machine
    ELSIF(clk'EVENT AND clk = '1') THEN --rising edge of system clock

      spi_busy_prev <= spi_busy;          --collect previous spi_busy
   
      CASE state IS                       --state machine

        --entry state, give DAC 100us to power up before communicating
        WHEN start =>
          busy <= '1';                     --component is busy, DAC not yet available
          IF(count < clk_freq*100) THEN    --100us not yet reached
            count := count + 1;              --increment counter
          ELSE                             --100us reached
            count := 0;                      --clear counter
--            state <= configure;              --advance to configure the DAC
          state <=  pause;
          END IF;

        --perform SPI transaction to turn on internal voltage reference  
        WHEN configure =>
          IF(spi_busy = '0' AND spi_busy_prev = '0') THEN      --no command sent
            spi_ena <= '1';                                      --enable transaction with DAC
            spi_tx_data <= "0000" & dac_data ;   --send data to turn on internal voltage reference
          ELSIF(spi_busy = '1') THEN                           --transaction underway
            spi_ena <= '0';                                      --clear transaction enable
          ELSE                                                 --transaction complete
            state <= pause;                                      --advance to pause state
          END IF;       
          
        --pauses 20ns between SPI transactions
        WHEN pause =>
          IF(count < clk_freq/50) THEN   --less than 20ns
            count := count + 1;            --increment counter
          ELSE                           --20ns has elapsed
            count := 0;                    --clear counter
            busy <= '0';                   --indicate component is ready for a transaction
            state <= ready;                --advance to ready state 
          END IF;
        
        --wait for a new transaction and latch it in
        WHEN ready =>
          IF(dac_tx_ena = '1') THEN                                            --transaction to DAC requested
            spi_tx_data <= "0000"  & dac_data ;  --latch in data stream to send
            busy <= '1';                                                         --indicate transaction is in progress
            state <= send_data;                                                  --advance to sending transaction
          END IF;

        --performs SPI transaction to DAC  
        WHEN send_data =>
          IF(spi_busy = '0' AND spi_busy_prev = '0') THEN  --transaction not started
            spi_ena <= '1';                                  --enable SPI transaction
          ELSIF(spi_busy = '1') THEN                       --transaction underway
            spi_ena <= '0';                                  --clear enable                            
          ELSE                                             --transaction complete
            state <= pause;                                  --return to pause state
          END IF;

        --default to start state
        WHEN OTHERS => 
          state <= start;

      END CASE;      
    END IF;
  END PROCESS;
END behavior;
--------------------------------TOP FILE -----
----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date: 20.10.2020 15:23:32
-- Design Name: 
-- Module Name: top - Behavioral
-- Project Name: 
-- Target Devices: 
-- Tool Versions: 
-- Description: 
-- 
-- Dependencies: 
-- 
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
-- 
----------------------------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all ; 


-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity top is
  Port (   clk , rstn , dac_en: in std_logic ; 
              mosi : out std_logic ; 
              sclk : buffer std_logic ; 
              cs : buffer std_logic_Vector( 0 downto 0) 
              );
end top;

architecture Behavioral of top is

 type rom_type is array (1023 downto 0) of std_logic_vector (11  downto 0);
signal ROM : rom_type:= (
--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",
--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",

--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",
--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",

--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",
--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",

--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",
--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",

--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",
--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",

--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",
--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",

--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",
--X"000", X"000", X"000", X"000",X"FFF" ,X"FFF" ,X"FFF" ,X"FFF" ,X"FFF",X"FFF" ,X"FFF",

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,


X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" ,

X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,X"FFF" , X"FFF" , X"FFF" , X"FFF" ,
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , 
X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" , X"000", X"000" ,X"000" ,X"000" 


 );

 

 component latest_dac7513_top IS
  GENERIC(
    clk_freq    : INTEGER := 50;  --system clock frequency in MHz
    spi_clk_div : INTEGER := 1);  --spi_clk_div = clk_freq/100 (answer rounded up)
  PORT(
    clk        : IN      STD_LOGIC;                      --system clock
    reset_n    : IN      STD_LOGIC;                      --active low asynchronous reset
    dac_tx_ena : IN      STD_LOGIC;                      --enable transaction with DAC
    dac_cmd    : IN      STD_LOGIC_VECTOR(3 DOWNTO 0);   --command to send to DAC
    dac_addr   : IN      STD_LOGIC_VECTOR(3 DOWNTO 0);   --address to send to DAC
    dac_data   : IN      STD_LOGIC_VECTOR(11 DOWNTO 0);  --data value to send to DAC
    busy       : OUT     STD_LOGIC;                      --indicates when transactions with DAC can be initiated
    mosi       : OUT     STD_LOGIC;                      --SPI bus to DAC: master out, slave in (DIN)
    sclk       : BUFFER  STD_LOGIC;                      --SPI bus to DAC: serial clock (SCLK)
    ss_n       : BUFFER  STD_LOGIC_VECTOR(0 DOWNTO 0));  --SPI bus to DAC: slave select (~SYNC)
    
END component  latest_dac7513_top;


signal clock50 : std_logic ; 
signal data  : std_logic_Vector ( 11 downto 0) ; 
 
SIGNAL  addr_count : std_logic_vector ( 6 downto 0) ;  

----http://justpaste.it/6hyzm


component clk_wiz_0
port
 (-- Clock in ports
  -- Clock out ports
  clk_out1          : out    std_logic;
  clk_in1           : in     std_logic
 );
end component;



begin

u1 : clk_wiz_0
   port map ( 
  -- Clock out ports  
   clk_out1 => clock50,
   -- Clock in ports
   clk_in1 => clk
 );
 
  process ( clock50,rstn )  begin 
       if ( rstn='0') then 
          addr_count <=(others=>'0') ; 
      elsif rising_Edge ( clock50 ) then 
           if ( dac_en='0') then 
               addr_count<=(others=>'0') ; 
            else 
          addr_count <= addr_count +1 ; 
        end if ; 
        
        end if ; 
     end process ; 
     
  
   
 
process (clock50)
begin
if rising_edge(clock50) then
 if (dac_en = '1') then
 data<= ROM(conv_integer(addr_count));
 end if;
end if;
end process;

 
 
 
 
 u2 :  latest_dac7513_top 
  GENERIC  map (
    clk_freq => 50,  --system clock frequency in MHz
    spi_clk_div =>1 )  --spi_clk_div = clk_freq/100 (answer rounded up)
  PORT map (
    clk  => clock50, ---      : IN      STD_LOGIC;                      --system clock
    reset_n   =>rstn , --  : IN      STD_LOGIC;                      --active low asynchronous reset
    dac_tx_ena=>dac_en , ----  : IN      STD_LOGIC;                      --enable transaction with DAC
    dac_cmd  =>"0000" , ---   : IN      STD_LOGIC_VECTOR(3 DOWNTO 0);   --command to send to DAC
    dac_addr =>"0000" , ---   : IN      STD_LOGIC_VECTOR(3 DOWNTO 0);   --address to send to DAC
    dac_data =>data , ---x"fff" , ---   : IN      STD_LOGIC_VECTOR(11 DOWNTO 0);  --data value to send to DAC
    busy       =>open , ---- OUT     STD_LOGIC;                      --indicates when transactions with DAC can be initiated
    mosi       => mosi , ---- OUT     STD_LOGIC;                      --SPI bus to DAC: master out, slave in (DIN)
    sclk       =>sclk , --- : BUFFER  STD_LOGIC;                      --SPI bus to DAC: serial clock (SCLK)
    ss_n     =>cs  --  : BUFFER  STD_LOGIC_VECTOR(0 DOWNTO 0));  --SPI bus to DAC: slave select end 
    );
 

end Behavioral;





No comments:

Post a Comment

spyglass lint 1