2013-09-25 13 views
8

Nella simulazione questo funziona perfettamente. È questo il modo migliore per verificare gli zeri per un codice sintetizzabile. Quali sarebbero le risorse generate?Confronto tra un lungo std_logic_vector e gli zeri

signal vector_slv : std_logic_vector(2048 downto 0); 
... 
if (vector_slv = (vector_slv'range => '0')) then 
    -- do something... 

C'è qualche altro modo ottimale per implementare questa soluzione considerando la mappatura h/w (con utilizzo ottimale delle risorse).

Sarei più interessato a comprendere le risorse utilizzate.

risposta

5

Non c'è modo che abbia più o meno senso per la sintesi. Scrivi il codice che meglio esprime la tua intenzione.

Se si confronta un vettore per tutti gli zeri, i seguenti risultati dovrebbero tutti produrre gli stessi risultati oppure si dovrebbe presentare un bug grave contro lo strumento!

signal vector_slv : std_logic_vector(2048 downto 0); 
constant zeros : std_logic_vector(vector_slv'range) := (others => '0'); 
... 
if vector_slv = (vector_slv'range => '0') then 
    -- do something... 
if vector_slv = zeros then 
    -- do something... 
if unsigned(vector_slv) = to_unsigned(0, vector_slv'length) then 
    -- do something... 

anzi per vettori più brevi che si inseriscono in un numero intero:

if intvar = 0 then 

sarà esattamente lo stesso come qualsiasi vettore di confronto 32 bit.

(A proposito, notare non v'è alcuna necessità di parentesi per la condizione if - VHDL non è C :)

1

Per quanto riguarda la sintesi, sì, tali semplici costrutti sono generalmente ottimizzati abbastanza bene dallo strumento. L'esatta configurazione dell'hardware dipende ovviamente dall'obiettivo (FPGA, ASIC, ...).

Il mio suggerimento è di dare un'occhiata al risultato di sintesi (ad esempio, Technology Map Viewer per FPGA Altera). Se la sintesi lo cloba, puoi convertirlo manualmente in un albero binario di confronti con zero, tenendo conto delle primitive tecnologiche disponibili. Questo può essere molto più complicato di quanto sembri, anche se, specialmente per gli FPGA (c'è più di LUT con cui giocare lì), e non dovrebbe essere necessario con uno strumento decente.

6

Se l'intervallo è disponibile, come nel codice di esempio, la soluzione suggerita è valida e mi aspetto che gli strumenti di sintesi siano progettati per gestire le costruzioni come questa.

Se l'intervallo non è disponibile, quindi confrontare con zero può essere fatto come:

library ieee; 
use ieee.numeric_std.all; 
... 
    if unsigned({std_logic_vector expression of any length}) = 0 then 
    -- do something... 

Mi aspetterei che strumenti di sintesi gestire questo era lo stesso che per confrontare con (vector_slv'range => '0').