OpenCores
URL https://opencores.org/ocsvn/pcie_sg_dma/pcie_sg_dma/trunk

Subversion Repositories pcie_sg_dma

[/] [pcie_sg_dma/] [trunk/] [rtl/] [DDR_Blinker.vhd] - Rev 2

Compare with Previous | Blame | View Log

----------------------------------------------------------------------------------
-- Company:  ZITI
-- Engineer:  wgao
-- 
-- Create Date:    16:38:03 06 Oct 2008 
-- Design Name: 
-- Module Name:    DDR_Blink - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision 1.00 - first release.  08.10.2008
-- 
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
library work;
use work.abb64Package.all;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity DDR_Blink is
    Port ( 
           DDR_blinker              : OUT   std_logic;
 
           DBG_dma_start            : IN    std_logic;
           DBG_bram_wea             : IN    std_logic_vector(7 downto 0);
           DBG_bram_addra           : IN    std_logic_vector(C_PRAM_AWIDTH-1 downto 0);
 
           DDR_Write                : IN    std_logic;
           DDR_Read                 : IN    std_logic;
           DDR_Both                 : IN    std_logic;
 
           ddr_Clock                : IN    std_logic;
           DDr_Rst_n                : IN    std_logic
          );
end entity DDR_Blink;
 
 
architecture Behavioral of DDR_Blink is
 
 
  -- Blinking -_-_-_-_
  Constant  C_BLINKER_MSB       : integer      :=   15;  -- 4;  -- 15;
  Constant  CBIT_SLOW_BLINKER   : integer      :=   11;  -- 2;  -- 11;
 
  signal  DDR_dma_write_wrong_lo   :  std_logic;
  signal  DDR_dma_write_wrong_hi   :  std_logic;
  signal  DDR_dma_write_init_lo    :  std_logic;
  signal  DDR_dma_write_init_hi    :  std_logic;
  signal  dma_bram_wr_address_lo   :  std_logic_vector(C_PRAM_AWIDTH-1 downto 0);
  signal  dma_bram_wr_address_hi   :  std_logic_vector(C_PRAM_AWIDTH-1 downto 0);
 
  signal  DDR_blinker_i         :  std_logic;
  signal  Fast_blinker          :  std_logic_vector(C_BLINKER_MSB downto 0);
  signal  Fast_blinker_MSB_r1   :  std_logic;
  signal  Blink_Pulse           :  std_logic;
  signal  Slow_blinker          :  std_logic_vector(CBIT_SLOW_BLINKER downto 0);
 
  signal  DDR_write_extension    :  std_logic;
  signal  DDR_write_extension_Cnt:  std_logic_vector(1 downto 0);
  signal  DDR_read_extension     :  std_logic;
  signal  DDR_read_extension_Cnt :  std_logic_vector(1 downto 0);
 
 
begin
 
--   DDR_blinker    <=  DDR_blinker_i;
   DDR_blinker    <=  DDR_dma_write_wrong_lo or DDR_dma_write_wrong_hi;
 
   -- 
   Syn_DDR_Fast_blinker:
   process ( ddr_Clock, DDr_Rst_n)
   begin
      if DDr_Rst_n = '0' then
         Fast_blinker        <= (OTHERS=>'0');
         Fast_blinker_MSB_r1 <= '0';
         Blink_Pulse         <= '0';
 
         Slow_blinker        <= (OTHERS=>'0');
 
      elsif ddr_Clock'event and ddr_Clock = '1' then
         Fast_blinker        <= Fast_blinker + '1';
         Fast_blinker_MSB_r1 <= Fast_blinker(C_BLINKER_MSB);
         Blink_Pulse         <= Fast_blinker(C_BLINKER_MSB) and not Fast_blinker_MSB_r1;
 
         Slow_blinker        <= Slow_blinker + Blink_Pulse;
 
      end if;
   end process;
 
 
   -- 
   Syn_DDR_Write_Extenstion:
   process ( ddr_Clock, DDr_Rst_n)
   begin
      if DDr_Rst_n = '0' then
         DDR_write_extension_Cnt <= (OTHERS=>'0');
         DDR_write_extension     <= '0';
 
      elsif ddr_Clock'event and ddr_Clock = '1' then
 
         case DDR_write_extension_Cnt is
 
           when "00"   =>
             if DDR_Write='1' then
                DDR_write_extension_Cnt <= "01";
                DDR_write_extension     <= '1';
             else
                DDR_write_extension_Cnt <= DDR_write_extension_Cnt;
                DDR_write_extension     <= DDR_write_extension;
             end if;
 
           when "01"   =>
             if Slow_blinker(CBIT_SLOW_BLINKER)='1' then
                DDR_write_extension_Cnt <= "11";
                DDR_write_extension     <= '1';
             else
                DDR_write_extension_Cnt <= DDR_write_extension_Cnt;
                DDR_write_extension     <= DDR_write_extension;
             end if;
 
           when "11"   =>
             if Slow_blinker(CBIT_SLOW_BLINKER)='0' then
                DDR_write_extension_Cnt <= "10";
                DDR_write_extension     <= '1';
             else
                DDR_write_extension_Cnt <= DDR_write_extension_Cnt;
                DDR_write_extension     <= DDR_write_extension;
             end if;
 
           when Others          =>
             if Slow_blinker(CBIT_SLOW_BLINKER)='1' then
                DDR_write_extension_Cnt <= "00";
                DDR_write_extension     <= '0';
             else
                DDR_write_extension_Cnt <= DDR_write_extension_Cnt;
                DDR_write_extension     <= DDR_write_extension;
             end if;
 
         end case;
 
      end if;
   end process;
 
 
   -- 
   Syn_DDR_Read_Extenstion:
   process ( ddr_Clock, DDr_Rst_n)
   begin
      if DDr_Rst_n = '0' then
         DDR_read_extension_Cnt <= (OTHERS=>'0');
         DDR_read_extension     <= '1';
 
      elsif ddr_Clock'event and ddr_Clock = '1' then
 
         case DDR_read_extension_Cnt is
 
           when "00"   =>
             if DDR_Read='1' then
                DDR_read_extension_Cnt <= "01";
                DDR_read_extension     <= '0';
             else
                DDR_read_extension_Cnt <= DDR_read_extension_Cnt;
                DDR_read_extension     <= DDR_read_extension;
             end if;
 
           when "01"   =>
             if Slow_blinker(CBIT_SLOW_BLINKER)='1' then
                DDR_read_extension_Cnt <= "11";
                DDR_read_extension     <= '0';
             else
                DDR_read_extension_Cnt <= DDR_read_extension_Cnt;
                DDR_read_extension     <= DDR_read_extension;
             end if;
 
           when "11"   =>
             if Slow_blinker(CBIT_SLOW_BLINKER)='0' then
                DDR_read_extension_Cnt <= "10";
                DDR_read_extension     <= '0';
             else
                DDR_read_extension_Cnt <= DDR_read_extension_Cnt;
                DDR_read_extension     <= DDR_read_extension;
             end if;
 
           when Others          =>
             if Slow_blinker(CBIT_SLOW_BLINKER)='1' then
                DDR_read_extension_Cnt <= "00";
                DDR_read_extension     <= '1';
             else
                DDR_read_extension_Cnt <= DDR_read_extension_Cnt;
                DDR_read_extension     <= DDR_read_extension;
             end if;
 
         end case;
 
      end if;
   end process;
 
 
   -- 
   Syn_DDR_Working_blinker:
   process ( ddr_Clock, DDr_Rst_n)
   begin
      if DDr_Rst_n = '0' then
         DDR_Blinker_i      <= '0';
      elsif ddr_Clock'event and ddr_Clock = '1' then
         DDR_Blinker_i      <= (Slow_blinker(CBIT_SLOW_BLINKER-2) or DDR_write_extension) and DDR_read_extension;
      end if;
   end process;
 
 
   -- !!! DBG !!!
   Syn_DDR_DBG_blinker:
   process ( ddr_Clock, DBG_dma_start)
   begin
      if DBG_dma_start = '1' then
         DDR_dma_write_init_lo  <= '1';
         DDR_dma_write_init_hi  <= '1';
         DDR_dma_write_wrong_lo <= '0';
         DDR_dma_write_wrong_hi <= '0';
         dma_bram_wr_address_lo <= (others=>'0');
         dma_bram_wr_address_hi <= (others=>'0');
 
      elsif ddr_Clock'event and ddr_Clock = '1' then
         if DBG_bram_wea(0)='1' then
            DDR_dma_write_init_lo  <= '0';
         else
            DDR_dma_write_init_lo  <= DDR_dma_write_init_lo;
         end if;
 
         if DDR_dma_write_init_lo='1' then
            DDR_dma_write_wrong_lo <= '0';
            if DBG_bram_wea(0)='1' then
               dma_bram_wr_address_lo <= DBG_bram_addra + '1';
            else
               dma_bram_wr_address_lo <= dma_bram_wr_address_lo;
            end if;
         else
           if DBG_bram_wea(0)='1' then
               dma_bram_wr_address_lo <= dma_bram_wr_address_lo + '1';
               if DBG_bram_addra<dma_bram_wr_address_lo then
                  DDR_dma_write_wrong_lo <= '1';
               else
                  DDR_dma_write_wrong_lo <= '0';
               end if;
           else
               dma_bram_wr_address_lo <= dma_bram_wr_address_lo;
           end if;
         end if;
 
         --------------------------------------------------------------------------------
 
         if DBG_bram_wea(4)='1' then
            DDR_dma_write_init_hi  <= '0';
         else
            DDR_dma_write_init_hi  <= DDR_dma_write_init_hi;
         end if;
 
         if DDR_dma_write_init_hi='1' then
            DDR_dma_write_wrong_hi <= '0';
            if DBG_bram_wea(4)='1' then
               dma_bram_wr_address_hi <= DBG_bram_addra + '1';
            else
               dma_bram_wr_address_hi <= dma_bram_wr_address_hi;
            end if;
         else
           if DBG_bram_wea(4)='1' then
               dma_bram_wr_address_hi <= dma_bram_wr_address_hi + '1';
               if DBG_bram_addra<dma_bram_wr_address_hi then
                  DDR_dma_write_wrong_hi <= '1';
               else
                  DDR_dma_write_wrong_hi <= '0';
               end if;
           else
               dma_bram_wr_address_hi <= dma_bram_wr_address_hi;
           end if;
         end if;
 
      end if;
   end process;
 
end architecture Behavioral;
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.