# FPGA, CPLD, 74xx loģikas >  Bibliotekas elementārām darbībām

## cobalt

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/

----------


## cobalt

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.

----------


## rich

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

----------


## rich

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.

----------

