ভিএইচডিএল: একটি INTEGER প্রকার থেকে একটি STD_LOGIC_VECTOR এ রূপান্তর করা


28

আমি একটি Mod-16 কাউন্টার তৈরি করেছি, এবং আউটপুট ফলাফলটি একটি INTEGER (সমস্ত উদাহরণ আমি INTEGER ব্যবহার করে দেখেছি)।

আমি একটি হেক্স-টু-se-সেগমেন্ট-ডিসপ্লে ডিকোডার তৈরি করেছি এবং এর ইনপুটটি একটি এসটিডি_লজিক_ভেক্টর (এটি সেভাবে লিখেছিল কারণ সত্যের টেবিলটি মানচিত্র করা সহজ ছিল)।

আমি কাউন্টারটির আউটপুটটিকে ডিকোডারটির ইনপুটটির সাথে সংযুক্ত করতে চাই, তবে কোয়ার্টাসআইআইতে সংকলনের চেষ্টা করার সময় আমি 'টাইপ মেজাজে' ত্রুটিগুলি পাই।

ভিএইচডিএল তালিকার কোনও INTEGER প্রকার থেকে একটি STD_LOGIC_VECTOR প্রকারে রূপান্তর করার কোনও উপায় আছে কি?

উত্তর:


20

অন্যরা যেমন বলেছে, ব্যবহার করুন ieee.numeric_std, কখনই না ieee.std_logic_unsigned, যা আসলে কোনও আইইইই প্যাকেজ নয়।

তবে, আপনি যদি ভিএইচডিএল ২০০৮ সমর্থন সহ সরঞ্জামগুলি ব্যবহার করছেন তবে আপনি নতুন প্যাকেজটি ব্যবহার করতে পারেন ieee.numeric_std_unsigned, যা মূলত std_logic_vectorস্বাক্ষরবিহীনতার মতো আচরণ করে।

এছাড়াও, যেহেতু আমি এটি স্পষ্টভাবে বর্ণিত দেখতে পাইনি, তাই এখানে (স্বাক্ষরযুক্ত) পূর্ণসংখ্যা থেকে কোনওতে রূপান্তর করার জন্য এখানে আসল কোড উদাহরণ রয়েছে std_logic_vector:

use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

16

যেমন লোনটেক বলেছেন, use ieee.numeric_stdআপনার বন্ধু। আপনি একটি রূপান্তর করতে পারেন std_logic_vectorএকটি থেকে integer, কিন্তু আপনি যেমন নিক্ষেপ করতে হবে signedঅথবা unsignedপ্রথম (কম্পাইলার কোন ধারণা যা আপনি কি এটা বোঝাতে আছে)। ভিএইচডিএল একটি জোরালোভাবে টাইপ করা ভাষা। আমি আমার ব্লগে এই বিষয়ে আরও লিখেছি

মৌলিকভাবে, আমি আপনার 7seg রূপান্তরকারীটি একটি integer(বা আসলে এটি একটি naturalইতিবাচক সংখ্যার সাথে ডিল করতে চলেছে) তা গ্রহণ করতে পরিবর্তন করব - রূপান্তরটি তখন একটি সহজ অ্যারে লুকআপ। রূপান্তরগুলির সাথে একটি ধ্রুবক অ্যারে সেট আপ করুন এবং সন্ধানে আপনি কোনও ইনপুট হিসাবে সত্তায় ব্যবহার করেন এমন পূর্ণসংখ্যার সাথে কেবল এটিতে সূচক করুন।


এর জন্য ধন্যবাদ. আমি আপনার মন্তব্য খুব প্রশংসা করি। আমি প্রকারের টিএ পজিশনে ছিলাম, প্রোগ্রামিং ধারণাগুলিতে সামান্য ঝাঁকুনি কে ছিল এমন কোনও পেশাদারকে শুরু করতে সহায়তা করার জন্য ভিএইচডিএল শিখছি। আমি আপনার কাছে তাঁর তথ্য পাঠাতে যাচ্ছি - আমরা যে পাঠ্যপুস্তকটি ব্যবহার করেছি তা ভিএইচডিএল 'নৈতিকতা' প্রশ্নগুলির মধ্যে আসে না।
জে পোল্ফার

1
এটি একটি 'নৈতিকতা' ইস্যুতে কম নয় এটি ধারাবাহিকতার গ্যারান্টি। সংখ্যার_এসটিডি লাইব আইইইই কর্তৃক প্রতিষ্ঠিত একটি বাস্তব স্ট্যান্ডার্ড, যখন std_logic_unsided লাইব্রেরিটি একজন বিক্রেতা দ্বারা তৈরি করা হয়েছিল এবং কোনও প্রকৃত আনুষ্ঠানিক সংজ্ঞা ছাড়াই শিল্পে গৃহীত হয়েছিল। নন-স্ট্যান্ডার্ড লিবসের সাথে ক্রস-বিক্রেতার সামঞ্জস্যের কোনও গ্যারান্টি নেই, যদিও এটি সাধারণত সূক্ষ্মভাবে কাজ করে। এখনই স্ট্যান্ডার্ডের দিকে এগিয়ে যাওয়া ভাল ফর্ম।
ম্যাটজি

1

ধরা যাক যে আপনার 4-বিট কাউন্টারটির একটি INTEGER আউটপুট SOME_INTEGER ছিল এবং আপনি এটিকে 4-বিট STD_LOGIC_VECTOR এ রূপান্তর করতে চেয়েছিলেন

SOME_VECTOR <= conv_std_logic_vector(SOME_INTEGER, 4);

অর্থবহ সংখ্যার সাহায্যে ভেক্টরকে আরম্ভ করতে আপনি এটি ব্যবহার করতে পারেন

SOME_VECTOR <= conv_std_logic_vector(9, 4); -- instead of "1001"

আমি মনে করি আপনার "আইইইইএসটিএসডিডিও_লিজিক_এআরআইটিএইচ.এলএল ব্যবহার করতে হবে;" এবং / অথবা STD_LOGIC_UNSIGNED।

পরিপূরক অপারেশন হ'ল কনফেয়ার (ভেক্টর)। তুলনা করার সময় আমি এটি ব্যবহার করতে পছন্দ করি। সুতরাং আমি ঘোষণা করতে পারে

constant SOME_CONSTANT : integer := 999;

এবং তারপরে, আমি এটি যদি একটি বিবৃতিতে ব্যবহার করতে পারি

if (conv_integer(SOME_VECTOR)=SOME_CONSTANT)
  then OTHER_VECTOR <= (others => '0');
end if;

সম্পাদনা: আপনার পূর্ণসংখ্যার হিসাবে ভেরিয়েবল ঘোষণা করার দরকার নেই। পরিবর্তে std_logic_vector এ ঘোষণাটি পরিবর্তন করার চেষ্টা করুন। + এবং - অপারেটরগুলি std_logic_vectors এ কাজ করে।


3
দয়া করে এটি করবেন না! সংখ্যাযুক্ত_এসটিডি ব্যবহার করুন (লোনটেক এবং আমার উত্তর দেখুন)
মার্টিন থম্পসন

আপনার যদি এটি করার আরও ভাল উপায় থাকে তবে তা ঠিক আছে তবে আমার পরামর্শটি কাজ করে তাই আমার মনে হয় আপনার ডাউন-ভোট অপ্রয়োজনীয় ছিল। আমি std_logic_arith বহু বছর ধরে ব্যবহার করেছি এবং এটি নিয়ে আমার কোনও সমস্যা হয়নি। আমি মনে করি বিক্রেতারা তাদের বাস্তবায়ন পরিবর্তন করার বিষয়ে ভয় ভিত্তিহীন; তাদের সঠিক মনের কোন বিক্রেতাই তাদের গ্রাহকদের ডিজাইন ভাঙার ঝুঁকি ফেলবে?
ajs410

1
আপনার কাছে ইতোমধ্যে উত্তর রয়েছে যে কোনও বিক্রেতা ইচ্ছাকৃতভাবে আইইইইয়ের নামস্থানে বিক্রেতার নির্দিষ্ট জিনিস রাখবে। এটি অপরিশোধিত থেকে যায়, বিশেষত স্বাক্ষরিত এবং স্বাক্ষরিত মূল্যবোধগুলির সাথে কাজ করার সময়।
ইয়ান ভার্নিয়ার

"+ এবং - অপারেটররা std_logic_vectors এ কাজ করে।" আফাইক, তারা কাজ করে না, যদি না আমি আপনার অর্থ ভুল বুঝে। এটি প্রথমে স্বাক্ষরিত / স্বাক্ষরযুক্ত ডেটা ধারণ করে এমন কোনও ধরণের কাস্ট করা প্রয়োজন।
stanri

1

আপনি প্রকারগুলি unsignedএবং signedথেকে ব্যবহার করতে আগ্রহী হতে পারেন ieee.numeric_std। এগুলির সাথে সামঞ্জস্যপূর্ণ std_logic_vectorতবে তাদের একটি সংখ্যাসূচক ব্যাখ্যা রয়েছে (বাইনারি বা 2-পরিপূরক)। এ জাতীয় ব্যাখ্যা দেওয়ার বিকল্প রয়েছে std_logic_vector, তবে এটি প্রস্তাবিত নয়


0

প্রধান উত্তর হিসাবে, প্রস্তাবিত পদ্ধতিটি নিম্নরূপ:

use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

তবে, কেন এটি সুপারিশ করা হয় এবং ভিএইচডিএল এর std_logic_vectors মধ্যে পূর্ণসংখ্যার রূপান্তর করার জন্য যেমন আপাতদৃষ্টিতে বিশৃঙ্খলাবদ্ধ পদ্ধতি রয়েছে সে সম্পর্কে আমি বিস্তারিত বলতে চাই।

এটি কীভাবে এই ধরণের সরঞ্জামগুলি দ্বারা দেখা হয় তা নেমে আসে।

একটি স্ট্যান্ডার্ড_লিক_ভেক্টর আক্ষরিক অর্থে 1s বা 0 এর একগুচ্ছ। আমার 10001. এটি কোন সংখ্যা? ঠিক আছে, এটা নির্ভর করে। এটি স্বাক্ষরিত বা স্বাক্ষরবিহীন? এই এসএলভি জানে না বা যত্ন করে না। কত বিট? আচ্ছা, আপনার এসএলভি কত দিন?

একটি পূর্ণসংখ্যা স্বাক্ষরিত হয়, এবং সাধারণত 32 বিট (যদি আমি সঠিকভাবে মনে করি)।

প্রথম পর্যায়: আমার পূর্ণসংখ্যাকে আরও ছোট এবং স্বাক্ষরযুক্ত করুন। এই অংশ:

to_unsigned(my_int, my_slv'length));

"আমার এই পূর্ণসংখ্যা রয়েছে, আমি এটি স্বাক্ষরবিহীন হোক এবং আমি চাই এটি আমার এসএলভি দৈর্ঘ্যের সাথে ফিট করে।"

দ্বিতীয় পর্যায়: তারপরে, এই বিটগুলি নিয়ে যান এবং মাই_এসএলভি ড্রাইভ করতে তাদের ব্যবহার করুন।

my_slv <= std_logic_vector(...)

"এই বিটগুলি নিন এবং আমার এসএলভি চালানোর জন্য এগুলি ব্যবহার করুন"

(পরিভাষা সম্পর্কিত একটি নোট। A <= Bভিএইচডিএলে "এ বি দ্বারা চালিত হয়" বলে উচ্চস্বরে পড়া হয়)

সংযুক্ত, এটি আপনাকে পেয়েছে:

my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

Aতিহ্যবাহী প্রোগ্রামিং ব্যাকগ্রাউন্ড থেকে আসার সময়, প্রোগ্রামিং চিন্তাভাবনার মধ্যে আটকা পড়া খুব সহজ। তবে ভিএইচডিএলে আপনি যে কোডটি লিখেছেন তাতে হার্ডওয়্যারটিতে শারীরিক জড়িত রয়েছে। এই পদ্ধতিটি কেন কাজ করে এবং সুপারিশ করা হয় তা জেনে রাখা আপনি হার্ডওয়ারের ক্ষেত্রে কী লিখছেন তা চিন্তা করার এক ধাপ কাছাকাছি।

বোনাস টিপ: টো_ দ্বারা উপসর্গযুক্ত ফাংশনগুলি অপারেশনগুলি সংক্ষিপ্ত / পরিবর্তন করে। তারা তাদের স্বাক্ষরবিহীন বা একটি নির্দিষ্ট দৈর্ঘ্য বা উভয় করে make এজন্য to_ সাইন ইন করার জন্য আপনাকে দৈর্ঘ্য নির্দিষ্ট করতে হবে। প্রকারগুলি ইতিমধ্যে সরাসরি সুসংগত হলে to_ (সরাসরি উদাহরণস্বরূপ std_logic_vector (...)) ছাড়া ফাংশনগুলি ব্যবহৃত হয়। "এই বিটগুলি নিন এবং এগুলিতে এগুলি স্টফ করুন, কোনও পরিবর্তনের প্রয়োজন নেই"। এগুলির একটি দৈর্ঘ্যের যুক্তি নেই কারণ উভয় পক্ষ ইতিমধ্যে সমান। সুতরাং এই জাতীয় জিনিস তৈরি করার সময়, আমার এটি সন্ধান করার দরকার নেই, আমি কীভাবে ডেটা পরিবর্তন করছি সে সম্পর্কে কেবল চিন্তা করি।


0

পূর্ণসংখ্যাকে std_logic_vector এ রূপান্তর করতে আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে। সংখ্যাযুক্ত_এসটিডি ব্যবহার করে:

vect <= std_logic_vector( to_unsigned( your_int, vect'length));

অথবা

vect <= std_logic_vector( to_signed( your_int, vect'length));

Std_logic_arith ব্যবহার:

vect <= conv_std_logic_vector( your_int, vect'length);

std_logic_arith একটি ieee স্ট্যান্ডার্ড নয়, তবে বেশিরভাগ সরঞ্জামগুলি এটি আইইইই লাইব্রেরিতে সংকলন করে এবং এটি ব্যাপকভাবে ব্যবহৃত হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.