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

📄 pcic.v

📁 DesignWave 2005 8 Verilog Example
💻 V
字号:

module PCIC (
	pc104_a ,pc104_d ,pc104_d_out ,pc104_smemw_n ,pc104_smemr_n ,pc104_iow_n ,
	pc104_ior_n ,pc104_reset_drv ,pc104_sysclk ,pc104_sbhe_n ,pc104_iochrdy_n ,
	pc104_irq3_n ,pc104_irq4_n ,pc104_irq5_n ,pc104_irq6_n ,pc104_irq7_n ,
	pc_wait_n ,pc_ireq_n ,pc_cd_n ,bus_en_req ,bus_en_n ,pc_ce1_n ,
	pc_ce2_n ,pc_we_n ,pc_oe_n ,pc_iord_n ,pc_iowr_n ,pc_reg_n ,
	pc_reset ,pc_a ,databuff_245_dir ,databuff_245_oe_n ,card_on_off
) ;

input	[23:0]	pc104_a ;
input	[7:0]	pc104_d ;
inout		pc104_d_out ;
input		pc104_smemw_n ;
input		pc104_smemr_n ;
input		pc104_iow_n ;
input		pc104_ior_n ;
input		pc104_reset_drv ;
input		pc104_sysclk ;
input		pc104_sbhe_n ;
output		pc104_iochrdy_n ;
output		pc104_irq3_n ;
output		pc104_irq4_n ;
output		pc104_irq5_n ;
output		pc104_irq6_n ;
output		pc104_irq7_n ;
input		pc_wait_n ;
input		pc_ireq_n ;
input		pc_cd_n ;
input		bus_en_req ;
output		bus_en_n ;
inout		pc_ce1_n ;
inout		pc_ce2_n ;
inout		pc_we_n ;
inout		pc_oe_n ;
inout		pc_iord_n ;
inout		pc_iowr_n ;
inout		pc_reg_n ;
inout		pc_reset ;
output	[8:0]	pc_a ;
output		databuff_245_dir ;
output		databuff_245_oe_n ;
output		card_on_off ;

reg	[4:0]	index_register ;
reg		card_on_off ;
reg		pc_card_reset ;
reg	[2:0]	irq_number ;
reg		io_windows ;
reg	[4:0]	window0start_lo ;
reg	[1:0]	window0start_hi ;
reg	[4:0]	window0stop_lo ;
reg	[1:0]	window0stop_hi ;
reg		reg_active ;
reg	[8:0]	card_offset ;

//**************************************************
//************ ADDRESS 3E0 3E1 DECOODER ************
//**************************************************
wire index_register_decood = ( pc104_a[9:0] == 10'b11_1110_0000 ) ; // ADDRESS 3E0
wire data_register_decood = ( pc104_a[9:0] == 10'b11_1110_0001 ) ;  // ADDRESS 3E1


//**************************************************
//************ ADDRESS 3E0 3E1 DATA LATCH **********
//**************************************************
//wire reg_clr = pc104_reset_drv | pc_cd_n ;
wire reg_clr = pc104_reset_drv ;
always @(posedge pc104_iow_n or posedge reg_clr ) begin
if ( reg_clr ) begin
	index_register[4:0] <= 0 ;
	card_on_off <= 0 ;
	pc_card_reset <= 1 ;
	irq_number[2:0] <= 0 ;
	io_windows <= 0 ;
	window0start_lo[4:0] <= 0 ;
	window0start_hi[1:0] <= 0 ;
	window0stop_lo[4:0] <= 0 ;
	window0stop_hi[1:0] <= 0 ;
	reg_active <= 1 ;
	card_offset[8:0] <= 0 ;
end
else begin
//INDEX REGISTER
	index_register[4:0] <= ( index_register_decood ) ? pc104_d[4:0]  : index_register ;
//POWER AND RESETDRV
	card_on_off <= ( data_register_decood &  ( index_register == 5'h02 )) ? pc104_d[4] : card_on_off ; //030724
//INTERRUPT AND GENERAL CONTROL
	pc_card_reset <= ( data_register_decood &  ( index_register == 5'h03 )) ? pc104_d[6] : pc_card_reset ;
	irq_number[2:0] <= ( data_register_decood &  ( index_register == 5'h03 )) ? pc104_d[2:0] : irq_number ;
//ADDRES WINDOW ENABLE
	io_windows <= ( data_register_decood &  ( index_register == 5'h06 )) ? pc104_d[6] : io_windows ;
//IO ADDRESSMAPPING START STOP
	window0start_lo[4:0] <= ( data_register_decood &  ( index_register == 5'h08 )) ? pc104_d[7:3] : window0start_lo ;
	window0start_hi[1:0] <= ( data_register_decood &  ( index_register == 5'h09 )) ? pc104_d[1:0] : window0start_hi ;
	window0stop_lo[4:0] <= ( data_register_decood &  ( index_register == 5'h0a )) ? pc104_d[7:3] : window0stop_lo ;
	window0stop_hi[1:0] <= ( data_register_decood &  ( index_register == 5'h0b )) ? pc104_d[1:0] : window0stop_hi ;
	reg_active <= ( data_register_decood &  ( index_register == 5'h15 )) ? pc104_d[6] : reg_active ;
//PC CARD MEM ADDRESS = { WINDOW ADDRESS 9BIT(019h=0C8h) , ISA ADDRESS 15 BIT } + CARD MEMORY OFFSET ADDRESS[25:15] )
//CARD MEMORY OFFSET ADDRESS[19:15]
	card_offset[4:0] <= ( data_register_decood &  ( index_register == 5'h14 )) ? pc104_d[7:3] : card_offset[4:0] ;
//CARD MEMORY OFFSET ADDRESS[25:20]
	card_offset[8:5] <= ( data_register_decood &  ( index_register == 5'h15 )) ? pc104_d[3:0] : card_offset[8:5] ;
end
end


//**************************************************
//************ OUTPUT DATA ENABLE ******************
//**************************************************
wire pc104_oe = data_register_decood & ~pc104_ior_n ;
assign pc104_d_out = ( pc104_oe )? ~pc_cd_n : 1'bz ;


//**************************************************
//************ PC104 => PC CARD  *******************
//**************************************************

// MEMRY EREA ADDRESS WINDOW 0x0C8
wire mem_window_comp = ( pc104_a[23:15] == 9'b000011010 ) ;  // ISA 0x0C8h ( 23:15 = 019h)

wire io_window_comp_sta_hi = ( window0start_hi == pc104_a[9:8] ) ;
wire io_window_comp_sta_lo = ( window0start_lo <= pc104_a[7:3] ) ;
wire io_window_comp_stp_hi = ( window0stop_hi == pc104_a[9:8] ) ;
wire io_window_comp_stp_lo = ( window0stop_lo >= pc104_a[7:3] ) ;

wire io_window_comp = io_window_comp_sta_hi & io_window_comp_sta_lo & io_window_comp_stp_hi & io_window_comp_stp_lo ;

wire pc_ce1_w_n = ~((( ~pc104_smemw_n | ~pc104_smemr_n ) & mem_window_comp )
                    | (( ~pc104_iow_n | ~pc104_ior_n ) & io_window_comp & io_windows )) ;

assign pc_ce1_n = ( ~bus_en_req )? pc_ce1_w_n : 1'bz ;
assign pc_ce2_n = ( ~bus_en_req )? ~( ~pc_ce1_w_n  & ~pc104_sbhe_n ) : 1'bz ;
assign pc_we_n = ( ~bus_en_req )? ~( ~pc_ce1_w_n  & ~pc104_smemw_n ) : 1'bz ;
assign pc_oe_n = ( ~bus_en_req )? ~( ~pc_ce1_w_n  & ~pc104_smemr_n ) : 1'bz ;
assign pc_iord_n = ( ~bus_en_req )? ~( ~pc_ce1_w_n  & ~pc104_ior_n ) : 1'bz ;
assign pc_iowr_n = ( ~bus_en_req )? ~( ~pc_ce1_w_n  & ~pc104_iow_n ) : 1'bz ;
assign pc_reg_n = ( ~bus_en_req )? ~(( ~pc_ce1_w_n  & reg_active ) | ~pc_iowr_n | ~pc_iowr_n ) : 1'bz ;
assign pc_reset = ( ~bus_en_req )? ~pc_card_reset | pc104_reset_drv : 1'bz ;


assign pc_a[8:0] = ( bus_en_req )? 9'bzzzzzzzzz : ( ~pc_iord_n | ~pc_iowr_n )? 0 : card_offset[8:0] ;
                     

//**************************************************
//************ PC CARD => PC104  *******************
//**************************************************
assign pc104_iochrdy_n = ( ~pc_wait_n & io_window_comp & ~bus_en_req )? 1'b0 : 1'bz ;
assign pc104_irq3_n = (( irq_number == 3 ) & ~bus_en_req & ~pc_ireq_n )? 1 : 0 ;
assign pc104_irq4_n = (( irq_number == 4 ) & ~bus_en_req & ~pc_ireq_n )? 1 : 0 ;
assign pc104_irq5_n = (( irq_number == 5 ) & ~bus_en_req & ~pc_ireq_n )? 1 : 0 ;
assign pc104_irq6_n = (( irq_number == 6 ) & ~bus_en_req & ~pc_ireq_n )? 1 : 0 ;
assign pc104_irq7_n = (( irq_number == 7 ) & ~bus_en_req & ~pc_ireq_n )? 1 : 0 ;

//**************************************************
//************ DATA BAS CONTROL(LVC245) ************
//**************************************************

assign databuff_245_dir = ( pc104_smemr_n & pc104_ior_n ) | bus_en_req ;
assign databuff_245_oe_n = ~( ~pc_ce1_w_n & ~bus_en_req ) ;
assign bus_en_n = bus_en_req ;

endmodule

⌨️ 快捷键说明

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