S.No.
|
Name
|
Direction
|
Width
|
Remark
|
1
|
Req_1
|
Input
|
1
|
Request for 1st user
|
2
|
Req_2
|
Input
|
1
|
Request for 2nd user
|
3
|
Req_3
|
Input
|
1
|
Request for 3rd user
|
4
|
Req_4
|
Input
|
1
|
Request for 4th user
|
5
|
Clk
|
Input
|
1
|
Clock signal
|
6
|
Rst_a
|
Input
|
1
|
Reset signal
|
7
|
Grant_1
|
Output
|
1
|
Grant for 1st user
|
8
|
Grant_2
|
Output
|
1
|
Grant for 2nd user
|
9
|
Grant_3
|
Output
|
1
|
Grant for 3rd user
|
10
|
Grant_4
|
Output
|
1
|
Grant for 4th user
|
The above design is a Priority Resolver circuit which gives priority to the requests of that user which was given grant the most earlier. In other way the user which was given grant most recently is given least priority. If the two requests have ,by chance, conflict in getting the grant, they will be issued the grant signal according to the following sequence:
req4 > req3 > req 2 > req1
module priority_resolver_new (grant,req,clk,rst_a); //----------input output port declaration output [3:0] grant; //granted user input [3:0] req; //requesting user input clk; //clock input rst_a; //asynchronous reset //---------internal signal declaration reg [6:0] count [3:0]; //counter for priority resolving reg [3:0] temp; reg [3:0] tmp_grant; reg [2:0] j; assign grant = tmp_grant; always @(posedge clk, posedge rst_a) begin if (rst_a) begin count[0]=7'b0; count[1]=7'b0; count[2]=7'b0; count[3]=7'b0; end else if (grant[0]) begin count[0]=0; count[1]=count[1]+1; count[2]=count[2]+1; count[3]=count[3]+1; end else if (grant[1]) begin count[0]=count[0]+1; count[1]=0; count[2]=count[2]+1; count[3]=count[3]+1; end else if (grant[2]) begin count[0]=count[0]+1; count[1]=count[1]+1; count[2]=0; count[3]=count[3]+1; end else if (grant[3]) begin count[0]=count[0]+1; count[1]=count[1]+1; count[2]=count[2]+1; count[3]=0; end end always @(posedge clk,posedge rst_a) begin if (rst_a) begin tmp_grant = 4'b0; end else if (count[0]==0&&count[1]==0&&count[2]==0&&count[3]==0)//intial contion priority req[0]>req[1]>req[3]>req[4] begin if (req[0]) begin tmp_grant[0]=1'b1; tmp_grant[3:1]=3'b0; end else if (req[1]) begin tmp_grant[0]=1'b0; tmp_grant[1]=1'b1; tmp_grant[2]=1'b0; tmp_grant[3]=1'b0; end else if (req[2]) begin tmp_grant[0]=1'b0; tmp_grant[1]=1'b0; tmp_grant[2]=1'b1; tmp_grant[3]=1'b0; end else if (req[3]) begin tmp_grant[0]=1'b0; tmp_grant[1]=1'b0; tmp_grant[2]=1'b0; tmp_grant[3]=1'b1; end end else if (!count[0]&&req[0]) //for req=0001 tmp_grant = 4'b0001; else if (!count[1]&&req[1]) //for req=0010 tmp_grant = 4'b0010; else if (!count[2]&&req[2]) //for req=0100 tmp_grant = 4'b0100; else if (!count[3]&&req[3]) //for req=1000 tmp_grant = 4'b1000; else begin tmp_grant = 4'b0; if (req[0]) temp=count[0]; else if (req[1]) temp=count[1]; else if (req[2]) temp=count[2]; else if (req[3]) temp=count[3]; for(j=3'b0;j<=3'b011;j=j+1) //for more than one req begin if (req[j]) if(temp<=count[j]) begin tmp_grant=0; temp=count[j]; tmp_grant[j]=1'b1; end else tmp_grant[j]=1'b0; else tmp_grant[j]=1'b0; end end end endmodule
No comments:
Post a Comment