VHDL'de Arithmetic Operasyonları Anlamak

VHDL (VHSIC Hardware Description Language), ekleyiciler, ekstraktörler ve multipliers uygulama için sağlam bir destek sağlar ve bunları her iki simülasyon ve sentez için nasıl verimli bir şekilde tasarlayın.Bu makale bu tür operasyonların ayrıntılı, dijital sinyal işlemcileri (DSPs), ve kontrol birimlerini kapsar. Arithmetic bloklar, ekstra optimizasyon teknikleri.

Belirli bileşenlere dalmadan önce, arithmetici etkinleştiren iki anahtar VHDL paketlerini anlamak önemlidir:0)Egz (Dönetici)[Döneticileri ve [[Döneticileri)[Döneticileri tanımlayanlar[Döneticileri değiştirmişler ve/veyaler) ve bu tür bir paketler ile ilişkili olmayan bir şekilde ayarlanmışlar.

Bu makaledeki tüm kod örnekleri [[Dönetici:0)IEEE 1076-2008 [Dönetici] uyumlu VHDL ve hedef Xilinx veya Intel (Altera) FPGA cihazları, ancak kavramlar herhangi bir dijital tasarım akışına uygulanır.

VHDL'de ekers

Ekleme en temel aritik işlemdir. VHDL'de, çeşitli soyutlama seviyelerinde eklentiler uygulayabilirsiniz: davranışsal (gödüşüküm:0) +), veri akışı (şimdilikli sinyal atama) veya yapısal (daha düşük seviyeli bileşenler)

Basit Ripple-Carry Adder

Bir dalga-karry eker zincirleri birlikte tüm ekerleri, her bir bitin gerçekleşmesinin bir sonraki daha yüksek bitin yerini besler. Aşağıdaki örnek, 4bit unsigned ripple-carry adder using a behavior process:

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;

Anahtar noktaları:

  • Koncatenasyon:0)('0' & A)) girişleri 5 bit uzatıyor, taşımayı ele geçiriyor.
  • [FONT:0][Dönetici] doğrudan ► (Dönetici) ile yapılır.([FONTD:0) Operatör, uygun ek mantığı (tip-karry, taşıma-gözlülük, LUT-based in FPGAs).
  • Süreç duyarlılığı listesi, herhangi bir değişiklikte hemen sürüm güncellemelerini sağlamak (ulusal davranışlar).

(CLA)

Daha geniş eklemeler için (örneğin, 16-bit veya 32-bit), ripple-carry adders, taşıma aracı nedeniyle önemli bir gecikme sunar.[Döneticileri değiştir][Döneticileri[Dönlendirmeler[Döneticileri değiştir][Dönlendirmeler[Dönlendirmeler[Dönlendirmeler[Dönlendirmeler)

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;

Overflow Tespiti ile Adder

Sonuç olarak, girişlere dayanan beklenen işareti eşleştirilmediğinde, aşağıdaki parçalar eklenmiş bir eklentiyi gösterir: Overflow, girişte belirtilen işareti eşleştirir.Influence aLUs.The following fikstürler imzalanır: Overflow algılama ile imzalanır:

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'de Alt Giyim

Subtraction ya da doğrudan kullanımla uygulanabilir:0)- operatör veya ikinizin de sona erdiğini minareye eklenerek.

Doğrudan Davranış Subtractor

En basit çıkartmalar, B > A'nın; böyle durumlarda, bir alt akışı tespit etmemiz gerekir (borrow). Aşağıdaki örnek hem fark hem de bir ödünç bayrağı döndürür:

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;

Not the conversion toETHFLT:0) Orta hesaplama için[Dönetici: 0)[[[Dönetici:0)) Bu, negatif farklılıkları doğru bir şekilde ele geçirebilmeye olanak sağlar.The most important bit (temp diff(4)

Subtractor İki'nin Tamamını Kullanıyor

Alternatif olarak, B'nin iki tamamını ekleyerek çıkarmanızı deneyebilirsiniz. Bu teknik, ALU'da mevcut bir eklentiyi yeniden kullanarak yaygındır. B'nin tamamlanması şöyle hesaplanır:0) B) + 1[FLT 1:0).

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

Her iki yöntem de sentez dostudur; tasarımınızın mimari tercihlerini oynayan birini seçin.

Karşılaştırma ve Subtraction

Altlamalar genellikle koaratorları uygulamak için kullanılır. Farkın ödünç alınması veya işareti inceleyerek, A > B, A < B veya A = B, özel bir kotaratör olmadan. Örneğin, sonuçta sıfır (tüm bitler) varsa, girişler eşittir.

VHDL'de Multipliers

Multiplikasyon, ek veya çıkarmadan daha yoğun bir kaynaktır. VHDL, [[Dönder:0) *[Dönemli ve imzalanmamış türler için operatördür, bu da kombinasyonlu multiplier için yapılır.

Kombinasyon Multiplier

4-bit multiplier using theurFLT:0)* operatör önemsizdir:

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;

Bu, bir FPGA'nın tipik olarak özel DSP dilimleri (örneğin Xilinx DSP48 bloklar gibi) veya LUT tabanlı mantıkla birleştirebileceği bir kombinasyonlu multiplieri oluşturur.Influier, çoğu FPGA araçları tek bir DSP'ye çok fazla uygulama gösterebilir.

Sequential Multiplier (Shift-and-Add)

Bölge tarafından yapılan tasarımlar veya kombinasyon gecikme kabul edilemez olduğunda, bazılarında dikkat edilen bir çok basitleştiricidir: Klasik geçiş-ve-add algoritmayı N saat döngüleri üzerinde iki N-bit sayı. Aşağıda basitleştirilmiş bir örnek (4-bit çokluplier, açıklığa kavuşturulabilir):

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;

Bu tasarım, saat döngüsüne (dörtbit giriş için dört döngü) bir L-bit ek kullanır. Bölgeyi kurtarır, ancak onput ve latency ile feda eder.

Borulu Multiplier

Yüksek kodlu uygulamalar için, bir boru hattı çok basit eklemeler kombinasyonel multiplikasyonun aşamaları arasında kayıt yaptırır. Birçok FPGA sentez araçları, boru hatları kayıt eklediğinizde otomatik olarak çok basit bir boru hattı oluşturabilir. Örneğin, aENFLT:0'ı kullanarak ... 'i) döngü veya manuel aşamaz:

-- 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;

Bu basit iki aşamalı yaklaşım çiftleri transkript (bir saat ilk geç saatler sonra) ancak bir ekstra kayıt katmanı ekleyerek. Daha fazla aşama daha yüksek saat frekansları için eklenebilir.

DSP Slices kullanarak

Modern FPGA'lar, DSP'nin çoklulaştırma ve birikimi için yapılandırılan katılığa sahiptir. VHDL'de, [[DFLT:0) *) genellikle otomatik olarak bu blokları yapar.DSP'nin yönlendirmesini sağlamak için, satıcı yönergeleri takip edebilirsiniz:DSP48E1[DQ:3, 18x18, 18x25), sonuçta büyük ilişki operatörlerin kullanılması ve uygun genişlikte kullanılması tercih edilir.For Xilinx 7, aynı zamanda satıcıyı da kullanabilirsiniz.

[FONT=0)Xilinx Vivado Synthesis Guide[Dön 1: 1]

Optimizasyon Teknikleri ve Synthesis Tahminleri

VHDL'de arithmetici işlemleri uygulandığında, sonuçlar kalitesini etkileyen birkaç faktör:

  • [FONT=0)Data Genişlik:[Dönetici:[Dönetici:0)[Dönetici:0)[Döneme:0)[Döneme:0)[Döneme:0)[Döneme:0)[Dönetici:0)[Döne:0)[Döneme:0)[Döneme:0)[Döneme:0|Döneme:
  • [FONT:0]Synthesis Attributes:[DÜT:1) Uygulama özellikleri [FONTD:2) bakım), [[DÜye Olmayanlar[[DÜye Olmayanlar İçindekiler:)
  • [FONT:0)Kaynak Paylaşımı:[Döneticiler aynı eklentiyi veya çok basit bir şekilde kullanırsa, ortak bir bileşen veya birden fazla girişle yeniden donatılabilir.
  • [[Dönlendirme:0)Pipelining:[Dönetici:[Dönlendirmeler için kayıt kayıt kayıt kayıtlar yapılır.For katkı zincirleri için, kayıt yerleştirmeyi uzun bir tarama yollarından kaçınmak için dengelemeyi dengelemeyi dengelemek.
  • [FONT:0) İmzalanan vs:[Dönetici: 1) UseETHFLT:2 İmzalanan işlemler için[Döneticiler için)[Dönetici) işlemine imza atan, MSB'yi bir işaret olarak ele geçirecektir.
  • [FONT=0)Carry Chains:[Dönderler için, taşıma zinciri FPGA'larda özel bir kaynaktır.Profesyonel olmayan orta sinyalleri kullanarak zinciri kırmayın.

Operasyonları Kombine: ALU Örnek

Adders, çıkarıcılar ve multipliers daha büyük bir tasarıma entegre edilmiş, basit bir Arithmetic Mantık Birimi (ALU) eklemek, çıkarmak veya bir sinyale dayanan iki 8-bit değerleri çoğaltmak.

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;

Bu ALU aynı sonucu tekrarlıyor ve üç operasyonu birleştirir. sentezde, her operasyon birden fazlaxer tarafından seçilen çıktı ile ayrı bir blok olarak uygulanır. Hedef cihaza bağlı olarak, multiplier kritik bir yol olabilir.

IP Cores for Komplek Arithmetic

Gelişmiş operasyonlar için (örneğin, yüzen nokta, kare kök, modüllo), veya maksimum performans gerektiğinde, satıcıya sunulan IP çekirdeklerini kullanmak tavsiye edilir ve doğrulanmış simülasyon modellerini alır. VHDL'de, sinyalleri limanlarına haritalayın.

  • [FONT:0)Xilinx Floating-Point Operatör) IEEE 754 formatında eklemek / yayın / çok/divide için.
  • [FONT:0)Altera (Intel) ALTMULT ADD[D][D][/FONT=0) tekrar tekrar işlemleri için.
  • [0]Lattice Bölücü[[Dön nokta bölünmesi için).

IP çekirdeklerini kullanarak, el kodlamalı eşdeğerlerden daha iyi performansta risk ve sık sık sonuçlar elde eder.Reer to the satıcılar documents for anlıkiation şablonlar.

[FONT:0)Intel FPGA IP Cores Guide).

Test ve Doğrulama

Simülasyon, arithmetic tasarımları için kritiktir.Testbenches that egzersiz köşesi vakaları: Overflow, zero, maximum values ve karışık işaretler (çok sayıda imzalı tipler için). En küçük girişlerin algoritmayı doğrulamak için tüm kombinasyonlarını test edin.[Dörttt: 0)

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;

Daha büyük tasarımlar için, rastgele stil ve altın modelleri senaryolama dillerinde kullanmayı düşünün (Python, Tcl) test vektörleri üretmek.

[FONT=0)VHDL Testbench Teknikleri (SynthWorks)).

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

VHDL'deki arithmetic operasyonlarının uygulanması, dijital arithmetici, veri türlerinin ve operatörlerin ve sentez araç davranışının farkındalığının geliştirilmesini gerektirir. Adders ve ekstratörler kullanımında basittir, kaynak paylaşımı ve DSP inference, gerçek dünya donanımını optimize ederken.

Daha fazla okuma için, IEEE VHDL Dil Referans Kılavuzu ve satıcıya özel bir dokümantasyona danışın.

[0]IEEE Std 1076-2008 VHDL Dil Referans Kılavuzu).