Advertisement
Guest User

Untitled

a guest
Mar 25th, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 2.10 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. -- CPOL0 (Idle CLK = 0)
  6. -- CPHA1 (Change on rising edge, sampling on falling)
  7.  
  8. entity spimaster is
  9.   port (
  10.     CLK_IN           : in  std_logic;
  11.     DATA_IN_H        : in  std_logic_vector(7 downto 0);
  12.     DATA_IN_L        : in  std_logic_vector(7 downto 0);
  13.     CS_OUT           : out std_logic;
  14.     BUSY_FLAG        : out std_logic;
  15.     MOSI             : out std_logic;
  16.     ENABLE           : in  std_logic;
  17.     SEND_CONFIG      : in  std_logic;
  18.     CONFIG_BIT_STATE : in  std_logic;
  19.     SPI_CLK          : out std_logic
  20.     );
  21. end entity;
  22.  
  23. architecture arch of spimaster is
  24.  
  25.   signal BITPOS        : integer range 0 to 8 := 8;
  26.   signal DATA_WORD     : std_logic_vector(15 downto 0);
  27.   signal CLK_OUT_INT   : std_logic            := '0';
  28.   signal BUSY_FLAG_INT : std_logic            := '0';
  29.   signal MOSI_INT      : std_logic            := '0';
  30. begin
  31.  
  32.   process(CLK_IN)
  33.   begin
  34.     if(rising_edge(CLK_IN)) then
  35.       CLK_OUT_INT <= '0';
  36.       if(BUSY_FLAG_INT = '0' and ENABLE = '1') then
  37.  
  38.         if(SEND_CONFIG = '1') then
  39.           MOSI_INT    <= CONFIG_BIT_STATE;
  40.           CLK_OUT_INT <= '1';
  41.         else
  42.           BITPOS        <= 8;
  43.           DATA_WORD     <= DATA_IN_H & DATA_IN_L;
  44.           CS_OUT        <= '0';
  45.           MOSI_INT      <= '0';
  46.           BUSY_FLAG_INT <= '1';
  47.         end if;
  48.       else  --BUSY_FLAG == 1 -> transmit in progress
  49.         if(BUSY_FLAG_INT = '1') then
  50.           if(CLK_OUT_INT = '0') then
  51.             if(BITPOS > 0) then
  52.               MOSI_INT <= DATA_WORD(BITPOS-1);
  53.             end if;
  54.             if(BITPOS = 0) then
  55.               BUSY_FLAG_INT <= '0';
  56.               CS_OUT        <= '1';
  57.               MOSI_INT      <= '0';
  58.             else
  59.               BITPOS      <= BITPOS - 1;
  60.               CLK_OUT_INT <= '1';
  61.             end if;
  62.           else
  63.             CLK_OUT_INT <= '0';
  64.           end if;
  65.         end if;
  66.       end if;
  67.  
  68.     end if;
  69.   end process;
  70.  
  71.   SPI_CLK   <= CLK_OUT_INT;
  72.   BUSY_FLAG <= BUSY_FLAG_INT;
  73.   MOSI      <= MOSI_INT;
  74.  
  75. end architecture;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement