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

📄 para_mach_b.v

📁 8读8写SDRAM verilog 程序
💻 V
字号:
module para_mach_b(
				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;
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] 	&	(cur_ch_req ? ~((ch_sur==3'd0)& (ch_rw==1'b0)) : 1'b1);
assign	w_req_en[1]	=w_req_syn[1]	&	(cur_ch_req ? ~((ch_sur==3'd1)& (ch_rw==1'b0)) : 1'b1);
assign	w_req_en[2]	=w_req_syn[2]	&	(cur_ch_req ? ~((ch_sur==3'd2)& (ch_rw==1'b0)) : 1'b1);
assign	r_req_en[0]	=r_req_syn[0]	&	(cur_ch_req ? ~((ch_sur==3'd0)& (ch_rw==1'b1)) : 1'b1);
assign	r_req_en[1]	=r_req_syn[1]	&	(cur_ch_req ? ~((ch_sur==3'd1)& (ch_rw==1'b1)) : 1'b1);
assign	r_req_en[2]	=r_req_syn[2]	&	(cur_ch_req ? ~((ch_sur==3'd2)& (ch_rw==1'b1)) : 1'b1);
assign	r_req_en[3]	=r_req_syn[3]	&	(cur_ch_req ? ~((ch_sur==3'd3)& (ch_rw==1'b1)) : 1'b1);
assign	r_req_en[4]	=r_req_syn[4]	&	(cur_ch_req ? ~((ch_sur==3'd4)& (ch_rw==1'b1)) : 1'b1);
assign	r_req_en[5]	=r_req_syn[5]	&	(cur_ch_req ? ~((ch_sur==3'd5)& (ch_rw==1'b1)) : 1'b1);
assign	r_req_en[6]	=r_req_syn[6]	&	(cur_ch_req ? ~((ch_sur==3'd6)& (ch_rw==1'b1)) : 1'b1);
assign	r_req_en[7]	=r_req_syn[7]	&	(cur_ch_req ? ~((ch_sur==3'd7)& (ch_rw==1'b1)) : 1'b1);
assign	w_req_en[3]	=w_req_syn[3]	&	(cur_ch_req ? ~((ch_sur==3'd3)& (ch_rw==1'b0)) : 1'b1);
assign	w_req_en[4]	=w_req_syn[4]	&	(cur_ch_req ? ~((ch_sur==3'd4)& (ch_rw==1'b0)) : 1'b1);
assign	w_req_en[5]	=w_req_syn[5]	&	(cur_ch_req ? ~((ch_sur==3'd5)& (ch_rw==1'b0)) : 1'b1);
assign	w_req_en[6]	=w_req_syn[6]	&	(cur_ch_req ? ~((ch_sur==3'd6)& (ch_rw==1'b0)) : 1'b1);
assign	w_req_en[7]	=w_req_syn[7]	&	(cur_ch_req ? ~((ch_sur==3'd7)& (ch_rw==1'b0)) : 1'b1);
//-----------------------------读写信号--------------------------------------------------
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)
			mach<=WaitIdle;
		else
			mach<=LockStatus;
	end
	WaitIdle:begin
		if(ch_req || ch_ack)begin
			mach<=WaitIdle;
		end
		else begin
			LockData<=1'b1;
			mach<=FreshAddr;
		end
	end
	FreshAddr:begin
		ReqEn<=1'b1;
		LockData<=1'b0;
		mach<=SetReqEn;
	end
	SetReqEn:begin
		if(ch_req)begin
			ReqEn<=1'b0;
			mach<=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	LockData;
always @(posedge clk)
	LockData<=(mach==FreshAddr);
*/
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



⌨️ 快捷键说明

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