下面是我的epp代码,很简单,通过pc机程序控制led亮和灭。附件有份并口资料和我自己的一点总结及本代码的状态机
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 16:57:05 10/24/05
// Design Name:
// Module Name: EPP_and_LED
// Project Name:
// Target Device:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////
module EPP_and_LED(Write, Data,Interrupt, Wait, DataStrobe, Reset, AddressStrobe,rst,led,clk/*,t1,t2,t3,t4*/);
input Write;
inout [7:0] Data;
output Interrupt;
output Wait;
input DataStrobe;
input Reset;
input AddressStrobe;
wire [7:0] Data;
/* output t1,t2,t3,t4; //测试信号,用于map到测试用的跳线
wire t1,t2,t3,t4; */
input clk;//input clock 24M
reg Wait,Interrupt;
input rst;//reset switch ,reference PCB,active low
output led;//led control,1 to switch led on
reg led;
parameter Idle=3'b000, Wait_End_AddrWrite=3'b001, Wait_End_AddrRead=3'b010,
Wait_End_DataWrite=3'b011, Wait_End_DataRead=3'b100;
//EPP state machine,reference EPP specification
//internal reg
reg [2:0] state;
reg [7:0] addr; //用于存储EPP地址写
reg [7:0] datain;//用于存储EPP数据写
reg [7:0] dataout; //用于向EPP Data 输出,可以是数据或者地址
always @ (posedge clk)
if((!rst)|| (!Reset)) //on PCB rst or Rest from EPP
begin
state<=Idle;
addr<=0;
datain<=0;
dataout<=0;
led<=1;
Wait<=0;
Interrupt<=0;
end
else //state machine
begin
led<=datain[0];
case(state)
Idle: begin
Wait<=0;
state<=Idle;
if(AddressStrobe==0)
begin
if(Write==1)
begin
//put address in Data bus here
dataout<=8'b1011_1111;
Wait<=1;
state<=Wait_End_AddrRead;
end
else if(Write==0)
begin
addr<=Data;
Wait<=1;
state<=Wait_End_AddrWrite;
end
end
else if(DataStrobe==0)
begin
if(Write==1)
begin
//put data in Data bus here
dataout<=8'b1111_1011;
Wait<=1;
state<=Wait_End_DataRead;
end
else if(Write==0)
begin
datain<=Data;
Wait<=1;
state<=Wait_End_DataWrite;
end
end
end
Wait_End_AddrRead:begin
if(AddressStrobe==1)
begin
Wait<=0;
state<=Idle;
end
end
Wait_End_AddrWrite:begin
if(AddressStrobe==1)
begin
Wait<=0;
state<=Idle;
end
end
Wait_End_DataRead:begin
if(DataStrobe==1)
begin
Wait<=0;
state<=Idle;
end
end
Wait_End_DataWrite:begin
if(DataStrobe==1)
begin
Wait<=0;
state<=Idle;
end
end
default: state<=Idle;
endcase
end
assign Data[7:0]=((state==Wait_End_DataRead)||(state==Wait_End_AddrRead))? dataout[7:0]:8'bz;
/*assign t1=Write;
assign t2=DataStrobe;
assign t3=Wait;
assign t4=dataout[0]; */
endmodule