verilog
प्रक्रियात्मक ब्लॉक
खोज…
वाक्य - विन्यास
- हमेशा @ (posedge clk) शुरू / * कथन * / अंत
- हमेशा @ (बदला हुआ clk) शुरू होता है / * कथन * / अंत
- हमेशा @ (posedge clk या posedge reset) // सिंक्रोनस रीसेट की तुलना में कम कुशलता से संश्लेषित कर सकता है
सरल काउंटर
एक FPGA शैली फ्लिप-फ्लॉप आरंभीकरण का उपयोग कर एक काउंटर:
module counter(
input clk,
output reg[7:0] count
)
initial count = 0;
always @ (posedge clk) begin
count <= count + 1'b1;
end
ASIC संश्लेषण के लिए उपयुक्त अतुल्यकालिक रीसेट का उपयोग करके लागू किया गया एक काउंटर:
module counter(
input clk,
input rst_n, // Active-low reset
output reg [7:0] count
)
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) begin
count <= 'b0;
end
else begin
count <= count + 1'b1;
end
end
इन उदाहरणों में प्रक्रियात्मक अवरोध हर बढ़ते घड़ी के किनारे पर count
जाते हैं।
गैर-अवरुद्ध कार्य
एक गैर-ब्लॉकिंग असाइनमेंट ( <=
) का उपयोग एज-सेंसिटिव always
ब्लॉक के अंदर असाइनमेंट के लिए किया जाता है। एक ब्लॉक के भीतर, पूरे ब्लॉक को संसाधित किए जाने तक नए मान दिखाई नहीं देते हैं। उदाहरण के लिए:
module flip(
input clk,
input reset
)
reg f1;
reg f2;
always @ (posedge clk) begin
if (reset) begin // synchronous reset
f1 <= 0;
f2 <= 1;
end
else begin
f1 <= f2;
f2 <= f1;
end
end
endmodule
यहां गैर-अवरोधक ( <=
) असाइनमेंट के उपयोग पर ध्यान दें। चूंकि पहला असाइनमेंट वास्तव में प्रक्रियात्मक ब्लॉक के बाद तक प्रभावी नहीं होता है, दूसरा असाइनमेंट वह करता है जो वास्तव में इरादा है और वास्तव में दो चर को स्वैप करता है - एक अवरुद्ध असाइनमेंट ( =
) या अन्य भाषाओं में असाइनमेंट के विपरीत; ब्लॉक में दूसरे असाइनमेंट के दाईं ओर f1
अभी भी मूल मूल्य है।