15 / 24 · प्रयोग
प्रयोगशाला: विराम में सुरक्षित विंडो
इसके बदले चक्र शून्य,एक,दो रुके और अंततः सभी इनपुट स्वीकार हों तो विंडो मान या संख्या बदलती है? कुल चक्र कितने?
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
लक्ष्य और निष्पादन
क्रमिक इनपुट से 3×3 विंडो बनाएँ और जाँचें कि विराम मान तथा क्रम रखता है। window-lab.mjs बनाएँ, कोड नकल करें और node window-lab.mjs चलाएँ। Node.js चाहिए, पैकेज नहीं। स्थापित Digital Design Studio के समर्थित फ़ाइल कार्यप्रवाह से वही फ़ाइल स्वयं बना और देख सकते हैं। इससे DDS में निष्पादन या स्वचालित दूरस्थ परियोजना निर्माण स्थापित नहीं होता।
मॉडल केवल स्वीकार इनपुट रोकता है। पूरा output-ready प्रोटोकॉल, मेमोरी बस, पैडिंग, डाइलेशन या बहुचैनल इंजन नहीं। stalls प्रविष्टियाँ बीते चक्र और accepted इनपुट स्थान हैं। इन्हें अलग रखना अभ्यास का लक्ष्य है। विराम बफ़र, विंडो और इनपुट सूचकांक नहीं बदलता।
अपेक्षित उदाहरण
एक से सोलह को चौड़ाई चार मानें। पहली सामान्य विंडो acceptedIndex दस और [1,2,3,5,6,7,9,10,11] है। विंडो सूचकांक [10,11,14,15]। सामान्य निष्पादन सोलह चक्र। चक्र दो, तीन और बारह रोकने से उन्नीस चक्र और पहली विंडो चक्र तेरह में है। स्वीकार इनपुट सूचकांक दस रहता है। समय बदलता है; सामग्री और क्रम नहीं।
बताए सत्रह भंडारण नमूने आठ पंक्ति विलंब और नौ विंडो स्थान हैं। JavaScript सरणी संश्लेषित SRAM बाइट या क्षेत्रफल नहीं मापती। असीम windows लॉग सत्यापन रिकॉर्ड है, सीमित हार्डवेयर कतार नहीं।
पहले मूल assertions चलाएँ। अस्थायी रूप से विराम में accepted बढ़ाएँ और मान तुलना विफल देखें, फिर कोड लौटाएँ। पंक्ति आरंभ सफ़ाई हटाकर शुरुआती स्तंभ आउटपुट देने से अलग पंक्तियों के स्तंभ मिलेंगे। वैधता और स्थिति वृद्धि साथ जाँचें।
सीधे कन्वोल्यूशन से तुलना में हर विंडो का उसी समतल कर्नेल से डॉट प्रोडक्ट करें और स्थानिक क्रम में मोड़ें। स्वचालित तुलना से पहले पहली विंडो हाथ से जाँचें। प्रमाण में विन्यास, स्वीकार सूचकांक और बीते चक्र रखें ताकि रन दोहर सके।
चलने योग्य फ़ाइल
import assert from 'node:assert/strict';
// Two row delays plus three horizontal shift registers: valid 3x3, one channel.
export function streamWindows(pixels, width, stalls = new Set()) {
const previous = Array(width).fill(0), older = Array(width).fill(0);
const window = Array.from({length: 3}, () => Array(3).fill(0));
const windows = []; let accepted = 0, cycles = 0;
while (accepted < pixels.length) {
if (stalls.has(cycles++)) continue;
const row = Math.floor(accepted / width), col = accepted % width;
if (col === 0) window.forEach(r => r.fill(0));
const current = pixels[accepted];
[older[col], previous[col], current].forEach((v, r) => {window[r].shift(); window[r].push(v);});
older[col] = previous[col]; previous[col] = current;
if (row >= 2 && col >= 2) windows.push({acceptedIndex: accepted, cycle: cycles - 1, values: window.flat()});
accepted++;
}
return {windows, accepted, cycles, storageSamples: 2 * width + 9};
}
const pixels = Array.from({length: 16}, (_, i) => i + 1);
const normal = streamWindows(pixels, 4);
const paused = streamWindows(pixels, 4, new Set([2, 3, 12]));
assert.deepEqual(normal.windows.map(w => w.acceptedIndex), [10, 11, 14, 15]);
assert.deepEqual(normal.windows[0].values, [1, 2, 3, 5, 6, 7, 9, 10, 11]);
assert.deepEqual(paused.windows.map(w => w.values), normal.windows.map(w => w.values));
assert.equal(paused.cycles, 19);
console.log(JSON.stringify({normal, paused}));RTL प्रयोगशाला:सीमित स्ट्रीमिंग विंडो
cnn_window3x3.sv,cnn_conv3x3.sv और tb_cnn_stream.sv संलग्न फ़ाइलें साथ सहेजें। संश्लेषण योग्य विंडो जनरेटर हर समकालिक सक्रिय-उच्च रीसेट पर एक पंक्ति-प्रधान 4×4 signed-int8 फ़्रेम स्वीकारता है। एक चैनल,बिना पैडिंग वैध 3×3,स्ट्राइड/डाइलेशन एक समर्थित हैं। उर्ध्व किनारे पर in_valid और in_ready दोनों उच्च हों तभी बढ़ें। विराम में इनपुट डेटा/valid रखें;रोकी आउटपुट विंडो भी स्थिर रहती है। अगले फ़्रेम से पहले रीसेट करें।
Icarus Verilog स्थापित होने पर बाहर चलाएँ:
iverilog -g2012 -s tb_cnn_stream -o cnn-sim cnn_window3x3.sv cnn_conv3x3.sv tb_cnn_stream.sv
vvp cnn-simस्वयं जाँच वाला बेंच हर विंडो के नौ नमूने और निर्देशांक,पंक्ति सीमाएँ,इनपुट/आउटपुट विराम,लंबित आउटपुट में रीसेट और फ़्रेम पूर्णता तुलना करता है। एक से सोलह इनपुट में निर्देशांक (0,0),(0,1),(1,0),(1,1) हैं। अंतिम PASS में frames=6,windows=24,outputs=24,kernels=2 और धनात्मक stalled_cycles हो। अपना वास्तविक लॉग जमा करें;न चलाया कमांड पास नहीं है। उपलब्ध हो तो समर्थित स्थापित DDS फ़ाइल कार्यप्रवाह में स्वयं देखें;DDS निष्पादन और संश्लेषण के अलग प्रमाण चाहिए।
बदलाव अभ्यास:पहला इनपुट दो करें,पहली विंडो हाथ से जाँचें और रुके आउटपुट की तरंग देखें। कई निम्न ready चक्रों में विंडो मान/क्रम सुरक्षित रहें। रजिस्टर विंडो चरण हटाने में नया बैकप्रेशर और स्थिति स्थिरता तर्क चाहिए।
खुद आज़माएँ
इसके बदले चक्र शून्य,एक,दो रुके और अंततः सभी इनपुट स्वीकार हों तो विंडो मान या संख्या बदलती है? कुल चक्र कितने?
व्याख्या पढ़ें
वही चार विंडो उसी क्रम में हैं। सोलह स्वीकार इनपुट और तीन विराम उन्नीस चक्र लेते हैं। स्वीकार सूचकांक तय हैं; बीता आगमन समय देर होता है।