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

📄 config_controller.vhd

📁 用VHDL硬件描述语言实现的对FPGA(Cyclone II)的配置的VHDL源代码。
💻 VHD
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY lpm;
USE lpm.lpm_components.all;

ENTITY config_controller IS
	PORT
	( 
	   cpld_clkosc    : IN STD_LOGIC ;--从clock发生芯片输入到cpld,
		                              --提供内部晶振时钟
           reset_n    : IN STD_LOGIC ;--从reset发生芯片输入到cpld
          status_n    : IN STD_LOGIC ;--从cyclone到cpld,置1表cyclone
                                      --已做好接收配置数据准备;配置
                                      --过程中置0表出错
  --config_request_n    : IN STD_LOGIC ;--从cyclone输入到cpld,表cyclone
                                      --向cpld请求配置数据
     --safe_config_n    : IN STD_LOGIC ;--从外部电路到cpld,外部按钮,
                                      --按下即可强迫cpld从flash安全
                                      --区读配置数据
         flash_a22    : OUT STD_LOGIC ;--从cpld到flash,接1
         flash_a21    : OUT STD_LOGIC ;--从cpld到flash,接1
         flash_a20    : OUT STD_LOGIC ;--从cpld到flash,接0选择user,
                                       --接1选择safe
                 a    : OUT STD_LOGIC_VECTOR (19 DOWNTO 0);--从cpld到
                                                           --flash,
                                                           --1M地址线
                 D    : IN STD_LOGIC_VECTOR (7 DOWNTO 0);--从flash输入
                                                         --字节到cpld,
                                                         --并行数据输入
         pld_data0    : OUT STD_LOGIC ;--从cpld到cyclone,串行输出数据
                                       --到cyclone
          config_n    : OUT STD_LOGIC ;--从cpld到cyclone;开启配置
       config_done    : IN STD_LOGIC ;--从cyclone反馈给cpld,以置1表
                                      --示配置完成
              DCLK    : OUT STD_LOGIC ;--从cpld到cyclone,提供配置时钟
       --INIT_DONE    :input;--显示cyclone初始化完成,用户可以用配置
                             --成功的FPGA了
        flash_cs_n    : OUT STD_LOGIC ;--flash片选信号,置1表选中
        flash_oe_n    : OUT STD_LOGIC ;--flash使能信号,置1表使能
        flash_rw_n    : OUT STD_LOGIC ;--flash读信号,置1表只从flash里读
        flash_reset_n    : OUT STD_LOGIC ;--flash复位信号
   --flash_RY_BY_n    :input;--用于等待flash
      --enet_reset    :output;--从cpld输出
  --proto1_reset_n    :output;--从cpld输出
  --proto2_reset_n    :output;--从cpld输出
         pld_msel0    : OUT STD_LOGIC ;--配置模式选择
         pld_msel1    : OUT STD_LOGIC ;--配置模式选择
        --pld_cs_n    :input;--EPCS片选信号,置1表选中
        --pld_asd0    :input;--从cyclong到EPCS,传送控制信号
       loading_led    : OUT STD_LOGIC ;--从cpld输出,闪灯,显示配置正
                                       --在进行
         error_led    : OUT STD_LOGIC ;--从cpld输出,报错灯,灯亮表配
                                       --置失败
          user_led    : OUT STD_LOGIC  --从cpld输出,灯亮表从用户区读
                                       --入配置数据的
          --safe_led    : OUT STD_LOGIC ;--从cpld输出,灯亮表从安全区读
                                       --入配置数据的
    --enet_vlbus_n    :output;--从cpld输出
        --user_pb0    :input;
        --user_pb1    :input;
        --user_pb2    :input;
        --user_pb3    :input;
	);
END config_controller;


ARCHITECTURE config OF config_controller IS

  COMPONENT dclk_divider--调用子模块dclk_divider
	PORT                --此模块用于分频产生配置时钟
	(
		clock		: IN STD_LOGIC ;
		aclr		: IN STD_LOGIC ;
		q		: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
		cout		: OUT STD_LOGIC 
	);
	END COMPONENT;
	
  COMPONENT address_counter--调用子模块address_counter 
	PORT                   --此模块用于产生flash的读地址
	(
		clock		: IN STD_LOGIC ;
		clk_en		: IN STD_LOGIC ;
		cnt_en		: IN STD_LOGIC ;
		aclr		: IN STD_LOGIC ;
		q		: OUT STD_LOGIC_VECTOR (19 DOWNTO 0);
		cout		: OUT STD_LOGIC 
	);
  END COMPONENT;

  COMPONENT data_bit_counter--调用子模块data_bit_counter 
	PORT                    --此模块用于分字节为bit流
	(
		clock		: IN STD_LOGIC ;
		clk_en		: IN STD_LOGIC ;
		cnt_en		: IN STD_LOGIC ;
		aclr		: IN STD_LOGIC ;
		q		: OUT STD_LOGIC_VECTOR (2 DOWNTO 0);
		cout		: OUT STD_LOGIC 
	);
  END COMPONENT;

  COMPONENT shift_register--调用子模块shift_register
	PORT                  --此模块用于串行读配置数据(bit流)到待配置的FPGA里
	(
		clock		: IN STD_LOGIC ;
		enable		: IN STD_LOGIC ;
		load		: IN STD_LOGIC ;
		aclr		: IN STD_LOGIC ;
		data		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		shiftout		: OUT STD_LOGIC 
	);
  END COMPONENT;

COMPONENT DFFE--调用带有使能的D触发器
   PORT (d   : IN STD_LOGIC;
      clk : IN STD_LOGIC;
      clrn: IN STD_LOGIC;
      prn : IN STD_LOGIC;
      ena : IN STD_LOGIC;
      q   : OUT STD_LOGIC );
END COMPONENT;

COMPONENT DFF--调用不带有使能的D触发器
   PORT (d   : IN STD_LOGIC;
      clk : IN STD_LOGIC;
      clrn: IN STD_LOGIC;
      prn : IN STD_LOGIC;
      q   : OUT STD_LOGIC );
END COMPONENT;

COMPONENT TRI--调用三态门
   PORT (a_in : IN STD_LOGIC;
      oe: IN STD_LOGIC;
      a_out: OUT STD_LOGIC);
END COMPONENT;
 

SIGNAL dclk_divider_cout, dclk_divider_q3    : STD_LOGIC ;
SIGNAL address_counter_clk_en, address_counter_cout     : STD_LOGIC ;
SIGNAL address_counter_q                      : STD_LOGIC_VECTOR (19 DOWNTO 0);    
SIGNAL data_bit_counter_cout                  : STD_LOGIC ;
SIGNAL shift_register_enable, shift_register_shiftout     : STD_LOGIC ;
SIGNAL reset_pulse_q	                      : STD_LOGIC ;
SIGNAL try_user_config_d, try_user_config_q   : STD_LOGIC ;
SIGNAL eek_an_error_d, eek_an_error_q         : STD_LOGIC ;
SIGNAL state_error_d, state_error_q	          : STD_LOGIC ;
SIGNAL counter_wrapped_d, counter_wrapped_q   : STD_LOGIC ;
SIGNAL state_waiting_for_status_n_q           : STD_LOGIC ;
SIGNAL state_done_d, state_done_q             : STD_LOGIC ;
SIGNAL state_counting_d, state_counting_q     : STD_LOGIC ;
SIGNAL config_n_reg_q                         : STD_LOGIC ;

SIGNAL data0, restart_sequence,  not_restart_sequence    : STD_LOGIC ;
SIGNAL not_reset_n, not_status_n, not_reset_pulse_q, drive_outputs  : STD_LOGIC ;
SIGNAL not_try_user_config_q, dclkq3_stcntg, not_config_n_reg_q    : STD_LOGIC ;


BEGIN

flash_reset_n<=not reset_pulse_q;
--dclk_en<=dclk_divider_cout;
address_counter_clk_en<=dclk_divider_cout and data_bit_counter_cout;
shift_register_enable<=dclk_divider_cout and state_counting_q;
try_user_config_d<=(not eek_an_error_q)and try_user_config_q;
eek_an_error_d<=((not status_n)and state_counting_q) or (counter_wrapped_q and (not state_done_q));
state_error_d<=((((not status_n)and state_counting_q)or counter_wrapped_q)and(not try_user_config_q))or state_error_q;
counter_wrapped_d<=address_counter_cout or counter_wrapped_q;
state_done_d<=config_done or state_done_q;
state_counting_d<=(not config_done)and(not state_waiting_for_status_n_q)and(not state_error_q)and config_n_reg_q;
restart_sequence<=reset_pulse_q or (eek_an_error_q and try_user_config_q);
dclkq3_stcntg<=dclk_divider_q3 and state_counting_q;
pld_msel0<=(not state_error_q) and (not state_done_q);
pld_msel1<='0';
drive_outputs<=(not state_error_q) and (not state_done_q);
data0<=(data_bit_counter_cout and D(0))or((not data_bit_counter_cout)and shift_register_shiftout);
not_restart_sequence<=not restart_sequence;
not_reset_n<=not reset_n;
not_status_n<=not status_n;
not_reset_pulse_q<=not reset_pulse_q;
not_try_user_config_q<=not try_user_config_q;
not_config_n_reg_q<=not config_n_reg_q;

loading_led<=((state_counting_q and (not state_done_q)and (not state_error_q))and address_counter_q(16)) or reset_pulse_q;
user_led<=try_user_config_q and (not state_error_q);
error_led<=state_error_q;

--例化元件映射关系
u1  :  dclk_divider port map(clock=>cpld_clkosc, aclr=>restart_sequence, q(3)=>dclk_divider_q3, cout=>dclk_divider_cout);
u2  :  address_counter port map(clock=>cpld_clkosc, clk_en=>address_counter_clk_en, cnt_en=>state_counting_q, aclr=>restart_sequence, q=>address_counter_q, cout=>address_counter_cout);
u3  :  data_bit_counter port map(clock=>cpld_clkosc, clk_en=>dclk_divider_cout, cnt_en=>state_counting_q, aclr=>restart_sequence, cout=>data_bit_counter_cout);
u4  :  shift_register port map(clock=>cpld_clkosc, enable=>shift_register_enable, load=>data_bit_counter_cout, data(6 downto 0)=>D(7 downto 1), aclr=>restart_sequence, shiftout=>shift_register_shiftout);

u5  :  dff port map(d=>not_reset_n, clk=>cpld_clkosc, clrn=>'1', prn=>reset_n, q=>reset_pulse_q);
u6  :  dff port map(d=>try_user_config_d, clk=>cpld_clkosc, clrn=>'1', prn=>not_reset_n, q=>try_user_config_q); 
u7  :  dff port map(d=>eek_an_error_d, clk=>cpld_clkosc, clrn=>not_reset_pulse_q, prn=>'1', q=>eek_an_error_q);
u8  :  dffe port map(d=>state_error_d, clk=>cpld_clkosc, ena=>dclk_divider_cout,clrn=>not_reset_pulse_q, prn=>'1', q=>state_error_q);
u9  :  dff port map(d=>counter_wrapped_d, clk=>cpld_clkosc, clrn=>restart_sequence, prn=>'1', q=>counter_wrapped_q);
u10  :  dffe port map(d=>not_status_n, clk=>cpld_clkosc, ena=>dclk_divider_cout, clrn=>not_restart_sequence, prn=>'1', q=>state_waiting_for_status_n_q);
u11  :  dffe port map(d=>state_done_d, clk=>cpld_clkosc, ena=>dclk_divider_cout, clrn=>not_restart_sequence, prn=>'1', q=>state_done_q);
u12  :  dffe port map(d=>state_counting_d, clk=>cpld_clkosc, ena=>dclk_divider_cout, clrn=>not_restart_sequence, prn=>'1', q=>state_counting_q);
u13  :  dffe port map(d=>'1', clk=>cpld_clkosc, ena=>dclk_divider_cout, clrn=>not_restart_sequence, prn=>'1', q=>config_n_reg_q);

u14 :  tri port map(a_in=>'1', oe=>drive_outputs, a_out=>flash_a22);  
u15 :  tri port map(a_in=>'1', oe=>drive_outputs, a_out=>flash_a21);  
u16 :  tri port map(a_in=>not_try_user_config_q, oe=>drive_outputs, a_out=>flash_a20); 

u17 :  tri port map(a_in=>address_counter_q(19), oe=>drive_outputs, a_out=>a(19));  
u18 :  tri port map(a_in=>address_counter_q(18), oe=>drive_outputs, a_out=>a(18));
u19 :  tri port map(a_in=>address_counter_q(17), oe=>drive_outputs, a_out=>a(17));  
u20 :  tri port map(a_in=>address_counter_q(16), oe=>drive_outputs, a_out=>a(16));  
u21 :  tri port map(a_in=>address_counter_q(15), oe=>drive_outputs, a_out=>a(15));  
u22 :  tri port map(a_in=>address_counter_q(14), oe=>drive_outputs, a_out=>a(14));  
u23 :  tri port map(a_in=>address_counter_q(13), oe=>drive_outputs, a_out=>a(13));  
u24 :  tri port map(a_in=>address_counter_q(12), oe=>drive_outputs, a_out=>a(12));  
u25 :  tri port map(a_in=>address_counter_q(11), oe=>drive_outputs, a_out=>a(11));  
u26 :  tri port map(a_in=>address_counter_q(10), oe=>drive_outputs, a_out=>a(10));  
u27 :  tri port map(a_in=>address_counter_q(9), oe=>drive_outputs, a_out=>a(9));  
u28 :  tri port map(a_in=>address_counter_q(8), oe=>drive_outputs, a_out=>a(8));  
u29 :  tri port map(a_in=>address_counter_q(7), oe=>drive_outputs, a_out=>a(7));  
u30 :  tri port map(a_in=>address_counter_q(6), oe=>drive_outputs, a_out=>a(6));  
u31 :  tri port map(a_in=>address_counter_q(5), oe=>drive_outputs, a_out=>a(5));  
u32 :  tri port map(a_in=>address_counter_q(4), oe=>drive_outputs, a_out=>a(4));
u33 :  tri port map(a_in=>address_counter_q(3), oe=>drive_outputs, a_out=>a(3));  
u34 :  tri port map(a_in=>address_counter_q(2), oe=>drive_outputs, a_out=>a(2));  
u35 :  tri port map(a_in=>address_counter_q(1), oe=>drive_outputs, a_out=>a(1));  
u36 :  tri port map(a_in=>address_counter_q(0), oe=>drive_outputs, a_out=>a(0));      

u37 :  tri port map(a_in=>'0', oe=>drive_outputs, a_out=>flash_cs_n);  
u38 :  tri port map(a_in=>'0', oe=>drive_outputs, a_out=>flash_oe_n); 
u39 :  tri port map(a_in=>'1', oe=>drive_outputs, a_out=>flash_rw_n); 
u40 :  tri port map(a_in=>dclkq3_stcntg, oe=>drive_outputs, a_out=>DCLK); 
u41 :  tri port map(a_in=>data0, oe=>drive_outputs, a_out=>pld_data0); 
u42 :  tri port map(a_in=>'0', oe=>not_config_n_reg_q, a_out=>config_n); 

END ARCHITECTURE config;

⌨️ 快捷键说明

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