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

📄 新建 文本文档.txt.bak

📁 加密Altera的FPGA的方法 加密Altera的FPGA的方法
💻 BAK
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MAXconfig is
  port
  (
        clock : in std_logic;
    init_done : in std_logic;
      nStatus : in std_logic;
            D : in std_logic_vector(7 downto 0);
      restart : in std_logic;
    Conf_Done : in std_logic;
        Data0 : out std_logic;
         Dclk : out std_logic;
      nConfig : buffer std_logic;
--To increase the size of the memory, change the size of std_logic_vector for ADDR output and
--std_logic_vector signal inc:
         ADDR : out std_logic_vector(15 downto 0);
          CEn : out std_logic);
-- The polarity of the CEn signal is determined by the type of Flash device
end;

architecture rtl of MAXconfig is

--The following encoding is done in such way that the LSB represents the nConfig signal:

constant start :std_logic_vector(2 downto 0) := "000";
constant wait_nCfg_8us :std_logic_vector(2 downto 0) := "100";
constant status :std_logic_vector(2 downto 0) := "001";
constant wait_40us :std_logic_vector(2 downto 0) := "101";
constant config :std_logic_vector(2 downto 0) := "011";
constant init :std_logic_vector(2 downto 0) := "111";

signal pp :std_logic_vector(2 downto 0);
signal count :std_logic_vector(2 downto 0);
signal data0_int, dclk_int :std_logic;
signal inc :std_logic_vector(15 downto 0);
signal div :std_logic_vector(2 downto 0);
signal waitd :std_logic_vector(11 downto 0);
--The width of signal ‘waitd’ is determined by the frequency. For 57 MHz (APEX 20KE devices),
--‘waitd’ is 12 bits. For 33 MHz (FLEX 10KE and ACEX devices) ‘waitd’ is 11 bits. To calculate
--the width of the ‘waitd’ signal fordifferent frequencies, calculate the following:
--(multiply tcf2ck * clock frequency)+ 40
--Then convert this value to binary to obtain the width.
--For example, for 33 MHz (FLEX 10KE & ACEX devices), converting 1360 ((40us * 33MHz)+40=1360)
--to binary code, the ‘waitd’ is an 11-bit signal. So signal ‘waitd’ will be:
--signal waitd :std_logic_vector(10 downto 0);

begin
--The following process is used to divide the CLOCK:
   PROCESS (clock,restart)
    begin
     if restart = '0' then
      div <= (others => '0');
     else
    IF (clock'EVENT AND clock = '1') THEN
   div <= div + 1;
  end if;
end if;
END PROCESS;

   PROCESS (clock,restart)
    begin
     if restart = '0' then
      pp<=start;
       count <= (others => '0');
      inc <= (others => '0');
     waitd <= (others => '0');
    else
   if clock'event and clock='1' then
--The following test is used to divide the CLOCK. The value compared to must be such that the
--condition is true at a maximum rate of 57 MHz (tclk = 17.5 ns min) for APEX 20KE devices
--and at a maximum rate of 33 MHz (tclk=30ns min) for FLEX 10KE or ACEX devices.
  if (div = 7) then
    case pp is
    when start =>
       count <= (others => '0');
         inc <= (others => '0');
       waitd <= (others => '0');
          pp <= wait_nCfg_8us;
          
--This state is used in order to verify the tcfg timing (nCONFIG low pulse width).
--Tcfg = 8μs => min= 456 clock cycle of a 57 MHz clock (APEX 20KE devices). For different
--clocks, multiply 8μs to clock frequency. For example, for 33MHz (FLEX 10KE or ACEX devices)
this --value is 8*33=264. This clock is CLOCK divided by the divider -div-.
       when wait_nCfg_8us =>
       count <= (others => '0');
         inc <= (others => '0');
       waitd <= waitd + 1;
      if waitd = 456 then
      
--For 33 MHz FLEX 10KE or ACEX devices this line is: if waitd = 264 then

      pp <= status;
   end if;
   
--This state is used to have nCONFIG high.

      when status =>
       count <= (others => '0');
         inc <= (others => '0');
       waitd <= (others => '0');
          pp <= wait_40us;
          
--This state is used to generate the tcf2ck timing (nCONFIG high to first rising edge on DCLK).
--Tcf2ck = 40μs min => 2280 clock cycles of a 57MHz (APEX 20KE) clock. This clock is CLOCK
--divide by the divider -div-
--Tcf2ck = 40μs min => 1320 clock cycles of a 33MHz (FLEX 10KE/ACEX) clock. This clock is CLOCK
--divided by the divider -div-)
--For any other clock frequency, multiply tcf2ck * clock frequency.

        when wait_40us =>
         count <= (others => '0');
           inc <= (others => '0');
         waitd <= waitd + 1;
       if waitd = 2280 then
       
--For 33 MHz (FLEX 10KE or ACEX devices), this line is: if waitd = 1320 then

      pp <= config;
       end if;
       
--This state is used to increment the memory address. In the same state when
--the Conf_Done is high clock cycles are added in order to have the initialization completed.

     when config =>
    count <= count + 1;
     if Conf_Done='1' then
    waitd <= waitd + 1;
   end if;
  if count=7 then
  inc <= inc + 1;
end if;
   if waitd = 2320 then
--Modification: Add 40 clock cycles. For APEX 20KE devices, it is 2280+40=2320

--For FLEX 10KE and ACEX devices, it is 1320+40=1360. This line becomes: if waitd= 1360 then

    pp<= init;
   end if;
   when init =>
   count <= (others => '0');
     inc <= (others => '0');
   waitd <= (others => '0');
  if nStatus = '0' then
   pp <= start;
  else
  pp <= init;
  end if;
  when others =>
  pp <= start;
  end case;
else
pp <= pp;
inc <= inc;
count <= count;
end if;
end if;
end if;
end PROCESS;
dclk_int <= div(2) when pp=config else '0';
--The following process is used to serialize the data byte :
PROCESS (count,D,pp)
begin
if pp=config then
case count is
when "000" => data0_int <= D(0);
when "001" => data0_int <= D(1);
when "010" => data0_int <= D(2);
when "011" => data0_int <= D(3);
when "100" => data0_int <= D(4);
when "101" => data0_int <= D(5);
when "110" => data0_int <= D(6);
when "111" => data0_int <= D(7);
when others => null;
end case;
else
data0_int <= '0';
end if;
end PROCESS;
nConfig <= pp(0);
CEn <= not nconfig;
Dclk <= '0' when pp(1)='0' else dclk_int;
Data0 <= '0' when pp(1)='0' else data0_int;
ADDR <= inc;
end;

⌨️ 快捷键说明

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