54 / 63 · अवधारणा
बहु-चक्र unsigned shift-add गुणक
आंशिक गुणनफलों का संचयन W क्लॉक में बाँटें और स्वीकृति व पूर्णता का समय, अंतिम संचयन, चौड़ाई तथा अपरिवर्तनीय शर्त सत्यापित करें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
पूर्वज्ञान: अनुक्रमिक परिपथ, nonblockingnonblocking अनुक्रमिक RTL में <= द्वारा असाइनमेंट। दाईं ओर का मूल्यांकन कर अद्यतन निर्धारित करता है, जिससे उसी एज के रजिस्टर पुरानी अवस्था के आधार पर गणना करते हैं। और जानें असाइनमेंट, काउंटर, शिफ्ट और योजक समझना आवश्यक है।
कई क्लॉक में एक योजक दोबारा उपयोग करें
Unsignedunsigned बिट अनुक्रम को गैर-ऋणात्मक पूर्णांक मानने का नियम। n बिट की सीमा 0 से 2^n−1 है और वही बिट signed व्याख्या में अलग मान दे सकते हैं। और जानें W-बिट गुणा, गुणक B के प्रत्येक बिट द्वारा चुने गए आंशिक गुणनफलों का योग है।
सभी आंशिक गुणनफल एक साथ जोड़ने पर बहुत-सा जोड़ने का तर्क चाहिए। यहाँ एक योजक W बार उपयोग करते हैं। यह क्षेत्रफल और थ्रूपुट के बीच चुनाव है; RTL में लूप लिख देने से अपने आप बहु-चक्र परिपथ नहीं बनता। क्लॉक के बीच गणना की अवस्था रखने वाले रजिस्टररजिस्टर कई बिटों की अवस्था संग्रहित करता है। इस पाठ्यक्रम के तुल्यकालिक रजिस्टर निर्धारित इनपुट को क्लॉक एज पर संग्रहित करते हैं। और जानें और समाप्ति की शर्त चाहिए।
संचायक P की चौड़ाई 2W बिट, खिसकने वाले गुण्य M की भी 2W बिट और दाएँ खिसकने वाले गुणक Q की W बिट है। शुरू में P=0,M=zero-extend(A),Q=B रखें। हर कार्य क्लॉक में Q[0]=1 हो तो M को P में जोड़ें, M एक स्थान बाएँ और Q एक स्थान दाएँ खिसकाएँ।
W कार्य चरणों के बाद Q=0 और P पूरा गुणनफल है। 2W बिट पर्याप्त हैं, क्योंकि अधिकतम मान से छोटा है और unsigned आंशिक गुणनफल जोड़ते समय मध्यवर्ती P अंतिम गुणनफल से बड़ा नहीं होता।
A=13,B=11,W=4 में Q के निचले बिट क्रम से 1,1,0,1 हैं। P का क्रम 0→13→39→39→143 है और उपयोग होने वाले M मान 13→26→52→104 हैं। तीसरे कार्य में Q[0]=0 होने पर भी शिफ्ट और काउंटर की वृद्धि अवश्य होनी चाहिए।
हर स्तंभ अनुरोध कैप्चर या कार्य एज के ठीक बाद की अवस्था दिखाता है। पहला स्तंभ गणना से पहले आरंभीकरण है; उसके बाद के चार कार्य चरण हैं। तीसरे कार्य में Q का पुराना निचला बिट 0 है, इसलिए केवल P रुका रहता है; M और Q खिसकते हैं।
तरंगरूप डेटा देखें
| संकेत | तरंगरूप | बस मान |
|---|---|---|
| एज | 23452 | कैप्चर → काम1 → काम2 → काम3 → काम4 |
| एज के बाद P | 234.5 | 0 → 13 → 39 → 143 |
| एज के बाद M | 23452 | 13 → 26 → 52 → 104 → 208 |
| एज के बाद Q | 23452 | 11 → 5 → 2 → 1 → 0 |
| एज के बाद done | 0...1 |
पहले अनुरोध और पूरा होने का समय तय करें
नीचे का इंटरफेस idle में start=1 वाले उर्ध्वगामी एजउदयी किनारा (rising edge) क्लॉक के 0 से 1 होने का क्षण। यह CLK=1 के पूरे स्तर-अंतराल से अलग है। और जानें को अनुरोध की स्वीकृति मानता है। उस t0 एज पर केवल इनपुट रखे जाते हैं। t1 से tW तक W गणनाएँ होती हैं और tW के ठीक बाद product और done मान्य होते हैं। स्वीकृति से पूर्णता तक W क्लॉक अवधि हैं; आरंभिक एज गिनें तो W+1 एज दिखाई देते हैं।
busy=1 रहने तक start अनदेखा किया जाता है। पूर्णता के एज से ठीक पहले भी busy=1 है, इसलिए उस एज पर नया अनुरोध स्वीकार नहीं होता। अगला अनुरोध सबसे जल्दी tW+1 पर स्वीकार होगा; लगातार अनुरोधों का न्यूनतम स्वीकृति अंतराल W+1 अवधि है। start लगातार 1 रखने पर idle लौटने के अगले एज पर फिर शुरुआत होती है। अनुरोध देने वाला सामान्यतः स्वीकृति के समय के अनुरूप पल्स देता है।
module mul_iter #(parameter int W = 8) (
input logic clk, rst, start,
input logic [W-1:0] a, b,
output logic busy, done,
output logic [2*W-1:0] product
);
localparam int CW = (W <= 1) ? 1 : $clog2(W);
localparam logic [CW-1:0] LAST = CW'(W-1);
logic [CW-1:0] step;
logic [2*W-1:0] acc, m, next_acc;
logic [W-1:0] q;
assign next_acc = acc + (q[0] ? m : {2*W{1'b0}});
always_ff @(posedge clk) begin
if (rst) begin
busy <= 1'b0;
done <= 1'b0;
product <= '0;
acc <= '0;
m <= '0;
q <= '0;
step <= '0;
end else begin
done <= 1'b0;
if (!busy) begin
if (start) begin
busy <= 1'b1;
acc <= '0;
m <= {{W{1'b0}}, a};
q <= b;
step <= '0;
end
end else begin
acc <= next_acc;
m <= m << 1;
q <= q >> 1;
if (step == LAST) begin
product <= next_acc;
busy <= 1'b0;
done <= 1'b1;
end else begin
step <= step + 1'b1;
end
end
end
end
endmoduleW≥1 मानते हैं और W=1 पर शून्य-बिट काउंटर न बने, इसलिए CW कम से कम 1 है। Reset तुल्यकालिक, active-high है और चल रही गणना पर प्राथमिकता रखता है। अनुरोध के बाद बाहरी a,b बदलने पर भी संग्रहीत m,q से गणना होती है, इसलिए परिणाम नहीं बदलता। product केवल reset या पूर्णता पर बदलता है। done एक अवधि का पल्स है, परिणाम उपयोग होने तक बनाए रखा जाने वाला valid नहीं।
अंतिम असाइनमेंट product<=acc नहीं, product<=next_acc है। Nonblocking असाइनमेंट का दायाँ पक्ष अपडेट से पहले का मान पढ़ता है; इसलिए acc सीधे निकालने पर अंतिम गुणक बिट का आंशिक गुणनफल छूट जाएगा। इसी कारण q की शिफ्ट असाइनमेंट पहले लिखने पर भी next_acc वर्तमान Q[0] से निकलता है।
गणना की अपरिवर्तनीय शर्त और वास्तविक डिजाइन विकल्प
k कार्य चरणों के ठीक बाद यह संबंध बना रहता है:
Q को सम भाग और सबसे निचले बिट में बाँटकर दिखा सकते हैं कि अगले चरण में भी संबंध सुरक्षित है। k=W पर Q=0, इसलिए P=AB है। यह अपरिवर्तनीय शर्तअपरिवर्तनीय शर्त हर अनुमत निष्पादन में हमेशा सत्य रहने वाली शर्त। मसलन चार स्थान वाली FIFO में संग्रहित वस्तुओं की संख्या हमेशा 0 से 4 के बीच रहती है। और जानें, छोटे उदाहरण की तरंग देखने से अधिक स्पष्ट रूप से बताती है कि संचयन और शिफ्ट का क्रम सही क्यों है।
एक कार्य के निर्णायक समय-मार्ग में 2W-बिट योजक और इनपुट चयन हैं। गुणा का चिह्न हटा देने से परिपथ हमेशा छोटा या तेज नहीं हो जाता। FPGA के समर्पित DSP ब्लॉक, संश्लेषण परिणाम और अपेक्षित थ्रूपुटथ्रूपुट प्रति इकाई समय स्वीकार या पूर्ण किए जाने वाले कार्यों की संख्या। पाइपलाइन किसी एक कार्य का विलंब घटाए बिना भी थ्रूपुट बढ़ा सकती है। और जानें की साथ तुलना करें। यह मॉड्यूल early-exit, signed गणना या परिणाम का backpressure नहीं देता। परिणाम लेने वाला done न चूके, ऐसा अनुबंध आवश्यक है।
सत्यापन में 0,1,अधिकतम और ऐसा B शामिल करें जिसका केवल सबसे ऊपरी बिट 1 हो। Busy के दौरान start व इनपुट बदलना और reset द्वारा रद्द करना भी जाँचें। केवल ऊपरी बिट 1 वाला B विशेष रूप से अंतिम संचयन छूटने की गलती दिखाता है।
खुद आज़माएँ
W=4,A=9,B=10 की संक्रिया t0 पर स्वीकार होती है। t1–t4 के ठीक बाद acc,q,done निकालें और अगली स्वीकृति सबसे जल्दी किस एज पर हो सकती है, यह बताएँ। अंत में product<=acc लिखने पर कौन-सा मान निकलेगा?
व्याख्या पढ़ें
आरंभ में acc=0,m=9,q=1010 है। t1: निचला बिट 0 है, इसलिए acc=0,q=0101,done=0। t2: m=18 जोड़ने से acc=18,q=0010,done=0। t3: निचला बिट 0 है, इसलिए acc=18,q=0001,done=0। t4: m=72 जोड़ने से acc=90,q=0000,done=1,busy=0 और product=90। t4 एज के ठीक पहले busy=1 होने से start स्वीकार नहीं होता; अगली स्वीकृति सबसे जल्दी t5 एज पर हो सकती है। product<=acc लिखने पर nonblocking असाइनमेंट पुराना acc=18 पढ़ेगी और अंतिम आंशिक गुणनफल 72 छूटने से 18 निकलेगा।