Pogosta vprašanja in odgovori

Spremljajte odgovore na pogosto zastavljena vprašanja, ki se pojavljajo pri načrtovanju vezij v jeziku VHDL. Za prikaz odgovora kliknite na vprašanje. Vprašanja lahko pošljete avtorju in kakšen izmed odgovorov bo objavljen tudi na tej strani.

1. Množenje z decimalnimi števili

Kako naj 8-bitni celoštevilki vektor množim s številom 0,2?
Prvi korak je pretvorba decimalnega števila v dvojiško vrednost z želeno natančnostjo. Npr. vrednost 0,2 zapišemo z 8 decimalkami tako, da vrednost pomnožimo z 256: 0,2 * 256 = 51 oz. 0011 0011 dvojiško. Nato naredimo celoštevilski produkt:

signal k, m: std_logic_vector(7 downto 0);
signal p: std_logic_vector(15 downto 0);
...
k <= "00110011";
p <= k * m;

Zgornjih 8 bitov produkta p(15 downto 8) predstavlja celi del rezultata, ostali biti pa decimalni del.

2. Pretvorba iz binarne v bcd vrednost

V splošnem je pretvorba v kombinacijski obliki kar zapletena, pri manjšem območju vrednosti (npr. med 0 in 100) pa je najlažji način zapis zaporedja if stavkov:

if vhod > 99 then
  stotice <= '1';
else
  stotice <= '0';
end if;
if vhod < 10 then
  desetice <= "0000"; -- 0
  enice <= vhod;
elsif vhod < 20 then
  desetice <= "0001"; --1
  enice <= vhod - 10;
elsif vhod < 30 then
  desetice <= "0010"; -- 2
  enice <= vhod - 20;
...
end if;

3. Celoštevilsko deljenje

Deljenje je nekoliko bolj zapletena operacija, ki jo sintetizator vezja ne zna narediti, čeprav VHDL pozna operator / za cela števila. Obstaja cela vrsta algoritmov deljenja in principov kako narediti vezja za deljenje. Najbolj enostaven je algoritem, ki deluje podobno, kot če bi delili s svinčnikom in papirjem: od delitelja zaporedoma odštevamo pomaknjen deljenec tako da začnemo pri najvišjem bitu deljenca in nadaljujemo do najnižjega. Na koncu dobimo celoštevilski kvocient in celoštevilski ostanek. Tu je primer kode za deljenje dveh 4 bitnih vektorjev, ki jo lahko enostavno modificiramo za poljubno število bitov:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity deli is
    port ( a : in std_logic_vector(3 downto 0);
           b : in std_logic_vector(3 downto 0);
           k : out std_logic_vector(3 downto 0));
end deli;

architecture Behavioral of deli is
 signal b1, r1, d1, r2, d2, r3, d3, r4, d4: std_logic_vector(4 downto 0);
begin

  b1 <= '0' & b;
 
 d: process(a, b1, r1, d1, r2, d2, r3, d3, r4, d4)
 begin

  d1 <= ("0000" & a(3)) - b1;
  if d1(4)='0' then
    r1 <= d1;
    k(3) <= '1';   
  else
    r1 <= "0000" & a(3);
    k(3) <= '0';
  end if;

  d2 <= (r1(3 downto 0) & a(2)) - b1;
  if d2(4)='0' then
    r2 <= d2;
    k(2) <= '1';   
  else
    r2 <= r1(3 downto 0) & a(2);
    k(2) <= '0';
  end if;

  d3 <= (r2(3 downto 0) & a(1)) - b1;
  if d3(4)='0' then
    r3 <= d3;
    k(1) <= '1';   
  else
    r3 <= r2(3 downto 0) & a(1);
    k(1) <= '0';
  end if;

  d4 <= (r3(3 downto 0) & a(0)) - b1;
  if d4(4)='0' then
    r4 <= d4;
    k(0) <= '1';   
  else
    r4 <= r3(3 downto 0) & a(0);
    k(0) <= '0';
  end if;

 end process;

end Behavioral;
Načrtovanje vmesnika