اگر با زبانهای برنامهنویسی کار کرده باشید میدانید که انواع مختلف داده برای کارهای مختلف برای ما وجود دارد. از دادههای اینتیجر، با علامت و بی علامت بگیرید تا ساختمانها و بسیاری از دادههای دیگر. در زبانی مانند زبان C انواع این دادهها وجود دارند. در این مقاله ما میخواهیم در رابطه با آرایهها در زبان VHDL صحبت کنیم، اما ابتدا به توضیحاتی که در ادامه خواهیم داد توجه کنید.
آرایهها خود نیز نوعی داده هستند که در زبان C قابل تعریف هستند. ما انواع آرایههای یک بعدی، دو بعدی، سه بعدی و بیشتر از این داریم.
اما آیا این آرایهها به صورت یک بعدی، دو بعدی و … در حافظهها ذخیره میشوند؟
خیر حافظههای دیجیتال یا به صورت فلیپفلاپ یا رجیستر هستند که یک یا چندین بیت را در خود جای میدهند و یا هم حافظههایی مثل RAM هستند که ساختارشان کمی متفاوت است و با آدرسدهی به آن میتوان به یک وکتور دسترسی داشت. پس در واقع چیزی به اسم حافظههای چند بعدی یا به صورت ماتریسی وجود ندارد.
شاید برای شما مفید باشد: آموزش FPGA
اینکه ما در زبانهای برنامهنویسی آرایههای چند بعدی داریم و یا ماتریس میتوانیم تعریف کنیم دلیل بر این نیست که درون تراشهها نیز همچین حافظههایی وجود داشته باشد، بلکه این سبک کدنویسی برای راحت بودن کاربر و نزدیک بودن به دنیای قابل فهم برای کاربر میباشد.
اما بحث اصلی ما در رابطه با دادهها و به طبع آن حافظهها در درون FPGA میباشد و به این دلیل در ابتدا به آرایهها در زبان برنامهنویسی C اشاره کردیم چون شما به احتمال زیاد بیشتر آشنا هستید و تجربه کار با آنها را دارید.
حافظهها در FPGA
به صورت کلی در FPGAها به دو صورت میتوانیم حافظهها را توصیف کنیم. یکی استفاده از LUTها (شامل فلیپفلاپ، مالتیپلکسر و یک سری ادوات دیگر میشود) و دیگری استفاده از RAM است. ما در این مقاله به RAM نخواهیم پرداخت و توضیحاتی در رابطه با ساختن حافظه با فلیپفلاپ و LUT خواهیم داد.
نوع دادههایی که ما در مقالات آموزش FPGA توصیف کرده بودیم نوععایی بودند که به ازای تعداد بیت آنها از فلیپفلاپ استفاده میشد. اما در این مقاله میخواهیم با نوعی شبیه به آرایهها که در زبان C وجود دارد در زبان VHDL آشنا شویم.
زبان VHDL پیچیدگیهای زیادی دارد و ما میتوانیم انواع دادههای عجیب و غریب را در آن تعریف کنیم. اما ما برای سادگی و همچنین اینکه این دادهها قابلیت پیادهسازی را داشته و کاربردی هم باشند از یک نوع بسیار ساده استفاده میکنیم و با مثالهایی دادههایی شبیه به آرایه توصیف میکنیم.
ابتدا به تصویر زیر توجه کنید:
در تصویر بالا دو نوع حافظه متفاوت را مشاهده میکنید. همانطور که گفتیم این دو نوع حافظه فقط سبک دسترسی ازطریق کد به آنها متفاوت است وگرنه چیزی که پیاده میشود با استفاده از فلیپفلاپها و سیمبندی بین آنهاست.
حال با استفاده از مثالهایی، بیشتر با این نوع داده و دسترسی به آن آشنا شویم.
ماتریس و بردار
1 2 3 4 5 6 7 8 9 | type t_matrix is array (0 to 3, 0 to 7) of integer; -- matrix 4 x 8 type t_vector is array (0 to 3) of integer; -- vector 4 element signal matrix : t_matrix; signal vector : t_vector; matrix(0,2) <= 5; vector(1) <= 42; |
در مثالی دیگر میخواهیم با استفاده از آرایه و تعریف نوع جدید، یک مالتی پلکسر را تعریف کنیم. البته ما در این قسمت با استفاده از ساختار شرطی مالتی پلکسر را تعریف کردیم. اکنون میخواهیم به روشی دیگر یک مالتی پلکسر تعریف کنیم.
به کد زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | library ieee ; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity array_mux8 is port( d0 : in std_logic_vector(1 downto 0); d1 : in std_logic_vector(1 downto 0); d2 : in std_logic_vector(1 downto 0); d3 : in std_logic_vector(1 downto 0); d4 : in std_logic_vector(1 downto 0); d5 : in std_logic_vector(1 downto 0); d6 : in std_logic_vector(1 downto 0); d7 : in std_logic_vector(1 downto 0); s : in std_logic_vector(2 downto 0); m : out std_logic_vector(1 downto 0)); end array_mux8; architecture rtl of array_mux8 is type t_array_mux is array (0 to 7) of std_logic_vector(1 downto 0); signal array_mux : t_array_mux; begin array_mux(0) <= d0; array_mux(1) <= d1; array_mux(2) <= d2; array_mux(3) <= d3; array_mux(4) <= d4; array_mux(5) <= d5; array_mux(6) <= d6; array_mux(7) <= d7; m <= array_mux(to_integer(unsigned(s))); end rtl; |
اگر کد بالا را تفسیر کنید به خوبی متوجه میشوید که توصیف یک مالتی پلکسر است که هشت ورودی دو بیتی دارد که با توجه به مقدار S یکی از این ورودیهای دو بیتی به خروجی منتقل میشود.
همچنین میتوان در هنگام تعریف آرایه آن را با مقادیر دلخواه مقداردهی اولیه کرد.
مثالهای بیشتری از این قبیل را میتوانید در این لینک ببینید.