عکس پیش‌فرض نوشته

انواع داده رکورد اشیائی از انواع مختلف را به صورت یک شیء گروه بندی می کنند. هر عنصر از رکورد با استفاده از نام فیلد آن قابل درسترسی می باشد.

عناصر رکورد می توانند هر نوع داده ای، از جمله آرایه ها و رکوردها، باشند.

 
Learning VHDL

عناصر یک رکورد می توانند از یک نوع و یا از انواع مختلف باشند. همانند آرایه ها، رکوردها نیز برای مدل کردن عناصر داده ای انتزاعی استفاده می شوند.

مثال زیر اعلان یک نوع رکورد را نشان می دهد:

TYPE optype IS ( add, sub, mpy, div, jmp );
TYPE instruction IS
RECORD
    Opcode : Optype;
    Src : INTEGER;
    Dst : INTEGER;
END RECORD;

 

خط نخست نوع شمارشی optype را اعلان می کند، که به عنوان یکی از انواع فیلد رکورد استفاده می شود. خط دوم اعلان رکورد را شروع می کند. اعلان نوع رکورد با کلید واژه RECORD آغاز و با END RECORD خاتمه می یابد.

تمام اعلان های بین این دو کلید واژه اعلان فیلدهای رکورد می باشند.

هر فیلد از رکورد یک ناحیه حافظه منحصر به فرد را مشخص می کند که می تواند خوانده شود و داده ای با نوع مناسب به آن تخصیص یابد.

این مثال سه فیلد اعلان می کند: opcode از نوع optype، وsrc و dst از نوع INTEGER .

با استفاده از نام رکورد و به دنبال آن یک نقطه و نام فیلد می توان به هر فیلد رجوع کرد.

مثال بعدی این نحوه دسترسی را نشان می دهد:

PROCESS(X)
    VARIABLE inst           :  instruction;
    VARIABLE source, dest   :  INTEGER;
    VARIABLE operator       :  optype;
BEGIN
    Source    :=  inst.src;        -- ok    line 1
    Dest      :=  inst.src;        -- ok    line 2
    Source    :=  inst.opcode;     -- error line 3
    Operator  :=  inst.opcpde;     -- ok    line 4
    Inst.src  :=  dest;            -- ok    line 5
    Inst.dst  :=  dest;            -- ok    line 6
    Inst      :=  (add, dest, 2);  -- ok    line 7
    Inst      :=  (source);        -- error line 8
END PROCESS;

 

این مثال متغییر inst را تعریف می کند که از نوع دستورالعمل است.

همچنین، متغییرها مطابق با نوع فیلدهای رکورد اعلان شده اند. خطوط 1 و 2 فیلدهایی از رکورد را نشان می دهند که به متغییرهای محلی پروسس تخصیص یافته اند. ان انتساب ها مجازند زیرا نوع ها منطبق می باشند.

خط 3 یک مورد غیرمجاز را نشان می دهد. نوع فیلد opcode با نوع داده متغییر source یکی نیست. کامپایلر این دستور را با یک خطای عدم انطباق نوع مشخص می کند. خط 4 انتساب صحیح بین فیلد opcode و متغییری را که هم نوع آن است نشان می دهد.

خطوط 5 و 6 نشان می دهند که نه تنها می توان فیلدهای رکورد را خواند، بلکه می توان به آنها مقداری نیز تخصیص داد.در این دو خط، مقادیری از متغیر dest به دو فیلد رکورد تخصیص می یابد.

خط 7  مثالی از یک انتساب تجمعی را نشان می دهد. در این خط، به تمام فیلدهای رکورد با هم مقدار تخصیص داده می شود.

 

مجموعه تخصیص یافته سه گزینه سه گزینه دارد:

یک مقدار optype، یک مقدار متغیر INTEGER و یک مقدار INTEGER. این انتساب به متغیر رکورد inst مجاز است.

خط  مثالی از یک مقدار تجمعی غیرمجاز برای رکورد inst را نشان می دهد. مجموعه فقط یک مقدار دارد که نوع غیرمجازی برای رکورد است.

در دو مثال قبل، تمام عناصر رکورد اسکالر بودند. حال مثال هایی را بررسی می کنیم که فیلدها انواع پیچیده تری داشته باشند.

در زیر رکوردی برای بسته داده نشان داده شده است:

TYPE word IS ARRAY (0 TO 3) OF std_logic;
TYPE t_word_array IS ARRAY (0 TO 15) OF word;
TYPE addr_type IS
RECORD
    Source   :   INTEGER;
    Key      :   INTEGER;
END RECORD;

TYPE data_paclet IS
RECORD
    Addr      :   addr_word;
    Data      :   t_word_array;
    Checksum  :   INTEGER;
    Parity    :   BOOLEAN;
END RECORD;

 

دو اعلان نوع اول، نوع word و addr_type را تعریف می کنند، که در رکورد data_packet استفاده می شوند.

نوع word یک آرایه ساده و نوع addr_word یک رکورد ساده است.

نوع رکورد data_packet چهار فیلد دارد که از دو نوع از پیش تعریف شده VHDL همراه با این دو نوع استفاده می کنند.

مثال بعدی نحوه دسترسی به متغیری از نوع data_packet را نشان می دهد:

PROCESS(X)
    VARIABLE packet  :  data_packet;
BEGIN

    Packet.addr.key     :=  5;                          -- ok    line 1
    Packet.addr         :=  (10, 20);                   -- ok    line 2

    Packet.data(0)      :=  (‘0’ , ‘0’ , ‘0’ , ‘0’);    -- ok    line 3
    Packet.data(10)(4)  :=  ‘1’;                        -- error line 4
    Packet.data(10)(0)  :=  ‘1’;                        -- ok    line 5

END PROCESS;

 

این مثال نحوه دسترسی به انواع رکورد مرکب را نشان می دهد.

در خط 1، یک فیلد از رکورد دستیابی شده است. فیلد key فیلدی از رکورد addr_type است که خود آن فیلدی از رکورد data_packet می باشد. این خط مقدار 5 را به آن فیلد تخصیص می دهد.

خط 2 مجموعه ای را به کل فیلدی به نام addr در رکورد data_packet تخصیص می دهد.

در خط 3، به عنصر 0 ام آرایه data مجموعه ای تخصیص یافته است.

خط 4، سعی دارد فقط به یک بیت از عنصر یازدهم فیلد آرایه ای data در رکورد data_packet مقدار تخصیص دهد، اما مقدار شاخص دوم خارج از بازه است.

خط 5، نحوه تخصیص درست به یک بیت از آرایه را نشان می دهد.

این آموزش بیش از ۳ سال قبل ارسال شده و اکنون در لیست به‌روزرسانی‌های سایت قرار دارد. اگر پیشنهاد یا انتقادی برای بهبود آموزش دارید، خوشحال می‌شیم به ما اطلاع بدهید.