Bài viết này trình bày một cách thiết kế bộ phân xử Round Robin (RR) với mức độ cân bằng quyền truy cập (được grant) cao. Bộ phân xử này giúp giữ nguyên mức ưu tiên cho các nguồn request đang giữ mức ưu tiên cao nhưng chưa được grant. Điều này giúp các nguồn chưa được grant luôn được ưu tiên hơn các nguồn đã được grant trước đó từ đó khắc phục nhược điểm của cách thiết kế trong bài 3 và bài 4.
Tác giả gửi lời cảm ơn đến anh Nguyễn Phú Quốc, một kỹ sư thiết kế vi mạch số, đã hỗ trợ giải thích ý tưởng cho cách thiết kế này.
1) Mô tả tổng quan thiết kế
Như đã trình bày trong bài 3 và bài 4, một nhược điểm lớn của hai cách thiết kế này là "sự cân bằng" trong việc cấp phát quyền truy cập không cao. Thiết kế trong bài này có nhiều mạch logic giống với bài 2.
Giải thuật Round Robin cân bằng gồm các thành phần sau:
2) Mô tả chi tiết thiết kế
Hình 1: Sơ đồ nguyên lý tổng quan của giải thuật Round Robin cân bằng |
- Priority level register: Thanh ghi lưu mức ưu tiên của nguồn request. Thanh ghi này sẽ thay đổi giá trị tùy vào sự cấp phát quyền truy cập hiện tại. Việc thay đổi giá trị thanh ghi sẽ làm thay đổi mức ưu tiên của nguồn request.
- Priority selection: Logic xác định mức ưu tiên của nguồn request và tạo ra các tín hiệu request phụ ứng với mức ưu tiên hiện tại.
- Asserted request check: Kiểm tra mức ưu tiên nào có request đang tích cực và nhóm các tín hiệu request phụ có cùng mức ưu tiên với nhau
- Request enable: Tạo tín hiệu cho phép lựa chọn nguồn request có mức ưu tiên cao nhất đang tích cực. Chỉ một tín hiện enable tích cực ở mạch logic này và tín hiệu này chỉ ra "mức ưu tiên nào" đang có request tích cực.
- Request mask: Che (mask) tất cả các tín hiệu request phụ sinh ra từ logic "ASSERTED REQUEST CHECK" bằng tín hiệu enable của sinh ra từ logic "REQUEST ENABLE". Ngõ ra của logic này chỉ còn duy nhất một request đang tích cực có mức ưu tiên cao nhất ở thời điểm hiện tại tích cực.
- Next grant: Tạo giá trị cập nhật lái ngõ ra grant cấp phát quyền truy cập cho nguồn request được chọn ở bước 5.
- Grant: Thanh ghi lưu giá trị cấp phát quyền truy cập hiện tại.
Các lưu ý quan trọng:
- Logic từ 2 đến 6 hoàn toàn chỉ là mạch tổ hợp.
- Ngõ vào của các nguồn request (req[REQ_NUM-1:0]) được đưa vào mạch logic số 2.
- Ngõ ra grant[REQ_NUM-1:0] là các Flip-Flop (FF) sinh ra từ logic số 7.
- Mạch logic 1 chỉ là thanh ghi nội, tựu động cập nhật giá trị để điều khiển logic 2.
Hoạt động của bộ phân xử RR này là sử dụng các thanh ghi quy định mức ưu tiên của các nguồn request. Một nguồn request có một thanh ghi với động rộng bit bằng logarit cơ số 2 của số nguồn request, tức là log2(REQ_NUM). Giá trị các thanh ghi này sẽ cập nhật tự động theo nguyên tắc sau:
- Thanh ghi mức ưu tiên của mỗi nguồn request được nạp một giá trị khởi tạo khác nhau khi reset.
- Mỗi giá trị đại diện cho một mức ưu tiên khác nhau
- Giá trị thanh ghi sẽ cập nhật sau mỗi lần phân xử. Nguồn request vừa được grant thì giá trị thanh ghi mức ưu tiên sẽ được thiết lập đến mức ưu tiên thấp nhất. Nguồn request có mức ưu tiên cao hơn nguồn request vừa được grant thì giá trị thanh ghi giữ nguyên. nguồn request có mức ưu tiên thấp hơn nguồn request vừa được grant thì giá trị thanh ghi được tăng lên mức ưu tiên cao hơn.
RTL code có thể hơi phức tạp nên tác giả sẽ trình bày mạch logic kèm RTL code tương ứng để bạn đọc có thể phân tích.
2.1) Thanh ghi mức ưu tiên (1)
Thanh ghi lưu giá trị ưu tiên của mỗi nguồn request là điểm khác biệt quan trọng so với các cách thiết kế trước.
Thanh ghi này có hoạt động như sau:
pReg[3:2] = 3 vì req[1] được grant nên nó bị chuyển về mức ưu tiên thấp nhất và nhường ưu tiên cao cho các nguồn khác chưa được grant. pReg[1:0] = 0 (giá trị không đổi) vì req[0] ưu tiên cao hơn req[1] nhưng chưa được grant nên mức ưu tiên được bảo toàn. pReg[5:4] và pReg[7:6] giảm 1 đơn vị vì req[2] và req[3] đang ưu tiên thấp hơn req[1] nên được tăng mức ưu tiên khi req[1] được grant.
Ví dụ 1: RTL code của pReg
Ví dụ 2: RTL code của mạch xác định giá trị ưu tiên của nguồn request sẽ được grant
2.2) Logic xác định mức ưu tiên (2)
Dựa trên giá trị mức ưu tiên của pReg, nếu nguồn request tích cực, nó sẽ làm tích cực một trong các bit ngõ ra levelReq của mạch này. Mỗi bit ngõ ra gọi là một request phụ.
Ví dụ 7: RTL code của logic tạo nextGrant
2.1) Thanh ghi mức ưu tiên (1)
Thanh ghi lưu giá trị ưu tiên của mỗi nguồn request là điểm khác biệt quan trọng so với các cách thiết kế trước.
Hình 2: Cấu trúc thanh ghi pReg lưu mức ưu tiên của các nguồn request |
- Reset đến một giá trị khởi tạo. Trong thiết kế này, giá trị 0 ứng với mức ưu tiên cao nhất, giá trị REQ_NUM-1 ứng với mức ưu tiên thấp nhất. Từ phải qua trái, giá trị reset của pReg ứng với mỗi nguồn request sẽ là 0, 1, 2, ..., REQ_NUM-1.
- Chỉ cập nhật giá trị mới tại thời điểm không có bất cứ grant nào (noGrant=1) và có ít nhất 1 nguồn đang request (một hoặc nhiều bit của tín hiệu req tích cực)
- Khi được phép cập nhật, giá trị cập nhật sẽ là một trong 2 giá trị sau:
- REQ_NUM - 1 nếu nguồn được grant. Đây là mức ưu tiên thấp nhất.
- "Giảm 1 đơn vị" nếu mức ưu tiên thấp hơn hoặc bằng mức ưu tiên của nguồn được grant, tức giá trị pReg lớn hơn hoặc bằng pReg của nguồn được grant.
- pReg[1:0] = 0 (mức ưu tiên cao nhất, dành cho req[0])
- pReg[3:2] = 1 (dành cho req[1])
- pReg[5:4] = 2 (dành cho req[2])
- pReg[7:6] = 3 (mức ưu tiên thấp nhất, dành cho req[3])
Giả sử, req[1] được grant, giá trị pReg như sau:
- pReg[1:0] = 0 (mức ưu tiên cao nhất, dành cho req[0])
- pReg[3:2] = 3 (mức ưu tiên thấp nhất, dành cho req[1])
- pReg[5:4] = 1 (dành cho req[2])
- pReg[7:6] = 2 (dành cho req[3])
Hình 3: Mạch nguyên lý của thanh ghi pReg |
generate
genvar i;
for (i = 0; i < REQ_NUM; i = i+1)
begin: pRegGen
always @ (posedge clk, negedge rst_n) begin
if (~rst_n)
pReg[COUNTER_W*(i+1)-1:i*COUNTER_W] <= i;
//Set to lowest priority level after granting
else if (updateP) begin
if (nextGrant[i])
pReg[COUNTER_W*(i+1)-1:i*COUNTER_W] <
= REQ_NUM - 1;
else if (pReg[COUNTER_W*(i+1)-1:i*COUNTER_W]
>= cPriorityLevel[COUNTER_W*REQ_NUM-1:
(REQ_NUM-1)*COUNTER_W])
//Increase the higher priority level
//by minusing 1
//if the current priority level
//is different from 0
pReg[COUNTER_W*(i+1)-1:i*COUNTER_W] <=
pReg[COUNTER_W*(i+1)-1:i*COUNTER_W] - 1;
end
end
end
endgenerate
Trong đó, bộ so sánh "lớn hơn hoặc bằng" trong hình trên sẽ lấy giá trị so sánh từ mạch logic xác định giá trị mức ưu tiên của nguồn request sẽ được grant.Hình 4: Mạch xác định giá trị ưu tiên của nguồn request sẽ được grant |
generate
genvar i0;
assign cPriorityLevel[COUNTER_W-1:0] =
nextGrant[0]?
pReg[COUNTER_W-1:0]:
{COUNTER_W{1'b0}};
for (i0 = 1; i0 < REQ_NUM; i0 = i0+1)
begin: cPValue
assign cPriorityLevel[COUNTER_W*(i0+1)-1:
i0*COUNTER_W]
= nextGrant[i0]?
pReg[COUNTER_W*(i0+1)-1:i0*COUNTER_W]
: cPriorityLevel[COUNTER_W*i0-1:
(i0-1)*COUNTER_W];
end
endgenerate
Giá trị dùng để so sánh chính là các bit MSB của cPriorityLevel (cPriorityLevel[COUNTER_W*REQ_NUM-1:(REQ_NUM-1)*COUNTER_W]). Vì mỗi thời điểm chỉ có 1 nguồn request được grant nên chỉ có 1 nextGrant tích cực. Điều này làm cho mạch logic trên chọn được giá trị mức ưu tiên của nguồn request sẽ được grant (nguồn có nextGrant bằng 1).Dựa trên giá trị mức ưu tiên của pReg, nếu nguồn request tích cực, nó sẽ làm tích cực một trong các bit ngõ ra levelReq của mạch này. Mỗi bit ngõ ra gọi là một request phụ.
Hình 5: Cấu trúc của tín hiệu request phụ levelReq |
Hình 6: Mạch nguyên lý tạo các tín hiệu request phụ cho các nguồn request |
Ví dụ, xem xét bộ DEMUX đầu tiên, ngõ vào của bộ DEMUX là nguồn req[0] và giá trị mức ưu tiên hiện tại của req[0] là pReg[COUNTER_W-1:0]. Tùy vào giá trị mức ưu tiên, có thể từ 0 đến REQ_NUM-1, mà req[0] sẽ được nối đến một ngbit ngõ ra levelReq. levelReq[REQ_NUM-1:0] là các tín hiệu request phụ của req[0]. Tại một thời điểm, chỉ một bit của tín hiệu này nối đến req[0] nên nếu req[0] tích cực thì cũng chỉ có một trong các bit của tín hiệu levelReq[REQ_NUM-1:0] tích cực.
Ví dụ 3: RTL code của logic tạo tín hiệu request phụ
generate
genvar j0;
genvar j1;
for (j0=0; j0 < REQ_NUM; j0=j0+1)
begin: reqSel
for (j1=0; j1 < REQ_NUM; j1=j1+1)
begin: selOut
//levelReq[*] is asserted if req[j0]
//asserted and the priority level
//is mapped
assign levelReq[j0*REQ_NUM+j1] =
req[j0] &
(pReg[COUNTER_W*(j0+1)-1:j0*COUNTER_W]
== j1);
end
end
endgenerate
2.3) Mạch kiểm tra request tích cực (3)
Nhóm các tín hiệu request phụ của tất cả các request theo mức ưu tiên bằng logic OR để xác định xem nhóm nào đang có request tích cực.
Hình 7: Mạch nguyên lý kiểm tra mức tích cực của các nhóm ưu tiên |
Ví dụ, REQ_NUM=4 ứng với 4 nguồn request, req[3:0], được sử dụng thì:
orAssertedReq[0] = levelReq[0] | levelReq[4] | levelReq[8] levelReq[12]
Các bit levelReq này là tín hiệu request phụ của các request khi mức ưu tiên của các request là 0. Khi OR các bit theo nhóm mức ưu tiên giúp xác định nhóm ưu tiên nào đang có request tích cực. Nhờ thôn tin này, các request sẽ được phân xử.
Ví dụ 4: RTL code của logic kiểm tra mức tích cực của các nhóm ưu tiên
generate
genvar k0;
for (k0=0; k0 < REQ_NUM; k0=k0+1)
begin: AChk
assign orAssertedReq[k0] =
orOut(levelReq[REQ_NUM*REQ_NUM-1:0],k0);
end
endgenerate
2.4) Tín hiệu enable cho mỗi nhóm request (4)
Tín hiệu enable được tạo để xác định nhóm request phụ (có request đang tích cực) nào sẽ được grant. Chỉ duy nhất 1 enable tích cực ở mạch logic này.
Hình 8: Mạch nguyên lý tạo tín hiệu cho phép reqEn |
Từ thông tin nhóm ưu tiên nào đang có request tích cực ở logic (3), logic này là mạch phân xử tạo ra tín hiệu cho phép request ở mức ưu tiên nào được phép grant. Nguyên tắc chung, nhóm request phụ có mức ưu tiên 0 (orAssertedReq[0]) được ưu tiên cao nhất, nhóm request phụ có mức ưu tiên REQ_NUM-1 (orAssertedReq[REQ_NUM-1]) có ưu tiên thấp nhất.
Ví dụ 5: Logic tạo tín hiệu cho phép xét theo mức ưu tiên
generate
genvar k1;
assign reqEn[0] = orAssertedReq[0];
for (k1=1; k1 < REQ_NUM; k1=k1+1)
begin: ReqEnable
assign reqEn[k1] = orAssertedReq[k1] &
~|orAssertedReq[k1-1:0];
end
endgenerate
2.5) Che các tín hiệu request phụ (5)
reqEn sẽ được sử dụng để che (mask) các bit request phụ trong mỗi nhóm levelReq. Chỉ bit request phụ đang tích cực có mức ưu tiên cao nhất được tích cực.
Hình 9: Mạch nguyên lý mask các bit request phụ của từng nguồn request |
Giả sử có 4 nguồn request, req[3:0], và mức ưu tiên của req[3] đến req[0] theo thứ tự từ 3 (thấp nhất) đến 0 (cao nhất). Lúc này, req[1] và req[2] tích cực (bằng 1), mức ưu tiên cao nhất đang có request tích cực là mức 1 nên chỉ có reqEn[1]=1. Khi reqEn[3:0] AND với các bit request phụ levelReq của các nguồn request thì chỉ có tín hiệu request phụ mức ưu tiên 1 được hoạt động, các request phụ mức ưu tiên 0, 2 và 3 bị che (mask) về 0. Cụ thể, trường hợp này:
Trong RTL code trên, k2a dùng để chọn nhóm tín hiệu request phụ, k2b dùng để chọn từng bit trong nhóm tín hiệu request phụ levelReq.
2.6) Tạo giá trị cập nhật tín hiệu grant (6)
Sau khi mask các bit của levelReq để tạo ra newGrant, để xác định một nguồn request có được grant hay không thì chỉ cần OR tất các bit newGrant của một nguồn request lại.
Chỉ một bit trong tín hiệu finalNewGrant tích cực để chỉ ra nguồn nào được grant. Tín hiệu này được đưa đến logic tạo giá trị để lái tín hiệu ngõ ra grant[REQ_NUM-1:0]. Logic này xem xét 2 trường hợp:
- newGrant[1] = levelReq[0] = 0 (vì req[0] không tích cực)
- newGrant[5] = levelReq[1] = 1 (vì req[1]=1 và req[0] không tích cực nên reqEn[1]=1)
- newGrant[9] = levelReq[2] = 0 (vì req[2]=1 nhưng mức ưu tiên thấp hơn req[1])
- newGrant[13] = levelReq[3]=0
generate
genvar k2a;
genvar k2b;
for (k2a=0; k2a < REQ_NUM; k2a=k2a+1)
begin: ReqMask
for (k2b=0; k2b < REQ_NUM; k2b=k2b+1)
begin: BitMask
assign newGrant[k2b+k2a*REQ_NUM] =
levelReq[k2b+k2a*REQ_NUM] & reqEn[k2b];
end
end
endgenerate
Trong RTL code trên, k2a dùng để chọn nhóm tín hiệu request phụ, k2b dùng để chọn từng bit trong nhóm tín hiệu request phụ levelReq.
2.6) Tạo giá trị cập nhật tín hiệu grant (6)
Sau khi mask các bit của levelReq để tạo ra newGrant, để xác định một nguồn request có được grant hay không thì chỉ cần OR tất các bit newGrant của một nguồn request lại.
Hình 10: Tín hiệu cho biết nguồn request nào sẽ được grant sau khi phân xử |
- Nếu không có bất kỳ nguồn nào đang được grant (noGrant=1) thì grant[REQ_NUM-1:0] cập nhật giá trị từ finalNewGrant[REQ_NUM-1:0]
- Nếu có một nguồn request đang được grant thì giá trị grant[REQ_NUM-1:0] giữ nguyên theo mức tích cực của request. Khi nào request hiện tại thôi tích cực, bằng 0, thì grant tương ứng cũng thôi tích cực và chuyển về trạng thái noGrant. %3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212354.500000000002%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212354.500000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%223%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212406.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212406.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%224%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212386.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212386.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%225%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212432%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212432%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%226%22%20value%3D%22MUX%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%23000000%3Balign%3Dcenter%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212334.5%22%20width%3D%2280%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%227%22%20value%3D%22%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%236600CC%3Balign%3Dright%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212374.5%22%20width%3D%2280%22%20height%3D%22130%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%228%22%20value%3D%220%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2212394.5%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%229%22%20value%3D%221%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2212454.5%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2210%22%20value%3D%22noGrant%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224886%22%20y%3D%2212314.5%22%20width%3D%2296%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2211%22%20value%3D%22%22%20style%3D%22shape%3Dor%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BstrokeColor%3D%23000000%3BstrokeWidth%3D3%3BfillColor%3D%23FFFFFF%3BfontSize%3D23%3BfontColor%3D%23FF0000%3Balign%3Dright%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224846%22%20y%3D%2212372.5%22%20width%3D%2240%22%20height%3D%2270%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2212%22%20value%3D%22%26lt%3Bdiv%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%26lt%3Bspan%26gt%3Bgrant%5B0%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%26lt%3B%2Fdiv%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224682%22%20y%3D%2212347%22%20width%3D%22144%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2213%22%20value%3D%22req%5B0%26lt%3Bspan%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224682%22%20y%3D%2212393%22%20width%3D%22144%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2214%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3BexitX%3D1.012%3BexitY%3D0.423%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3B%22%20edge%3D%221%22%20source%3D%227%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%225182%22%20y%3D%2212428.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225262.000000000002%22%20y%3D%2212428.000000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2215%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224732%22%20y%3D%2212479%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212477.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2216%22%20value%3D%22finalNewGrant%5B0%5D%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224762%22%20y%3D%2212450%22%20width%3D%22224%22%20height%3D%2223%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2217%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212590.500000000002%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212590.500000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2218%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212642.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212642.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2219%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212622.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212622.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2220%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212668.000000000002%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212668.000000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2221%22%20value%3D%22MUX%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%23000000%3Balign%3Dcenter%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212570.5%22%20width%3D%2280%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2222%22%20value%3D%22%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%236600CC%3Balign%3Dright%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212610.5%22%20width%3D%2280%22%20height%3D%22130%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2223%22%20value%3D%220%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2212630.5%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2224%22%20value%3D%221%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2212690.5%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2225%22%20value%3D%22noGrant%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224886%22%20y%3D%2212550.5%22%20width%3D%2296%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2226%22%20value%3D%22%22%20style%3D%22shape%3Dor%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BstrokeColor%3D%23000000%3BstrokeWidth%3D3%3BfillColor%3D%23FFFFFF%3BfontSize%3D23%3BfontColor%3D%23FF0000%3Balign%3Dright%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224846%22%20y%3D%2212608.5%22%20width%3D%2240%22%20height%3D%2270%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2227%22%20value%3D%22%26lt%3Bdiv%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%26lt%3Bspan%26gt%3Bgrant%5B1%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%26lt%3B%2Fdiv%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224682%22%20y%3D%2212583%22%20width%3D%22144%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2228%22%20value%3D%22req%5B1%26lt%3Bspan%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224682%22%20y%3D%2212629%22%20width%3D%22144%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2229%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3BexitX%3D1.012%3BexitY%3D0.432%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3B%22%20edge%3D%221%22%20source%3D%2222%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%225182%22%20y%3D%2212664.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225262.000000000002%22%20y%3D%2212664%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2230%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224732%22%20y%3D%2212715%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212713.499999999998%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2231%22%20value%3D%22finalNewGrant%5B1%5D%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224762%22%20y%3D%2212686%22%20width%3D%22224%22%20height%3D%2223%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2232%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2212960%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2212960%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2233%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224886%22%20y%3D%2213012%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2213012%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2234%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2212992%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2212992%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2235%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224730%22%20y%3D%2213037.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%224845.999999999998%22%20y%3D%2213037.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2236%22%20value%3D%22MUX%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%23000000%3Balign%3Dcenter%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212940%22%20width%3D%2280%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2237%22%20value%3D%22%22%20style%3D%22rounded%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfontSize%3D23%3BfontColor%3D%236600CC%3Balign%3Dright%3BstrokeWidth%3D3%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225002%22%20y%3D%2212980%22%20width%3D%2280%22%20height%3D%22130%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2238%22%20value%3D%220%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2213000%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2239%22%20value%3D%221%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225012%22%20y%3D%2213060%22%20width%3D%2260%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2240%22%20value%3D%22noGrant%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224886%22%20y%3D%2212920%22%20width%3D%2296%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2241%22%20value%3D%22%22%20style%3D%22shape%3Dor%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BstrokeColor%3D%23000000%3BstrokeWidth%3D3%3BfillColor%3D%23FFFFFF%3BfontSize%3D23%3BfontColor%3D%23FF0000%3Balign%3Dright%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224846%22%20y%3D%2212978%22%20width%3D%2240%22%20height%3D%2270%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2242%22%20value%3D%22%26lt%3Bdiv%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%26lt%3Bspan%26gt%3Bgrant%5B3%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%26lt%3B%2Fdiv%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224701%22%20y%3D%2212953%22%20width%3D%22125%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2243%22%20value%3D%22req%5B3%26lt%3Bspan%20style%3D%26quot%3Btext-align%3A%20left%26quot%3B%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224705%22%20y%3D%2212999%22%20width%3D%22121%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2244%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3BexitX%3D1.024%3BexitY%3D0.417%3BexitDx%3D0%3BexitDy%3D0%3BexitPerimeter%3D0%3B%22%20edge%3D%221%22%20source%3D%2237%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%225182%22%20y%3D%2213034%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225262.000000000002%22%20y%3D%2213033.5%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2245%22%20value%3D%22%22%20style%3D%22endArrow%3DblockThin%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D1%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%224732%22%20y%3D%2213084.5%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225002%22%20y%3D%2213083.000000000002%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2246%22%20value%3D%22finalNewGrant%5BREQ_NUM-1%5D%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dright%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224684%22%20y%3D%2213056%22%20width%3D%22302%22%20height%3D%2223%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2247%22%20value%3D%22%22%20style%3D%22endArrow%3Dnone%3Bhtml%3D1%3BstrokeWidth%3D3%3BfontSize%3D15%3BfontColor%3D%23FF0000%3BendFill%3D0%3Bdashed%3D1%3BstrokeColor%3D%236600CC%3Balign%3Dright%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%225041%22%20y%3D%2212900%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%225042%22%20y%3D%2212760.999999999998%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2248%22%20value%3D%22nextGrant%26lt%3Bspan%26gt%3B%5B0%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225095%22%20y%3D%2212390%22%20width%3D%22158%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2249%22%20value%3D%22nextGrant%26lt%3Bspan%26gt%3B%5B1%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225095%22%20y%3D%2212629%22%20width%3D%22158%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2250%22%20value%3D%22nextGrant%26lt%3Bbr%26gt%3B%26lt%3Bspan%26gt%3B%5BREQ_NUM-1%26lt%3B%2Fspan%26gt%3B%26lt%3Bspan%26gt%3B%5D%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D23%3BfontColor%3D%23000000%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%225095%22%20y%3D%2212965%22%20width%3D%22158%22%20height%3D%2260%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3CmxCell%20id%3D%2251%22%20value%3D%22%26lt%3Bfont%20style%3D%26quot%3Bfont-size%3A%2027px%26quot%3B%26gt%3Bvlsi%20technology%26lt%3B%2Ffont%26gt%3B%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3D%23FFFFCC%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D18%3BfontColor%3D%23FF0000%3BfontStyle%3D1%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%224700%22%20y%3D%2212794.5%22%20width%3D%22279%22%20height%3D%2255%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Hình 11: Tín hiệu nextGrant |
generate
genvar k3;
for (k3=0; k3 < REQ_NUM; k3=k3+1)
begin: FNewGrant
assign finalNewGrant[k3] =
|newGrant[REQ_NUM*(k3+1)-1:k3*REQ_NUM];
end
endgenerate
assign noGrant = ~|grant[REQ_NUM-1:0];
assign nextGrant[REQ_NUM-1:0] = noGrant?
finalNewGrant[REQ_NUM-1:0]:
grant[REQ_NUM-1:0] & req[REQ_NUM-1:0];
2.7) Thanh ghi grant (7)
Thanh ghi grant cập nhật giá trị từ nextGrant theo từng chu kỳ clock.
Ví dụ 8: RTL code của thanh ghi grant
Chú ý, RTL code có sử dụng 2 function đã được giải thích trong các bài viết trước, các bạn tham khảo lại các bài viết này.
Thanh ghi grant cập nhật giá trị từ nextGrant theo từng chu kỳ clock.
Hình 12: Thanh ghi grant và tín hiệu noGrant |
always @ (posedge clk, negedge rst_n) begin
if (~rst_n)
grant[REQ_NUM-1:0] <= {REQ_NUM{1'b0}};
else
grant[REQ_NUM-1:0] <= nextGrant[REQ_NUM-1:0];
end
Chú ý, RTL code có sử dụng 2 function đã được giải thích trong các bài viết trước, các bạn tham khảo lại các bài viết này.
3) Kết quả mô phỏng và nhận xét
Sau đây là một waveform minh họa hoạt động của bộ arbiter trong bài viết này với REQ_NUM=4. Tác giả chỉ giải thích lần grant đầu tiên trong waveform, bạn đọc có thể tiếp tục phân tích để kiểm chứng và hiểu thêm.
Nhận xét, thiết kế này có độ cân bằng cao về khả năng cấp phát quyền truy cập khi gán mức ưu tiên thấp nhất cho nguồn request vừa được grant và làm cho các nguồn request chưa được grant có mức ưu tiên cao hơn. Như vậy, một nguồn request sẽ không được grant liên tiếp trừ khi các nguồn request có mức ưu tiên cao hơn nó không phát request.
Tuy nhiên, thiết kế này có tốn tài nguyên nhất so với các cách thiết kế trình bày trong các bài trước.
Dữ liệu có thể tải:
Source code trên GithubHình 13: Một waveform minh họa hoạt động của arbiter |
Tuy nhiên, thiết kế này có tốn tài nguyên nhất so với các cách thiết kế trình bày trong các bài trước.
Dữ liệu có thể tải:
Lịch sử cập nhật:
1) 2019.Aug.25 - Tạo lần đầu
0 bình luận:
Đăng nhận xét