📄 para_mach_c.v
字号:
module para_mach_c(
clk,
wada,wadb,wadc,wadd,wade,wadf,wadg,wadh,
wreqa,wreqb,wreqc,wreqd,wreqe,wreqf,wreqg,wreqh,
wnuma,wnumb,wnumc,wnumd,wnume,wnumf,wnumg,wnumh,
wack,
rada,radb,radc,radd,rade,radf,radg,radh,
rreqa,rreqb,rreqc,rreqd,rreqe,rreqf,rreqg,rreqh,
rnuma,rnumb,rnumc,rnumd,rnume,rnumf,rnumg,rnumh,
rack,
w0sel,w1sel,w2sel,
ch_num,ch_rw,ch_addr,ch_ack,ch_req,ch_sur,
mach,
SelSur
);
input clk;
input [20:0] wada,wadb,wadc,wadd,wade,wadf,wadg,wadh;
input wreqa,wreqb,wreqc,wreqd,wreqe,wreqf,wreqg,wreqh;
input [7:0] wnuma,wnumb,wnumc,wnumd,wnume,wnumf,wnumg,wnumh;
output [7:0] wack;
input [20:0] rada,radb,radc,radd,rade,radf,radg,radh;
input rreqa,rreqb,rreqc,rreqd,rreqe,rreqf,rreqg,rreqh;
input [7:0] rnuma,rnumb,rnumc,rnumd,rnume,rnumf,rnumg,rnumh;
output [7:0] rack;
output [7:0] ch_num;
output [20:0] ch_addr;
output ch_rw;
output ch_req;
input ch_ack;
output [3:0] w0sel;
output [1:0] w1sel;
output w2sel;
output [2:0] ch_sur;
output [8:0] mach;
output [2:0] SelSur;
reg [7:0] wack,rack;
reg[7:0] Delay;
reg ReqEn;
parameter [8:0] LockStatus =9'h001,
PipeDelay =9'h002,
JudgeInt =9'h004,
WaitIdle =9'h008,
SetReqEn =9'h010,
FreshAddr =9'h020,
WaitAck =9'h040;
reg [8:0] mach;
reg [20:0] syn_rada,syn_radb,syn_radc,syn_radd,syn_rade,syn_radf,syn_radg,syn_radh;
reg [7:0] syn_rnuma,syn_rnumb,syn_rnumc,syn_rnumd,syn_rnume,syn_rnumf,syn_rnumg,syn_rnumh;
reg [20:0] syn_wada,syn_wadb,syn_wadc,syn_wadd,syn_wade,syn_wadf,syn_wadg,syn_wadh;
reg [7:0] syn_wnuma,syn_wnumb,syn_wnumc,syn_wnumd,syn_wnume,syn_wnumf,syn_wnumg,syn_wnumh;
wire [7:0] w_req_en,r_req_en;
wire SelRw;
wire[2:0] SelSur;
wire[20:0] SelAddr;
wire[3:0] SelW0Sel;
wire[1:0] SelW1Sel;
wire SelW2Sel;
wire req_exist;
reg [7:0] w_req_syn,r_req_syn;
reg cur_ch_req;
assign req_exist=((w_req_en | r_req_en)!=8'd0);
wire LockReq;
assign LockReq=(mach==LockStatus);
//----------------------------锁存中断信号------------------------------------------------------
always @(posedge clk)begin
if(LockReq)begin
cur_ch_req <=ch_req;
w_req_syn<={wreqh,wreqg,wreqf,wreqe,wreqd,wreqc,wreqb,wreqa };
r_req_syn<={rreqh,rreqg,rreqf,rreqe,rreqd,rreqc,rreqb,rreqa };
end
else begin
cur_ch_req <=cur_ch_req;
w_req_syn<=w_req_syn;
r_req_syn<=r_req_syn;
end
end
//---------------------------锁存地址数目信号--------------------------------------------------
assign w_req_en[0] =w_req_syn[0] ;
assign w_req_en[1] =w_req_syn[1] ;
assign w_req_en[2] =w_req_syn[2] ;
assign w_req_en[3] =w_req_syn[3] ;
assign w_req_en[4] =w_req_syn[4] ;
assign w_req_en[5] =w_req_syn[5] ;
assign w_req_en[6] =w_req_syn[6] ;
assign w_req_en[7] =w_req_syn[7] ;
assign r_req_en[0] =r_req_syn[0] ;
assign r_req_en[1] =r_req_syn[1] ;
assign r_req_en[2] =r_req_syn[2] ;
assign r_req_en[3] =r_req_syn[3] ;
assign r_req_en[4] =r_req_syn[4] ;
assign r_req_en[5] =r_req_syn[5] ;
assign r_req_en[6] =r_req_syn[6] ;
assign r_req_en[7] =r_req_syn[7] ;
//-----------------------------读写信号--------------------------------------------------
assign SelRw= r_req_en[0] ? 1'b1 : //gui0 read
( r_req_en[1] ? 1'b1 : //gui1 read
( w_req_en[0] ? 1'b0 : //pixel trans
( r_req_en[2] ? 1'b1 : //nios read
( w_req_en[1] ? 1'b0 : //nios write
( w_req_en[2] ? 1'b0 :
( r_req_en[3] ? 1'b1 :
( w_req_en[3] ? 1'b0 :
( w_req_en[4] ? 1'b0 :
( r_req_en[4] ? 1'b1 :
( r_req_en[5] ? 1'b1 :
( r_req_en[6] ? 1'b1 :
( r_req_en[7] ? 1'b1 :
( w_req_en[5] ? 1'b0 :
( w_req_en[6] ? 1'b0 :
( w_req_en[7] ? 1'b0 : 1'b1))))) )))))))) ));
//----------------------------通道信号--------------------------------------------------
assign SelSur= r_req_en[0] ? 3'd0 :
( r_req_en[1] ? 3'd1 :
( w_req_en[0] ? 3'd0 :
( r_req_en[2] ? 3'd2 :
( w_req_en[1] ? 3'd1 :
( w_req_en[2] ? 3'd2 :
( r_req_en[3] ? 3'd3 :
( w_req_en[3] ? 3'd3 :
( w_req_en[4] ? 3'd4 :
( r_req_en[4] ? 3'd4 :
( r_req_en[5] ? 3'd5 :
( r_req_en[6] ? 3'd6 :
( r_req_en[7] ? 3'd7 :
( w_req_en[5] ? 3'd5 :
( w_req_en[6] ? 3'd6 :
( w_req_en[7] ? 3'd7 : 3'd0))))) )))))))) ));
//--------------------------地址信号--------------------------------------------------
assign SelAddr=SelRw ?
(
((SelSur==3'd0) ? rada : 21'd0)
|((SelSur==3'd1) ? radb : 21'd0)
|((SelSur==3'd2) ? radc : 21'd0)
|((SelSur==3'd3) ? radd : 21'd0)
|((SelSur==3'd4) ? rade : 21'd0)
|((SelSur==3'd5) ? radf : 21'd0)
|((SelSur==3'd6) ? radg : 21'd0)
|((SelSur==3'd7) ? radh : 21'd0)
)
:
(
((SelSur==3'd0) ? wada : 21'd0)
|((SelSur==3'd1) ? wadb : 21'd0)
|((SelSur==3'd2) ? wadc : 21'd0)
|((SelSur==3'd3) ? wadd : 21'd0)
|((SelSur==3'd4) ? wade : 21'd0)
|((SelSur==3'd5) ? wadf : 21'd0)
|((SelSur==3'd6) ? wadg : 21'd0)
|((SelSur==3'd7) ? wadh : 21'd0)
);
//-----------------------写流水信号0-----------------------------------------------
assign SelW0Sel=
((SelSur==3'd0) ? 4'b0001 : 4'd0)
|((SelSur==3'd1) ? 4'b0000 : 4'd0)
|((SelSur==3'd2) ? 4'b0010 : 4'd0)
|((SelSur==3'd3) ? 4'b0000 : 4'd0)
|((SelSur==3'd4) ? 4'b0100 : 4'd0)
|((SelSur==3'd5) ? 4'b0000 : 4'd0)
|((SelSur==3'd6) ? 4'b1000 : 4'd0)
|((SelSur==3'd7) ? 4'b0000 : 4'd0);
//-----------------------写流水信号1-----------------------------------------------
assign SelW1Sel=
((SelSur==3'd0) ? 2'b01 : 2'b0)
|((SelSur==3'd1) ? 2'b01 : 2'b0)
|((SelSur==3'd2) ? 2'b00 : 2'b0)
|((SelSur==3'd3) ? 2'b00 : 2'b0)
|((SelSur==3'd4) ? 2'b10 : 2'b0)
|((SelSur==3'd5) ? 2'b10 : 2'b0)
|((SelSur==3'd6) ? 2'b00 : 2'b0)
|((SelSur==3'd7) ? 2'b00 : 2'b0);
//-----------------------写流水信号2-----------------------------------------------
assign SelW2Sel=
((SelSur==3'd0) ? 1'b1 : 1'b0)
|((SelSur==3'd1) ? 1'b1 : 1'b0)
|((SelSur==3'd2) ? 1'b1 : 1'b0)
|((SelSur==3'd3) ? 1'b1 : 1'b0)
|((SelSur==3'd4) ? 1'b0 : 1'b0)
|((SelSur==3'd5) ? 1'b0 : 1'b0)
|((SelSur==3'd6) ? 1'b0 : 1'b0)
|((SelSur==3'd7) ? 1'b0 : 1'b0);
//-----------------------写数目-----------------------------------------------
wire[7:0] SelNum;
assign SelNum= SelRw ?
(
((SelSur==3'd0) ? rnuma : 8'd0)
|((SelSur==3'd1) ? rnumb : 8'd0)
|((SelSur==3'd2) ? rnumc : 8'd0)
|((SelSur==3'd3) ? rnumd : 8'd0)
|((SelSur==3'd4) ? rnume : 8'd0)
|((SelSur==3'd5) ? rnumf : 8'd0)
|((SelSur==3'd6) ? rnumg : 8'd0)
|((SelSur==3'd7) ? rnumh : 8'd0)
)
:
(
((SelSur==3'd0) ? wnuma : 8'd0)
|((SelSur==3'd1) ? wnumb : 8'd0)
|((SelSur==3'd2) ? wnumc : 8'd0)
|((SelSur==3'd3) ? wnumd : 8'd0)
|((SelSur==3'd4) ? wnume : 8'd0)
|((SelSur==3'd5) ? wnumf : 8'd0)
|((SelSur==3'd6) ? wnumg : 8'd0)
|((SelSur==3'd7) ? wnumh : 8'd0)
);
//---------------------写应答--------------------------------------------------
always @(posedge clk)begin
wack[0]<=(ch_sur==3'd0) & ch_ack & ~ch_rw;
wack[1]<=(ch_sur==3'd1) & ch_ack & ~ch_rw;
wack[2]<=(ch_sur==3'd2) & ch_ack & ~ch_rw;
wack[3]<=(ch_sur==3'd3) & ch_ack & ~ch_rw;
wack[4]<=(ch_sur==3'd4) & ch_ack & ~ch_rw;
wack[5]<=(ch_sur==3'd5) & ch_ack & ~ch_rw;
wack[6]<=(ch_sur==3'd6) & ch_ack & ~ch_rw;
wack[7]<=(ch_sur==3'd7) & ch_ack & ~ch_rw;
end
//---------------------读应答-----------------------------------------------
always @(posedge clk)begin
rack[0]<=(ch_sur==3'd0) & ch_ack & ch_rw;
rack[1]<=(ch_sur==3'd1) & ch_ack & ch_rw;
rack[2]<=(ch_sur==3'd2) & ch_ack & ch_rw;
rack[3]<=(ch_sur==3'd3) & ch_ack & ch_rw;
rack[4]<=(ch_sur==3'd4) & ch_ack & ch_rw;
rack[5]<=(ch_sur==3'd5) & ch_ack & ch_rw;
rack[6]<=(ch_sur==3'd6) & ch_ack & ch_rw;
rack[7]<=(ch_sur==3'd7) & ch_ack & ch_rw;
end
reg [4:0] DelayA;
reg LockData;
always @(posedge clk)
if(mach==PipeDelay)
Delay<=Delay+8'd1;
else
Delay<=8'd0;
always @(posedge clk)
casex(mach)
LockStatus:begin
ReqEn<=1'b0;
LockData<=1'b0;
mach<=PipeDelay;
end
PipeDelay:begin
ReqEn<=1'b0;
if(Delay>=8'h8)
mach<=JudgeInt;
else
mach<=PipeDelay;
end
JudgeInt:begin
if(req_exist)begin
LockData<=1'b1;
mach<=FreshAddr;//WaitIdle;
end
else
mach<=LockStatus;
end
WaitIdle:begin
if(ch_req || ch_ack)begin
mach<=WaitIdle;
end
else begin
mach<=LockStatus;//FreshAddr;
end
end
FreshAddr:begin
ReqEn<=1'b1;
LockData<=1'b0;
mach<=SetReqEn;
end
SetReqEn:begin
if(ch_req)begin
ReqEn<=1'b0;
mach<=WaitIdle;//LockStatus;
end
else begin
ReqEn<=1'b1;
mach<=SetReqEn;
end
end
default:
mach<=LockStatus;
endcase
reg ch_req;
always @(posedge clk or posedge ch_ack)
if(ch_ack)
ch_req<=1'b0;
else
if(ReqEn)
ch_req<=1'b1;
else
ch_req<=ch_req;
reg ch_rw;
reg[20:0] ch_addr;
reg[7:0] ch_num;
reg[2:0] ch_sur;
reg [3:0] w0sel;
reg [1:0] w1sel;
reg w2sel;
always @(posedge clk)
if(LockData)begin
ch_sur <=SelSur;
ch_rw <=SelRw;
ch_addr <=SelAddr;
ch_num <=SelNum;
w0sel <=SelW0Sel;
w1sel <=SelW1Sel;
w2sel <=SelW2Sel;
end
else begin
ch_sur <=ch_sur;
ch_rw <=ch_rw;
ch_addr <=ch_addr;
ch_num <=ch_num;
w0sel <=w0sel;
w1sel <=w1sel;
w2sel <=w2sel;
end
endmodule
/*
module para_mach_c(
clk,
wada,wadb,wadc,wadd,wade,wadf,wadg,wadh,
wreqa,wreqb,wreqc,wreqd,wreqe,wreqf,wreqg,wreqh,
wnuma,wnumb,wnumc,wnumd,wnume,wnumf,wnumg,wnumh,
wack,
rada,radb,radc,radd,rade,radf,radg,radh,
rreqa,rreqb,rreqc,rreqd,rreqe,rreqf,rreqg,rreqh,
rnuma,rnumb,rnumc,rnumd,rnume,rnumf,rnumg,rnumh,
rack,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -