যখন VHDL লেখা, আমি অত্যন্ত জন্য std_logic_vector (SLV) পূর্ণসংখ্যা (int-) পরিবর্তে ব্যবহার করার প্রস্তাব সংকেত । (অন্যদিকে জেনেরিকের জন্য ইন্ট ব্যবহার করা, কিছু ধ্রুবক এবং কিছু ভেরিয়েবলগুলি অত্যন্ত দরকারী) কিছু ভুল.
ইন্টের সাথে সমস্যাটি হ'ল ভিএইচডিএল প্রোগ্রামারটির কোনও অভ্যন্তরীণ লজিক উপস্থাপনা কী তা সম্পর্কে কোনও ধারণা নেই এবং তাই আমরা এর সুবিধা নিতে পারি না। উদাহরণস্বরূপ, যদি আমি 1 থেকে 10 এর পরিসীমাটির সংজ্ঞা দেয় তবে কম্পাইলার কীভাবে এই মানগুলিকে এনকোড করে তা আমার কোনও ধারণা নেই। আশা করি এটি 4 বিট হিসাবে এনকোড করা হবে, তবে আমরা এর বেশি কিছু জানি না। আপনি যদি এফপিজিএ-র অভ্যন্তরে সংকেতগুলি অনুসন্ধান করতে পারেন তবে এটি "0001" থেকে "1010" হিসাবে এনকোড হতে পারে বা "0000" থেকে "1001" হিসাবে এনকোড করা হতে পারে। এটি এটিও সম্ভব যে এটি এমনভাবে এনকোড করা হয়েছে যা আমাদের মানুষের কাছে একেবারেই কোনও ধারণা রাখে না।
পরিবর্তে আমাদের কেবল ইনট এর পরিবর্তে এসএলভি ব্যবহার করা উচিত, কারণ তখন আমাদের এনকোডিংয়ের উপর নিয়ন্ত্রণ থাকে এবং স্বতন্ত্র বিটগুলিতেও সরাসরি অ্যাক্সেস থাকে। সরাসরি অ্যাক্সেস থাকা গুরুত্বপূর্ণ, কারণ আপনি পরে তা দেখতে পাবেন।
যখনই আমাদের পৃথক বিটের অ্যাক্সেসের প্রয়োজন হয় আমরা কেবলমাত্র এসএলভিতে একটি int কাস্ট করতে পারি, তবে এটি খুব অগোছালো হয়ে যায়, খুব দ্রুত। এটি উভয় বিশ্বের সেরা পরিবর্তে উভয় বিশ্বের সবচেয়ে খারাপ পাওয়ার মতো। আপনার কোডটি সংকলকটির অনুকূলিতকরণ করা কঠিন এবং আপনার পক্ষে পড়া প্রায় অসম্ভব। আমি এটি সুপারিশ করি না।
সুতরাং, যেমনটি আমি বলেছি, এসএলভি দিয়ে বিট এনকোডিংগুলিতে আপনার নিয়ন্ত্রণ থাকে এবং বিটগুলিতে সরাসরি অ্যাক্সেস থাকে। সুতরাং আপনি এই কি করতে পারেন? আমি আপনাকে কয়েকটি উদাহরণ দেখাব। ধরা যাক যে প্রতি 4,294,000,000 ঘড়িতে আপনাকে একবার ডাল আউটপুট করতে হবে। আপনি কীভাবে এটি ব্যবহার করবেন এটি এখানে:
signal count :integer range 0 to 4293999999; -- a 32 bit integer
process (clk)
begin
if rising_edge(clk) then
if count = 4293999999 then -- The important line!
count <= 0;
pulse <= '1';
else
count <= count + 1;
pulse <= '0';
end if;
end if;
end process;
এবং এসএলভি ব্যবহার করে একই কোড:
use ieee.numeric_std.all;
signal count :std_logic_vector (32 downto 0); -- a 33 bit integer, one extra bit!
process (clk)
begin
if rising_edge(clk) then
if count(count'high)='1' then -- The important line!
count <= std_logic_vector(4293999999-1,count'length);
pulse <= '1';
else
count <= count - 1;
pulse <= '0';
end if;
end if;
end process;
এই কোডটির বেশিরভাগটি অন্ততপক্ষে এবং এসএলভির মধ্যে অভিন্ন, কমপক্ষে ফলাফলের যুক্তির আকার এবং গতি অর্থে। অবশ্যই একটি গণনা করছে এবং অন্যটি গণনা করছে, তবে এই উদাহরণটির জন্য এটি গুরুত্বপূর্ণ নয়।
পার্থক্যটি "গুরুত্বপূর্ণ লাইনে" রয়েছে।
অন্তর্নিহিত উদাহরণ সহ, এটি একটি 32-ইনপুট তুলনামূলক হতে চলেছে। শিলিনেক্স স্পার্টান -3 ব্যবহার করে 4-ইনপুট LUT এর সাথে, এর জন্য 11 টি LUTs এবং 3 স্তরের যুক্তির প্রয়োজন হবে। কিছু সংকলক এটি এটিকে বিয়োগে রূপান্তর করতে পারে যা বহনকারী শৃঙ্খলা ব্যবহার করবে এবং 32 LUT এর সমতুল্য ছড়িয়ে দেবে তবে 3 স্তরের যুক্তির চেয়ে দ্রুত চলবে।
Slv উদাহরণ সহ, 32-বিটের তুলনা নেই তাই এটি "শূন্য LUT's, যুক্তির শূন্য স্তর"। একমাত্র জরিমানা হ'ল আমাদের কাউন্টারটি একটি অতিরিক্ত বিট। কারণ এই অতিরিক্ত বিট কাউন্টারের অতিরিক্ত সময় নির্ধারণের সমস্তটি ক্যারি চেইনে রয়েছে, "প্রায় শূন্য" অতিরিক্ত সময় নির্ধারণের বিলম্ব রয়েছে।
অবশ্যই এটি একটি চূড়ান্ত উদাহরণ, কারণ বেশিরভাগ মানুষ এইভাবে 32-বিট কাউন্টার ব্যবহার করবেন না। এটি ছোট কাউন্টারগুলিতে প্রযোজ্য, তবে তফাতটি কম নাটকীয় হলেও তাত্পর্যপূর্ণ হলেও।
দ্রুত সময় নির্ধারণের জন্য কীভাবে স্লভকে ইনট এর মাধ্যমে ব্যবহার করতে হয় তার একমাত্র উদাহরণ। স্লভ ব্যবহারের আরও অনেকগুলি উপায় রয়েছে - এটি কেবল কিছু কল্পনা করে takes
আপডেট: "যদি (গণনা -১) <0" এর সাথে int ব্যবহারের বিষয়ে মার্টিন থম্পসনের মন্তব্যগুলিকে সম্বোধন করার জন্য স্টাফ যুক্ত করা হয়েছে
(দ্রষ্টব্য: আমি ধরে নিলাম আপনার অর্থ "যদি গণনা <0" হয় তবে এটি আমার এসএলভি সংস্করণের তুলনায় আরও সমতুল্য হয়ে উঠবে এবং সেই অতিরিক্ত বিয়োগের প্রয়োজনীয়তা সরিয়ে ফেলবে))
কিছু পরিস্থিতিতে এটি উদ্দেশ্যযুক্ত যুক্তি বাস্তবায়ন উত্পন্ন করতে পারে তবে এটি সমস্ত সময় কাজ করার গ্যারান্টিযুক্ত নয়। এটি আপনার কোড এবং আপনার সংকলকটি কী কী মানকে এনকোড করে তার উপর নির্ভর করবে।
আপনার সংকলকটির উপর নির্ভর করে এবং আপনি কীভাবে আপনার পূর্বনির্ধারার পরিসরটি নির্দিষ্ট করেন, এটি সম্পূর্ণভাবে সম্ভব যে শূন্যের কোনও মান মান "0000 ... 0000" এর বিট ভেক্টরে এনকোড না করে যখন এটি এফপিজিএ যুক্তিযুক্ত করে তোলে। আপনার প্রকরণের কাজ করার জন্য এটি অবশ্যই "0000 ... 0000" এ এনকোড করবে।
উদাহরণস্বরূপ, ধরা যাক আপনি -5 থেকে +5 এর পরিসীমা থাকতে কোনও সংজ্ঞা নির্ধারণ করেন। আপনি "0000" এর মতো 4 বিটে এনকোড হওয়া 0 এবং "5101" হিসাবে +5 এবং "1011" হিসাবে -5 এর মান আশা করছেন। এটি টিপিক্যাল টোভস-পরিপূরক এনকোডিং স্কিম।
তবে ধরে নিবেন না যে সংকলকটি দ্বিগুণ-পরিপূরক ব্যবহার করবে। অস্বাভাবিক হলেও, পরিপূরকগুলির ফলে "আরও ভাল" যুক্তি দেখা দিতে পারে। অথবা, সংকলকটি "পক্ষপাতদুষ্ট" এনকোডিংয়ের একটি ধরণের ব্যবহার করতে পারে যেখানে -5 "0000", 0 "" 0101 "হিসাবে এবং +5" 1010 "হিসাবে এনকোড করা আছে।
যদি আন্তের এনকোডিংটি "সঠিক" হয় তবে সংকলক সম্ভবত ক্যারি বিটের সাথে কী করবেন তা নির্ধারণ করবে। তবে এটি যদি ভুল হয় তবে ফলাফলযুক্ত যুক্তিটি ভয়াবহ হবে।
এটি সম্ভব যে এই উপায়ে কোনও ইন্ট ব্যবহার করা যুক্তিসঙ্গত যুক্তির আকার এবং গতি পেতে পারে তবে এটি কোনও গ্যারান্টি নয়। একটি অন্য সংকলক (উদাহরণস্বরূপ সিনস্টেসিসে এক্সএসটি) এ স্যুইচ করা, বা অন্য কোনও এফপিজিএ আর্কিটেকচারে যাওয়া সঠিক ভুল জিনিসটি ঘটতে পারে।
স্বাক্ষরযুক্ত / স্বাক্ষরিত বনাম এসএলভি আরও একটি বিতর্ক। আমাদের ভিএইচডিএলে অনেকগুলি বিকল্প দেওয়ার জন্য আপনি মার্কিন সরকার কমিটিকে ধন্যবাদ জানাতে পারেন। :) আমি এসএলভি ব্যবহার করি কারণ এটি মডিউল এবং কোরগুলির মধ্যে ইন্টারফ্যাকিংয়ের মান। সিমুলেশনগুলির চেয়ে অন্য কিছু এবং সিমুলেশনগুলির ক্ষেত্রে, আমি মনে করি না যে স্বাক্ষরিত / স্বাক্ষরযুক্ত ওভারে এসএলভি ব্যবহার করার একটি বিশাল সুবিধা রয়েছে। আমি স্বাক্ষরিত / স্বাক্ষরযুক্ত সমর্থন ত্রি-বর্ণিত সংকেতগুলি নিশ্চিত কিনা তাও নিশ্চিত নই।