আমি এখনও আইআইআর ফিল্টারগুলির সাথে কাজ করি নি তবে আপনি যদি কেবলমাত্র প্রদত্ত সমীকরণ গণনা করতে চান
y[n] = y[n-1]*b1 + x[n]
প্রতি সিপিইউ চক্রের পরে, আপনি পাইপলাইন ব্যবহার করতে পারেন।
একটি চক্রের ক্ষেত্রে আপনি গুণ করতে পারেন এবং একটি চক্রের মধ্যে প্রতিটি ইনপুট নমুনার জন্য যোগফলগুলি আপনাকে করতে হবে। তার অর্থ যখন প্রদত্ত নমুনা হারে ক্লক করা থাকে তখন আপনার এফপিজিএ অবশ্যই একটি চক্রের গুণ করতে সক্ষম হতে পারে! তারপরে আপনাকে কেবলমাত্র বর্তমান নমুনার গুণন করতে হবে এবং সমান্তরালে শেষ নমুনার গুণটির ফলাফলের সংমিশ্রণ করতে হবে। এটি 2 টি চক্রের ধ্রুবক প্রক্রিয়াজাতকরণের পিছনে পড়বে।
ঠিক আছে, আসুন সূত্রটি দেখুন এবং একটি পাইপলাইন ডিজাইন করুন:
y[n] = y[n-1]*b1 + x[n]
আপনার পাইপলাইন কোডটি দেখতে দেখতে এটির মতো হতে পারে:
output <= last_output_times_b1 + last_input
last_output_times_b1 <= output * b1;
last_input <= input
নোট করুন যে তিনটি কমান্ড সমান্তরালভাবে কার্যকর করা দরকার এবং দ্বিতীয় লাইনে "আউটপুট" অতএব শেষ ঘড়ির চক্র থেকে আউটপুট ব্যবহার করে!
আমি ভেরিলোগের সাথে খুব বেশি কাজ করি নি, সুতরাং এই কোডটির বাক্য গঠনটি সম্ভবত ভুল (যেমন ইনপুট / আউটপুট সংকেতের বিট-প্রস্থ অনুপস্থিত; গুণনের জন্য এক্সিকিউশন সিনট্যাক্স)। তবে আপনার এই ধারণাটি পাওয়া উচিত:
module IIRFilter( clk, reset, x, b, y );
input clk, reset, x, b;
output y;
reg y, t, t2;
wire clk, reset, x, b;
always @ (posedge clk or posedge reset)
if (reset) begin
y <= 0;
t <= 0;
t2 <= 0;
end else begin
y <= t + t2;
t <= mult(y, b);
t2 <= x
end
endmodule
পিএস: হতে পারে কিছু অভিজ্ঞ ভেরিলোগ প্রোগ্রামার এই কোডটি সম্পাদনা করতে পারে এবং এই মন্তব্যটি এবং কোডের উপরে মন্তব্যটি পরে সরিয়ে ফেলতে পারে। ধন্যবাদ!
পিপিএস: যদি আপনার ফ্যাক্টর "বি 1" একটি স্থির ধ্রুবক হয় তবে আপনি একটি বিশেষ গুণক প্রয়োগ করে নকশাটি অনুকূল করতে সক্ষম হতে পারেন যা কেবলমাত্র একটি স্কেলার ইনপুট নেয় এবং কেবল "বার বি 1" গণনা করে।
এর প্রতিক্রিয়া: "দুর্ভাগ্যক্রমে, এটি আসলে y [n] = y [n-2] * b1 + x [n] এর সমতুল্য This অতিরিক্ত পাইপলাইন পর্যায়ের কারণে এটি।" উত্তরের পুরানো সংস্করণ হিসাবে মন্তব্য
হ্যাঁ, এটি নীচের পুরানো (প্রকৃত !!!) সংস্করণের জন্য সত্য ছিল:
always @ (posedge clk or posedge reset)
if (reset) begin
t <= 0;
end else begin
y <= t + x;
t <= mult(y, b);
end
আমি আশা করি দ্বিতীয় খাতাতেও ইনপুট মানগুলি বিলম্ব করে এই বাগটি এখনই সংশোধন করেছি:
always @ (posedge clk or posedge reset)
if (reset) begin
y <= 0;
t <= 0;
t2 <= 0;
end else begin
y <= t + t2;
t <= mult(y, b);
t2 <= x
end
এবার এটি সঠিকভাবে কাজ করে তা নিশ্চিত করার জন্য প্রথম কয়েকটি চক্রের ক্ষেত্রে কী ঘটে তা দেখা যাক। নোট করুন যে প্রথম 2 টি চক্র কম-বেশি (সংজ্ঞায়িত) আবর্জনা উত্পাদন করে, পূর্ববর্তী কোনও আউটপুট মান (যেমন y [-1] == ??) উপলভ্য নয়। Y রেজিস্টার 0 দিয়ে আরম্ভ করা হয়েছে যা y [-1] == 0 ধরে নেওয়ার সমতুল্য।
প্রথম চক্র (n = 0):
BEFORE: INPUT (x=x[0], b); REGISTERS (t=0, t2=0, y=0)
y <= t + t2; == 0
t <= mult(y, b); == y[-1] * b = 0
t2 <= x == x[0]
AFTERWARDS: REGISTERS (t=0, t2=x[0], y=0), OUTPUT: y[0]=0
দ্বিতীয় চক্র (n = 1):
BEFORE: INPUT (x=x[1], b); REGISTERS (t=0, t2=x[0], y=y[0])
y <= t + t2; == 0 + x[0]
t <= mult(y, b); == y[0] * b
t2 <= x == x[1]
AFTERWARDS: REGISTERS (t=y[0]*b, t2=x[1], y=x[0]), OUTPUT: y[1]=x[0]
তৃতীয় চক্র (n = 2):
BEFORE: INPUT (x=x[2], b); REGISTERS (t=y[0]*b, t2=x[1], y=y[1])
y <= t + t2; == y[0]*b + x[1]
t <= mult(y, b); == y[1] * b
t2 <= x == x[2]
AFTERWARDS: REGISTERS (t=y[1]*b, t2=x[2], y=y[0]*b+x[1]), OUTPUT: y[2]=y[0]*b+x[1]
চতুর্থ চক্র (n = 3):
BEFORE: INPUT (x=x[3], b); REGISTERS (t=y[1]*b, t2=x[2], y=y[2])
y <= t + t2; == y[1]*b + x[2]
t <= mult(y, b); == y[2] * b
t2 <= x == x[3]
AFTERWARDS: REGISTERS (t=y[2]*b, t2=x[3], y=y[1]*b+x[2]), OUTPUT: y[3]=y[1]*b+x[2]
আমরা দেখতে পাচ্ছি, সিলিস n = 2 দিয়ে শুরু করে আমরা নিম্নলিখিত আউটপুটটি পাই:
y[2]=y[0]*b+x[1]
y[3]=y[1]*b+x[2]
যা সমান
y[n]=y[n-2]*b + x[n-1]
y[n]=y[n-1-l]*b1 + x[n-l], where l = 1
y[n+l]=y[n-1]*b1 + x[n], where l = 1
উপরে উল্লিখিত হিসাবে আমরা l = 1 চক্রের অতিরিক্ত ল্যাগটি প্রবর্তন করি। এর অর্থ হ'ল আপনার আউটপুট y [n] লেগ l = 1 দ্বারা বিলম্বিত। তার মানে আউটপুট ডেটা সমান তবে এক "সূচক" দ্বারা বিলম্বিত। আরও পরিষ্কার হতে: আউটপুট ডেটা বিলম্বিত হয় 2 চক্র, কারণ এক (সাধারণ) ক্লকচক্রটি প্রয়োজন হয় এবং মধ্যবর্তী পর্যায়ে 1 টি অতিরিক্ত (ল্যাগ l = 1) ক্লক চক্র যুক্ত করা হয়।
ডেটা কীভাবে প্রবাহিত হবে তা চিত্রিত করার জন্য এখানে একটি স্কেচ দেওয়া হয়েছে:
পিএস: আমার কোডটি ঘনিষ্ঠভাবে দেখার জন্য আপনাকে ধন্যবাদ। তাই আমিও কিছু শিখেছি! ;-) এই সংস্করণটি সঠিক কিনা আপনি যদি আমাকে আর কোনও সমস্যা দেখতে পান তবে আমাকে জানান।