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 |