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

📄 fpga_misc.v

📁 pci转local bus总线的应用
💻 V
📖 第 1 页 / 共 2 页
字号:
//FPGA片内寄存器、I2C、UART及其它

module fpga_misc (
//pci
	clock,reset_n,
	addr_in,data_in,data_out,cs_n,
	ready_n,l_cmdo,lt_framen,lt_ackn,lt_dxfrn,lt_tsr,
//rst	
reset_reg,dog_clear,  
dog_value,  
dog_cnt, 
led_reg, 
//int
	//int_out_n,int_in_n,
	int_mask,
    int_clear,
    int_state,
//time
    clk_25M,phy_ref,
//card information	
    sys_run,sys_alerm,sys_role,
    present_n,lc1_mod_type,lc2_mod_type,
    g1_status1,g1_status2,g1_status3,g1_status4,
    g2_status1,g2_status2,g2_status3,g2_status4,    
    f1_status1,f1_status2,f1_status3,f1_status4,
    f2_status1,f2_status2,f2_status3,f2_status4,
//I2C to card
	IIC_SCL,
    IIC_SDA,
//I2C to cpld
SFPIIC_SCL,
SFPIIC_SDA,
TRI_SFPIIC_SDA,
SFP_ADDRESS,
    err_cnt
	);


	input clock;
	input reset_n;
//Back end Interface from "pci_top"
	input [21:0] addr_in;
	input [31:0] data_in;
	output [31:0] data_out;
	input cs_n;
	output ready_n;
	inout [3:0] l_cmdo;
	input lt_framen;
	input lt_ackn;
	input lt_dxfrn;
	input [11:0] lt_tsr;
//Reset
output [15:0] int_mask;
output [15:0] int_clear;
input  [15:0] int_state;
input  [7:0]  dog_cnt;  
output [6:0]  reset_reg;
output        dog_clear; 
output [7:0]  dog_value; 
output [4:0]  led_reg;   // led_reg---{rsv,rsv,alarm_led,role_led,run_led}
reg    [6:0]  reset_reg; 
reg           dog_clear; 
reg    [7:0]  dog_value; 
reg    [15:0] int_mask;
reg    [15:0] int_clear;
reg    [4:0]  led_reg; 
//time 
    input  clk_25M;
    output phy_ref;
//card information	
    input [1:0]present_n;
    input [3:0]lc1_mod_type;
    input [3:0]lc2_mod_type;
    output g1_status1,g1_status2,g1_status3,g1_status4;
    output g2_status1,g2_status2,g2_status3,g2_status4;
    output f1_status1,f1_status2,f1_status3,f1_status4;
    output f2_status1,f2_status2,f2_status3,f2_status4;
	output sys_run;
	output sys_alerm;
	output sys_role;
//I2C to card
output IIC_SCL;            
inout  IIC_SDA;
reg  [15:0] IIC_DATA_IN;   
reg  IIC_ACCESS_INIT;     
reg  IIC_W_R;             
//reg  [2:0] IIC_ADDR;      
wire [7:0] IIC_DATA_OUT;  
wire IIC_ACCESS_BUSY;    
wire IIC_ACCESS_ERR; 
//I2C to cpld
output SFPIIC_SCL;            
inout  SFPIIC_SDA;            
output TRI_SFPIIC_SDA;
output [2:0] SFP_ADDRESS;
reg  [2:0] SFP_ADDRESS;                           
reg  [15:0] SFPIIC_DATA_IN;   
reg  SFPIIC_ACCESS_INIT;     
reg  SFPIIC_W_R;             
reg  [6:0] SFPSLAVE_ADDR;      //SFP module phy iic address = 1010110
                               //SFP module eeprom iic address = 1010000
wire [7:0] SFPIIC_DATA_OUT;  
wire SFPIIC_ACCESS_BUSY;    
wire SFPIIC_ACCESS_ERR;  
//interrupt
/*	input [15:0] int_in_n;
	output int_out_n;*/
    input err_cnt;

//Others
	reg ready_n;
//	reg [9:0] addr_in;
	reg [31:0] data_out;
	


/******************************************************************************/
	assign phy_ref = clk_25M;
/******************************************************************************/


	wire wr_n;
	assign wr_n = ((l_cmdo == 4'b0111) && !lt_framen) ? 1'b0 : 1'b1;
/******************************************************************************/
	

/******************************************************************************/
	reg [31:0] test_reg0;
	reg [31:0] test_reg1;
	reg [31:0] rst_out_reg_n;//Active low
//	reg [31:0] int_mask;//0-enable interrupt; 1-disable
	reg resetflag;//reset flag
	reg [7:0] ot_thr;//Overtime threshold
//	reg ser_xaui_sel;//1-XAUI_A;0-XAUI_B
//LEDs (Active Low)
	reg sys_alerm;
	reg sys_role;

//	reg [7:0] ot_thr;
//	input [31:0] err_cnt;//error counter
	
/***sys_run LED flash**********************************************************/
	reg sys_run_en;//LED-run enable (Active High)
	reg cnt_500ms;
	reg sys_run;
	reg [31:0] cnt_led;

always @(posedge clock or negedge reset_n)
	begin
	    if(!reset_n)
		begin
		    cnt_500ms <= 1'b0;
		    cnt_led <= 32'h0;
		    sys_run <= 1'b0;
		end
	    else
		begin
		    sys_run <= sys_run_en ? cnt_500ms : 1'b1;
		    if(cnt_led == 32'h00FE502B)//500ms(f=33.333MHz)
			begin
			    cnt_500ms <= ~ cnt_500ms;
			    cnt_led <= 32'h0;
			end
		    else cnt_led <= cnt_led + 1;
		end
	end
/******************************************************************************/
//i2c_cy1
/*	reg i2c1_no_ack;
	reg i2c1_ready;
	reg [7:0]i2c1_data_in;
	reg [7:0]i2c1_data_out;
	reg [6:0]i2c1_sa;//slave address
	reg i2c1_rw;//1---R; 0---W
	reg [7:0]i2c1_ra;//register address
	reg i2c1_ini;
//i2c_cy2
	reg i2c2_no_ack;
	reg i2c2_ready;
	reg [7:0]i2c2_data_in;
	reg [7:0]i2c2_data_out;
	reg [6:0]i2c2_sa;//slave address
	reg i2c2_rw;//1---R; 0---W
	reg [7:0]i2c2_ra;//register address
	reg i2c2_ini;
//i2c_eeprom
	reg i2c3_no_ack;
	reg i2c3_ready;
	reg [7:0]i2c3_data_in;
	reg [7:0]i2c3_data_out;
	reg [6:0]i2c3_sa;//slave address
	reg i2c3_rw;//1---R; 0---W
	reg [7:0]i2c3_ra;//register address
	reg i2c3_ini;  */
//i2c_cpld
/*	reg i2c_cpld_no_ack;
	reg i2c_cpld_ready;
	reg [7:0] i2c_cpld_data_in;
	reg [7:0] i2c_cpld_data_out;
	reg [6:0] i2c_cpld_sa;//slave address
	reg i2c_cpld_rw;//1---R; 0---W
	reg [7:0] i2c_cpld_ra;//register address
	reg i2c_cpld_ini;*/
	wire [1:0]present_n_reg;
	wire [3:0] lc1_mod_type_reg;
	wire [3:0] lc2_mod_type_reg;
	reg [7:0] g_status_reg;
	reg [7:0] f_status_reg;
	assign present_n_reg[0] = present_n[0];
	assign present_n_reg[1] = present_n[1];
    assign lc1_mod_type_reg[0] = lc1_mod_type[0];
    assign lc1_mod_type_reg[1] = lc1_mod_type[1];
    assign lc1_mod_type_reg[2] = lc1_mod_type[2];
    assign lc1_mod_type_reg[3] = lc1_mod_type[3];
    assign lc2_mod_type_reg[0] = lc2_mod_type[0];
    assign lc2_mod_type_reg[1] = lc2_mod_type[1];
    assign lc2_mod_type_reg[2] = lc2_mod_type[2];
    assign lc2_mod_type_reg[3] = lc2_mod_type[3];
	assign g1_status1 = g_status_reg[0];
	assign g1_status2 = g_status_reg[1];
	assign g1_status3 = g_status_reg[2];
	assign g1_status4 = g_status_reg[3];
	assign g2_status1 = g_status_reg[4];
	assign g2_status2 = g_status_reg[5];
	assign g2_status3 = g_status_reg[6];
	assign g2_status4 = g_status_reg[7];
	assign f1_status1 = f_status_reg[0];
	assign f1_status2 = f_status_reg[1];
	assign f1_status3 = f_status_reg[2];
	assign f1_status4 = f_status_reg[3];
	assign f2_status1 = f_status_reg[4];
	assign f2_status2 = f_status_reg[5];
	assign f2_status3 = f_status_reg[6];
	assign f2_status4 = f_status_reg[7];
/******************************************************************************/

/******************************************************************************/

/***FPGA_REG*******************************************************************/
/* 实际操作地址需左移两位
00H ---RW---> test_reg0 (0x12345678)
		//测试寄存器0,用以判断FPGA片内寄存器读写是否正常
01H ---RO---> 0x800Ecppv
		//800E---R8000E; c---卡类型; pp---端口数; v---版本号//卡类型:1---GE
02H ---RW---> reset
		//复位寄存器
03H ---RO---> interrupt
		//中断寄存器
04H ---RW---> interrupt mask
		//中断屏蔽寄存器
05H ---RW---> SerDes XAUI select [0]
		//背板XAUI通道选择,1---通道A; 0---通道B
06H ---RO---> VSC7324 read data ready (Active-Low) [0]
		//0---表明VSC7324数据就绪可以读取,用以取代延时方式,可大大提高效率
07H ---RW---> WatchDog (wdf[15],wden[14],wdi[13],wdval[6:0])
		//看门狗 wdf---看门狗复位标志位; wden---启动看门狗; wdi---喂狗; wdval---时间设置
08H ---RW---> system ok led enable[0]
		//面板“RUN”指示灯 1---闪亮
09H ---RW---> system alerm led [0]
		//面板“ALERM”指示灯 0---点亮
0AH ---RW---> system role led [0]
		//面板“CH”指示灯 0---点亮。 背板XAUI通道指示,亮---通道A; 灭---通道B。需软件配置
0BH ---RW---> I2C_reg_cy1
		//I2C接口操作寄存器
0CH ---RW---> I2C_reg_cy2
		//I2C接口操作寄存器
0DH ---RW---> I2C_reg_eeprom
		//I2C接口操作寄存器
0EH ---RW---> I2C_reg_backplane
		//I2C接口操作寄存器
0FH ---NA--->
10H ---NA--->
11H ---NA--->
12H ---NA--->
13H ---NA--->
14H ---NA--->
15H ---NA--->
16H ---NA--->
17H ---NA--->
18H ---NA--->
19H ---NA--->
1AH ---NA--->
1BH ---NA--->
1CH ---NA--->
1DH ---RW---> ot_thr
		//配置处理器接口等待pi_down_n信号的延时时间,默认值为32T(960ns)。
1EH ---RO---> ERROR counter
		//处理器接口读写操作超时错误计数
1FH ---RW---> test_reg1 (0x87654321)
		//测试寄存器1,用以判断FPGA片内寄存器读写是否正常

20H ---RW---> reset[0]	//同02H.0
21H ---RW---> reset[1]	//同02H.1
22H ---RW---> reset[2]	//同02H.2
23H ---RW---> reset[3]	//同02H.3
24H ---RW---> reset[4]	//同02H.4
25H ---RW---> reset[5]	//同02H.5
26H ---RW---> reset[6]	//同02H.6
27H ---RW---> reset[7]	//同02H.7
28H ---RW---> reset[8]	//同02H.8
29H ---RW---> reset[9]	//同02H.9
2aH ---RW---> reset[10]	//同02H.10
2bH ---RW---> reset[11]	//同02H.11
2cH ---RW---> reset[12]	//同02H.12
2dH ---RW---> reset[13]	//同02H.13
2eH ---RW---> reset[14]	//同02H.14
2fH ---RW---> reset[15]	//同02H.15

30H ---RO--->
31H ---RW---> bp_uart
		//暂未使用
32H ---RO---> bp_fan_alerm
		//背板风扇告警
33H ---RW---> bp_res[3:0]
		//背板保留信号
34H ---RO---> ga[3:0]
		//槽位地址
35H ---RO---> sys[2:1]
		//系统卡在位指示
36H ---RO---> slave[2:1]
		//冗余卡在位指示
37H ---RW--->
38H ---RW--->
39H ---RW--->
3aH ---RW--->
3bH ---RW--->
3cH ---RW--->
3dH ---RW--->
3eH ---RW--->
3fH ---RW--->

100H ---RO---> VSC7324 read data ready (Active-Low) [0]
		//0---表明VSC7324数据就绪可以读取,用以取代延时方式,可提高效率及准确性


*/
//FPGA_REG read/write state machine

	reg [2:0] cstate;

	parameter [2:0]
		IDLE 	= 3'b001,
		READ 	= 3'b010,
		WRITE	= 3'b100;

////////////////////////////////////////////////////////////////////////////////
always @(posedge clock or negedge reset_n)
	begin
	    if(!reset_n)
		begin
		    data_out[31:0] <= 32'h0;
		    ready_n <= 1'b1;
		    test_reg0 <= 32'h12345678;
		    test_reg1 <= 32'h87654321;
		    reset_reg <= 7'h7f;
			dog_clear <= 1'b1;
		    dog_value <= 8'h0;
		    int_mask <= 16'hffff;
		    int_clear <=16'hffff;
		    g_status_reg <= 8'hff;
		    f_status_reg <= 8'hff;
			led_reg   <= 5'b00111;// led_reg---{rsv,rsv,alarm_led,role_led,run_led}
		 // ser_xaui_sel <= 1'b1;
		 //   sys_run_en <= 1'b0;
		//    sys_alerm <= 1'b0;
		 //   sys_role <= 1'b0;
			IIC_DATA_IN <= 16'h0;
		    IIC_W_R <= 1'b0;
		   // IIC_ADDR <= 3'h0; 
		    IIC_ACCESS_INIT <= 1'b0; 
			SFPIIC_DATA_IN <= 16'h0;
		    SFPIIC_W_R <= 1'b0;
		    SFPSLAVE_ADDR <= 7'b1010110; 
		    SFPIIC_ACCESS_INIT <= 1'b0;  
		    SFP_ADDRESS <= 3'h0;
		 /* i2c_cpld_ini <= 1'b0;
		    i2c2_ini <= 1'b0;
		    i2c3_ini <= 1'b0;
		    i2c4_ini <= 1'b0; */
	//	    uart_tx_start <= 1'b0;
	//	    uart_data_rd <= 1'b0;
	//	    wdf <= 1'b0;
	//	    wden <= 1'b0;
	//	    wdi <= 1'b0;

⌨️ 快捷键说明

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