📄 fpga_misc.v
字号:
//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 + -