Matematiksel Modelleme Mühendislikte
Vhdl'deki Arithmetic Operasyonları Uygulama: Adders, Subtractors ve Multipliers
Table of Contents
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).