Warning: Illegal string offset 'name' in [path]/includes/functions.php on line 6439
Bibliotekas elementārām darbībām
+

thread: Bibliotekas elementārām darbībām

  1. #1
    Senior Member
    Sep 2007
    205

    Bibliotekas elementārām darbībām

    Pieņemu, ka saskaros ar šo marazmu jo lietoju primitīvus datu tipus un minimālu bibliotēku skaitu.
    Lietojot Quartus, nevaru piemērm veikt reizināšanu std_logic_vector'am ar konstanti. * neeost definēts, tas pats ir ar nobīdes operācijām pa labi un pa kreisi.
    Elementāri izpildāmas operācijas nākas rakstīt ar roku:
    Piem reizināšanu ar 320, nācās sadalīt reizināšanā ar 64 un 256, pēctam realizēt kā nobīdi (jo nereizinājās pat ar 2 pakapēm), kura arī nestrādāja (līdz ar to vajadzēja pierakstīt kā vektoru piešķiršanu, kuras rezultāt bija nobīde):

    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    --USE ieee.std_logic_arith.all;
    USE ieee.numeric_std.all;
    USE ieee.std_logic_unsigned.all;

    .....

    addrgen: process (aclk)
    variable hcalc,vcalc : std_logic_vector(9 downto 0);
    variable vc256,vc64: std_logic_vector(17 downto 0);
    begin
    if rising_edge(aclk) then
    hcalc:=hcount-hsync-hback_porch-rectangle_hstart+1;
    vcalc:=vcount-vsync-vback_porch-rectangle_hstart;
    hcalc(8 downto 0):=hcalc(9 downto 1);
    hcalc(9):='0';
    vcalc(8 downto 0):=vcalc(9 downto 1);
    vcalc(9):='0';
    --addr<=hcalc+vcalc*320;
    --addr<=hcalc+vcalc*64+vcalc*256;
    vc256(17 downto :=vcalc(9 downto 0);
    vc256(7 downto 0):=(others=>'0');
    vc64(15 downto 6):=vcalc(9 downto 0);
    vc64(5 downto 0):=(others=>'0');
    vc64(17 downto 16):=(others=>'0');
    taddr<=hcalc+vc64+vc256;
    end if;
    end process addrgen;

    .....

    Vēl biju pārsteigst ka nav atļauta darbība x(3 downto 0)<=y(0 to 3), bet rakstīt x(3)<=y(0); x(2)<=y(1); x(1)<=y(2)...utt kompilējas bez problēmām.
    Līdzīga situācija ir ar dalīšanu ar divnieka pakāpēm utml.

    Vai ir nepieciešams lietot papildus bibliotekas, vai minētās darbības pierakstīt savādākā veidā nekā ierasts?
    Tā pat neloģiski likās, ka īsāku vektoru summu nevar piešķirt garākam vektoram/

  2. #2
    Senior Member
    Sep 2007
    205

    Re: Bibliotekas elementārām darbībām

    P.S.
    Signālam piešķirot signālu procesā:

    process (clk)
    begin
    if rising_edge(clk) then
    sig1<=sig2;
    end if;
    end process;

    Ja šī piešķiršana nenotiek nekur citur šie divi signāli tiek patstāvīgi savienoti, vai tiek buferēti un vērtība tiek nodota tikai pie augošās frontes, nevis kautkad piem starp clock'a impulsiem kad sig2 ir mainīga vērtība, bet sig1 tajā laikā jābūt stabilam.

  3. #3
    Junior Member
    Aug 2006
    18

    Re: Bibliotekas elementārām darbībām

    Sveiks!
    Zināšanai, definējot VHDL entity nav obligāti janorāda std_logic_vector, vai bit, tik pat labi var norādīt integer tipu, ja tu tā dari, tad reizināšana/ dalīšana ir atļauta ('*' un '/').

    library IEEE;
    use IEEE.std_logic_1164.all;
    use IEEE.std_logic_arith.all;
    use ieee.numeric_std.all;
    use ieee.numeric_bit.all;

    entity test is
    port
    (
    a : in integer;
    b : in integer;
    clk : in std_logic;
    c : out integer
    );
    end test;

    architecture test of test is

    begin
    process(clk,a,b)
    variable x : integer := 0;
    variable y : integer := 0;
    variable z : integer := 0;
    begin
    z := x*y;
    c <= a*b;
    end process;
    end architecture;

    Ja tomēr ieejā/ izeja nepieciešami std_logic_vector tad:

    šos pārbaudījis neesmu:

    x <= to_integer(signed(a));
    x <= to_integer(unsigned(a));

    Varētu būt, ka tādā gadījumā integer skaitlim būtu jābūt robežās starp (31 downto 0), 32. bits tiek izmantots zīmei

    Ar šo esmu reāli sastapies ( integer => std_logic_vector):

    c(15 downto 0) <= std_logic_vector(to_unsigned(x,16)); -- 16 - norāda, cik bitu liels vektors tik formeets

    Vari mēģināt googlē pameklēt - to_integer, conv_integer, utt

  4. #4
    Junior Member
    Aug 2006
    18

    Re: Bibliotekas elementārām darbībām

    Varētu būt, ka tādā gadījumā integer skaitlim būtu jābūt robežās starp (31 downto 0), 32. bits tiek izmantots zīmei



    kļūda, bija domāts - 30 downto 0.

+