32 / 37 · प्रयोग
एकीकृत अभ्यास: आवर्ती पल्स और enable संचायक
पुराने मान से मॉड्यूल हस्तांतरण तय करें और विराम, लगातार पल्स तथा साथ रीसेट जाँचें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
जोड़ने से पहले कनेक्शन तय करें
enable=1 वाले हर बढ़ते किनारे पर बिना चिह्न चार-बिट sample स्वीकार करें। हर N स्वीकार sample पर रजिस्टर वाला pulse बने। संचायक अगले बढ़ते किनारे पर pulse और उसका सुरक्षित sample लेता है, तब enable=0 होने पर भी। आठ-बिट total modulo 256 घूमता है। सिंक्रोनस रीसेट चरण साफ करता और लंबित sample हटाता है। एक किनारे का विलंब अनुबंध है: संचायक पुराने pulse/saved_sample पढ़ता है, उसी किनारे बने नए नॉनब्लॉकिंग मान नहीं। modulo_tick.sv और यह periodic_accumulator.sv रखें; N धनात्मक है।
module periodic_accumulator #(parameter integer N = 3) (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic pulse,
output logic [7:0] total
);
localparam integer CW = (N <= 1) ? 1 : $clog2(N);
wire [CW-1:0] count;
logic [3:0] saved_sample;
modulo_tick #(.N(N)) tick_u (
.clk(clk), .rst(rst), .enable(enable),
.count(count), .pulse(pulse)
);
always_ff @(posedge clk) begin
if (rst) saved_sample <= 4'b0;
else if (enable) saved_sample <= sample;
end
always_ff @(posedge clk) begin
if (rst) total <= 8'b0;
else if (pulse) total <= total + {4'b0, saved_sample};
end
endmoduleडेटा और घटना साथ देखें
N=3, इनपुट किनारे से पहले और आउटपुट बाद में हैं।
| किनारा | rst | enable | sample | बाद में pulse | बाद में total |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 0 | 0 |
| E1 | 0 | 1 | 2 | 0 | 0 |
| E2 | 0 | 1 | 4 | 0 | 0 |
| E3 | 0 | 1 | 7 | 1 | 0 |
| E4 | 0 | 0 | 9 | 0 | 7 |
| E5 | 0 | 1 | 1 | 0 | 7 |
| E6 | 0 | 1 | 3 | 0 | 7 |
| E7 | 0 | 1 | 5 | 1 | 7 |
| E8 | 1 | 1 | 15 | 0 | 0 |
E4 पर 7 जुड़ता है, बाहरी sample=9 नहीं। enable केवल नई स्वीकृति नियंत्रित करता है, लंबित घटना नहीं मिटाता। E8 पर 5 हटता और total साफ होता है। उपयोग में enable && pulse लगाने से E4 खो जाएगा।
सिस्टम सीमा पर संदर्भ
स्वीकार संख्या, वैकल्पिक लंबित मान और पूर्णांक total रखें। बिना रीसेट वाले किनारे पर पहले पुराना लंबित मान modulo 256 जोड़ें; फिर वर्तमान enable/sample से Nवीं स्वीकृति पर नया लंबित मान बनाएँ। रीसेट सब साफ करता है। tick_u.count या saved_sample न पढ़ें। गिरते किनारे पर उत्तेजना दें और बाद में pulse, total, घटना बिना रुकना तथा उपयोग हो चुका मान हटना जाँचें।
जोड़ने की त्रुटियाँ कवर करें
- N=1 लगातार पल्स देता है: हर sample अगले किनारे पर ठीक एक बार उपयोग हो।
- N=3 में अंतिम sample से पहले/बाद विराम: स्वीकृति गिनें, हर क्लॉक नहीं।
- enable=0 पर लंबित डेटा लेते समय बाहरी sample बदलें: सुरक्षित मान ही लें।
- लंबित घटना के साथ रीसेट घटना और total हटाए।
- 255 से अधिक जोड़कर modulo 256 जाँचें।
saved_sample की जगह sample रखें: E4 विफल होना चाहिए। उपयोग को enable से रोकें और दूसरी त्रुटि पकड़ें। PASS से पहले स्रोत बहाल करें। जाँचा अनुबंध कार्यात्मक, एक क्लॉक और सीमित चौड़ाई का है; यह CDC, भौतिक timing closure या DDS के मुफ़्त उत्पाद अभ्यास का प्रमाण नहीं।