Understanding Arithmetic Operations in VHDL

وتوفر شركة VHDL (VHSIC Harware Description Language) دعما قويا لتنفيذ العمليات الحسابية، مما يجعلها حجر الزاوية في تصميم النظم الرقمية مثل المجهزين، ومجهزي الإشارات الرقمية، ووحدات المراقبة، وتشكل اللبنات المصممة مثل الإضافات، والمتعاقدين، والمضاعفات لبنات أساسية للبناء، ومعرفة كيفية تنفيذها بكفاءة، عوامل حاسمة بالنسبة للنموذج المعماري والاختيار.

وقبل التخلّص من عناصر محددة، من الضروري فهم مجموعتي VHDL الرئيسيتين اللتين تمكّنان من إجراء تصوّر: -التكتم و[المجموعة] [الرمزية:] [الرمزية:]

All code examples in this article are written using IEE 1076-2008] compatible VHDL and target Xilinx or Intel (Altera) FPGA devices, but the concepts apply to any digital design flow.

مضافون في VHDL

(أ) الإضافات هي أكثر العمليات الحسابية أهمية؛ وفي VHDL، يمكنك تنفيذ الإضافات على مختلف مستويات التصريف: السلوك (يستخدم + مشغل، تدفق البيانات (يستخدم الإشارة المتزامنة)، أو المكونات الهيكلية (تثبت العناصر الدنيا).

بسيطة من طراز Ripple-Carry Adder

مضافات السيارات الممزقة تسلسل مضافات كاملة معاً حيث يغذي كل جزء من القطعة المتحركة من الجزء الأعلى التالي

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity adder4bit is
 Port (
 A : in unsigned(3 downto 0);
 B : in unsigned(3 downto 0);
 Sum : out unsigned(3 downto 0);
 Cout : out std_logic
 );
end adder4bit;

architecture Behavioral of adder4bit is
begin
 process(A, B)
 variable temp_sum : unsigned(4 downto 0);
 begin
 temp_sum := ('0' & A) + ('0' & B);
 Sum <= temp_sum(3 downto 0);
 Cout <= temp_sum(4);
 end process;
end Behavioral;

النقاط الرئيسية:

  • The concatenation ['0 ' A] ] extends the inputs to 5 bits, capturing the carry-out.
  • Using unsigned directly with the +] operator is synthesizable; the tool infers the appropriate adder logical (ripple-carry, carry-lookahead, or LUT-based in FPGAs).
  • وتشمل قائمة حساسية العملية جميع إشارات المدخلات، بما يكفل تحديث الناتج على الفور بشأن أي تغيير (السلوك المجتمعي).

Carry-Lookahead Adder (CLA)

[[FT] widerers (e.g., 16-bit or 32-bit), ripple-carry adders introduce significant delay due to the carry propagation. A carry-lookahead reduces this delay by generating carry signals in parallel. Implementing a full CLA in VHDL requires describing the generate (g)

entity adder16bit is
 Port (
 A : in unsigned(15 downto 0);
 B : in unsigned(15 downto 0);
 Sum : out unsigned(15 downto 0);
 CO : out std_logic
 );
end adder16bit;

architecture Behavioral of adder16bit is
 signal temp : unsigned(16 downto 0);
begin
 temp <= ('0' & A) + ('0' & B);
 Sum <= temp(15 downto 0);
 CO <= temp(16);
end Behavioral;

مضاف إليه كشف التدفق الزائد

وعندما تستخدم موقعة ] أرقام، يحدث تدفق زائد عندما لا تتطابق علامة النتيجة مع الإشارة المتوقعة استناداً إلى المدخلات، ويعتبر الكشف عن التدفق الزائد أمراً أساسياً في وحدات التصنيع البديلة.

entity signed_adder is
 Port (
 A : in signed(7 downto 0);
 B : in signed(7 downto 0);
 Sum : out signed(7 downto 0);
 Overflow: out std_logic
 );
end signed_adder;

architecture Behavioral of signed_adder is
 signal extended_sum : signed(8 downto 0);
begin
 extended_sum <= (A(7) & A) + (B(7) & B); -- sign extend
 Sum <= extended_sum(7 downto 0);
 Overflow <= extended_sum(8) XOR extended_sum(7); -- sign mismatch
end Behavioral;

متعاقدون في شركة VHDL

يمكن تنفيذ السحب إما عن طريق الاستخدام المباشر لمشغل الـ - ] أو بإضافة تكملة اثنين من الـ (التراهين) إلى الـ (ميليند) و في حين أن النموذج السلوكي واضح، فهم الاقتراض من أجل نشر النتائج السلبية ومناولتها أمر أساسي.

متعاقد مباشر من الباطن

ويستخدم أبسط متعاقد من الباطن مشغل -] مع أنواع غير موقعة أو موقعة، وقد تصبح النتيجة سلبية بالنسبة للتعاقد غير الموقع إذا كان B ⁇ A؛ وفي هذه الحالات، نحتاج إلى كشف تدفق ناقص (الاستعراض) ويعود المثال التالي إلى الفرق وإلى العلم:

entity subtractor4bit is
 Port (
 A : in unsigned(3 downto 0);
 B : in unsigned(3 downto 0);
 Diff : out unsigned(3 downto 0);
 Borrow : out std_logic
 );
end subtractor4bit;

architecture Behavioral of subtractor4bit is
 signal temp_diff : signed(4 downto 0);
begin
 process(A, B)
 begin
 temp_diff <= signed('0' & A) - signed('0' & B);
 if temp_diff(4) = '1' then
 Borrow <= '1';
 else
 Borrow <= '0';
 end if;
 Diff <= unsigned(temp_diff(3 downto 0));
 end process;
end Behavioral;

ملاحظة تحويل إلى موقعة لحساب وسيط؛ وهذا يسمح بالتعامل السليم مع الاختلافات السلبية، والأهم من ذلك (مؤقتاً - (4)) هو العلم المقترض.

متعاقد من الباطن يستخدم تكملة اثنين

كبديل لذلك يمكنك تنفيذ السحب بإضافة تكملة اثنين من B. هذه التقنية شائعة عندما تعيد استخدام مضيف موجود في وحدة تحليل الأشعة تحت الحمراء

signal B_comp : unsigned(3 downto 0);
signal sum_with_borrow : unsigned(4 downto 0);

B_comp <= (not B) + 1; -- two's complement
sum_with_borrow <= ('0' & A) + ('0' & B_comp);
Diff <= sum_with_borrow(3 downto 0);
Borrow <= not sum_with_borrow(4); -- borrow asserted if carry out is 0

كلا الأسلوبين سهلين، واختيار واحد يطابق أفضليات تصميمك المعمارية.

المقارنة والخلاصة

وكثيرا ما يستخدم المستنكفون لتنفيذ المقارنات، ويمكنكم، بفحص الاقتراض أو الإشارة إلى الفرق، أن تحددوا ما إذا كان الفارق > باء أو < باء أو ألف > باء > أو باء > بدون أساس مقارن مخصص، مثلا، بعد التراجع، إذا كانت النتيجة صفر (جميع القطع صفر)، فإن المدخلات متساوية، إذا كان الاقتراض/التوقيع 1، ثم < باء < .

مضاعفات في VHDL

والتكثيف أكثر كثافة من حيث الموارد من الإضافة أو الاستبعاد، يدعم القانون الإنساني الدولي * مشغِّل الأنواع غير الموقَّعة والموقَّعة، الذي يستنتج مضاعفاً مركباً، غير أنه بالنسبة للمواهب الكبيرة، يمكن للمضاعفات المزدوجة أن تستهلك منطقاً كبيراً وتتأخر في النشر الطويل.

المضاعفات الكمبي الجنسية

A 4-bit multiplier using the * operator is trivial:

entity multiplier4bit is
 Port (
 A : in unsigned(3 downto 0);
 B : in unsigned(3 downto 0);
 Product : out unsigned(7 downto 0)
 );
end multiplier4bit;

architecture Behavioral of multiplier4bit is
begin
 Product <= A * B;
end Behavioral;

ويستنتج هذا مضاعفاً مركباً، يتم تنفيذه عادة في إطار برنامج FPGA باستخدام شرائح مخصصة من نظام الأفضليات المعمم (مثل كتلة Xilinx DSP48) أو منطق قائم على نظام LUT، وبالنسبة للأسلاك حتى 18 قطعة، يمكن لمعظم أدوات نظام الأفضليات المعمم أن تحدد المضاعفات إلى شريحة واحدة من نظام الأفضليات المعمم، وبالنسبة للمضاعفات الأوسع، يمكن أن تجمع أداة التوليف بين شرائح متعددة من نظام الأفضليات المعين أو تستخدم المنطق الليني.

مضاعفات دقيقة (السرقة وAdd)

أما بالنسبة للتصميمات التي تُضبط في المناطق أو عندما يكون التأخير المختلط غير مقبول، فيمكن استخدام مضاعف تسلسلي يُستخدم على فترات متقطعة، ويُذكر أن المضاعفات الكلاسيكية للتحولات والأجوريدية تُعدّ رقمين من طراز N-bit على مدار الساعة، ويُعد المثال المبسط (4-مضاعف، غير موقّع، مع إشارات المراقبة التي تُغفل من أجل الوضوح):

entity sequential_multiplier is
 Port (
 clk : in std_logic;
 reset : in std_logic;
 start : in std_logic;
 A : in unsigned(3 downto 0);
 B : in unsigned(3 downto 0);
 done : out std_logic;
 Product : out unsigned(7 downto 0)
 );
end sequential_multiplier;

architecture Behavioral of sequential_multiplier is
 signal multiplicand : unsigned(7 downto 0);
 signal multiplier : unsigned(3 downto 0);
 signal product_reg : unsigned(7 downto 0);
 signal count : integer range 0 to 4;
 signal busy : std_logic;
begin
 process(clk)
 begin
 if rising_edge(clk) then
 if reset = '1' then
 count <= 0;
 busy <= '0';
 product_reg <= (others => '0');
 done <= '0';
 elsif start = '1' and busy = '0' then
 multiplicand <= "0000" & A; -- left-aligned 4-bit multiplicand
 multiplier <= B;
 product_reg <= (others => '0');
 count <= 0;
 busy <= '1';
 done <= '0';
 elsif busy = '1' then
 if multiplier(0) = '1' then
 product_reg <= product_reg + multiplicand;
 end if;
 multiplicand <= multiplicand(6 downto 0) & '0'; -- shift left
 multiplier <= '0' & multiplier(3 downto 1); -- shift right
 count <= count + 1;
 if count = 3 then
 busy <= '0';
 done <= '1';
 end if;
 end if;
 end if;
 end process;
 Product <= product_reg;
end Behavioral;

ويستخدم هذا التصميم إضافة واحدة من طراز L-bit إلى دورة الساعة (4 دورات لمدخلات ذات أربع مبانٍ) ويحفظ المساحة ولكنه يضحي بالمدخلات والنقصات.

مضاعفات خطية

وفيما يتعلق بتطبيقات الإنتاج العالي، يضاف مضاعف خط الأنابيب سجلات بين مراحل التكاثر المختلط، ويمكن للعديد من أدوات التجميع الخاصة بهيئة الأوراق المالية والإنقاذ أن تجهز تلقائياً مضاعفاً عندما تضيف سجلات خطوط الأنابيب، مثلاً باستخدام لـ... توليد ] حلقة أو مرحلة يدوية:

-- Pipelined unsigned 4x4 multiplier (2-stage pipeline)
architecture Pipelined of multiplier4bit is
 signal stage1_prod : unsigned(7 downto 0);
 signal stage1_A, stage1_B : unsigned(3 downto 0);
 signal stage2_prod : unsigned(7 downto 0);
begin
 process(clk)
 begin
 if rising_edge(clk) then
 stage1_A <= A;
 stage1_B <= B;
 stage1_prod <= stage1_A * stage1_B; -- first stage
 stage2_prod <= stage1_prod; -- second stage
 Product <= stage2_prod;
 end if;
 end process;
end Pipelined;

وهذا النهج البسيط ذي المرحلتين يضاعف من الناتج (نتيجة واحدة لكل ساعة بعد فترة الرضاعة الأولية) بينما لا يضيف سوى طبقة تسجيل إضافية واحدة، ويمكن إضافة مزيد من المراحل لتواترات ساعات العمل العالية.

استخدام شرائح DSP

Fordern FPGAs contain hardened DSP slices configured for multiplication and accumulation. In VHDL, using the * operator often automatically infers wi blocks. To ensure DSP inference, follow sales guidelines: keep operands within the slice width (eg., 18x18, 18x25),

Xilinx Vivado Synthesis Guide]

التقنيات والتوليفيات على النحو الأمثل

وعند تنفيذ العمليات الحسابية في القانون الإنساني الدولي، تؤثر عدة عوامل على نوعية النتائج:

  • Data Width:] Use the smallest necessary width to reduce logical. For example, if inputs are 5-bit, use unsigned(4 down to 0).
  • Synthesis Attributes:] Apply attributes like ]keep, use dsp], or mult style[FLT influence:7]
  • Resource Sharing:] If multiple operations use the same adder or multiplier, consider reusing equipment via a shared component or a single arithmetic block with multiplexed inputs.
  • Pipelining:] Insert registers to meet timing constraints. For additive chains, balance the register placement to avoid long combinatorial paths.
  • signed vs Unsigned:] Use signed for signed operations; the synthesis tool will treat the MSB as a sign bit, affecting the arithmetic logical inferred.
  • Carry Chains:] For wide adders, the carry chain is a dedicated resource in FPGAs. Ensure your synthesis tool is not breaking the chain by using inappropriate middle signals.

العمليات المشتركة: نموذج ALU Example

ولتوضيح كيف يدمج الإضافات والمتعاقدون والمضاعفون في تصميم أكبر، النظر في وحدة قياسية بسيطة يمكن أن تضيف أو تقتضي أو تضاعف قيمتين من 8 أرباع استنادا إلى إشارة مختارة:

entity alu is
 Port (
 A, B : in signed(7 downto 0);
 op : in std_logic_vector(1 downto 0); -- "00": add, "01": sub, "10": mul
 result : out signed(15 downto 0)
 );
end alu;

architecture Behavioral of alu is
begin
 process(A, B, op)
 begin
 case op is
 when "00" => result <= resize(A + B, 16); -- sign extend
 when "01" => result <= resize(A - B, 16);
 when "10" => result <= A * B;
 when others => result <= (others => '0');
 end case;
 end process;
end Behavioral;

ويعيد هذا الاتحاد استخدام سجل النتائج نفسه ويجمع بين العمليات الثلاث، وفي إطار توليفي، تنفذ كل عملية كقطعة منفصلة، مع اختيار الناتج من جانب مضاعف، وقد يكون المضاعف هو المسار الحاسم، تبعا للجهاز المستهدف.

استخدام العُصى الإلكترونية للشركة

وبالنسبة للعمليات المتقدمة (مثلا، نقطة العائمة، الجذر المربع، طريقة الاستخدام)، أو عندما تكون هناك حاجة إلى أقصى أداء، من المستصوب استخدام نواة شركاء التنفيذ التي يوفرها البائعون، وهي نماذج متطورة للغاية ومتحققة من نماذج المحاكاة، وفي VHDL، تقومون بتدقيق نواة من IP باعتبارها عنصرا، وترسمون إشاراتكم إلى موانئها.

  • Xilinx Floating-Point Operator] for add/sub/multiply/divide in IEE 754 format.
  • Altera (Intel) ALTMULT ADD] for multiply-add operations.
  • Lattice Divider] for fixed-point division.

ويقلل استخدام نواة شركاء التنفيذ من المخاطر، وكثيرا ما يؤدي إلى أداء أفضل من المكافئات المزودة باليد.

Intel FPGA IP Cores Guide]

الاختبار والتحقق

ويعد التبسيط أمراً حاسماً بالنسبة للتصميمات الحسابية، وكتابة اختبارات تمارس قضايا الزوايا: التدفق الزائد، صفر، القيم القصوى، والعلامات المختلطة (للأنواع الموقعة)، وفحص جميع مجموعات أصغر المدخلات للتحقق من الخوارزمية، واستخدام بيان ]] ] للتحقق من النتائج المتوقعة.

signal A, B : unsigned(3 downto 0);
signal Sum : unsigned(3 downto 0);
signal Cout : std_logic;
...
A <= "1100"; B <= "0011"; wait for 10 ns;
assert (Sum = "1111" and Cout = '0')
 report "Adder failed for 12 + 3" severity error;

وللاطلاع على التصميمات الأكبر، النظر في استخدام نماذج الحفز العشوائية والذهبية في كتابة اللغات (Python, Tcl) لتوليد ناقلات الاختبار.

VHDL Testbench Techniques (SynthWorks)]

خاتمة

وتنفيذ العمليات الحسابية في VHDL هو مزيج من الفهم الرقمي للحسابات، والاستخدام المميز لأنواع البيانات ومشغليها، والوعي بسلوك الأدوات التوليفية، والإضافة والمتعاقدون من الباطن متجهون مباشرة إلى استخدام من الأجهزة الرقمية [الرمزية:]، في حين أن المضاعفات تتطلب دراسة دقيقة للأداء والمساحة.

وللمزيد من القراءة، يرجى الرجوع إلى دليل المراجع الخاص باللغة الذي وضعته الشبكة الدولية للتعليم في مجال الصحة البشرية (EEEVHDL) وإلى الوثائق الخاصة بالبائعين بشأن الاختبار الحسابي.

IEE Std 1076-2008 VHDL Language Reference Manual]