2010-11-13 47 views
0

我正在設計通用移位算術運算符。 除了以下述方式使用32位多路複用器(解碼器)之外,還有更好的方法來實現嗎?VHDL中的通用移位算術權利

ENTITY isra IS 
PORT (
    clk: in std_logic; 
    rst: in std_logic; 
    di:  in std_logic_vector (31 downto 0); 
    sel: in std_logic_vector (31 downto 0); 
    res: out std_logic_vector (31 downto 0) := (others => '0') 
); 
END isra; 


PROCESS 
    BEGIN 
    WAIT UNTIL clk'EVENT AND clk = '1'; 
    IF rst = '1' THEN 
     res <= (others => '0'); 
    ELSE 
    CASE sel IS 
     when X"00000001" => res <= to_stdlogicvector(to_bitvector(a) sra 1); 
     when X"00000002" => res <= to_stdlogicvector(to_bitvector(a) sra 2); 
     ... 
     when X"0000001F" => res <= to_stdlogicvector(to_bitvector(a) sra 31); 
     when others => res <= (others => '0'); 
    END CASE; 
END IF; 
END PROCESS; 
+1

demultiplexer?這裏沒有demux。 – 2010-11-13 21:24:28

+0

你是對的,我改變了描述。 thx指出這一點。 – name 2010-11-13 23:33:49

回答

1

使用索引?

PROCESS 
    VARIABLE shift_count : INTEGER RANGE 0 TO 31; 
BEGIN 
    IF rst = '1' THEN 
    res <= (others => '0'); 
    ELSIF RISING_EDGE(clk) THEN 
    shift_count := to_integer(sel); 
    FOR I IN 0 TO 31 LOOP 
     IF I + shift_count < 32 THEN 
     res(I) <= din(I + shift_count); 
     ELSE 
     res(I) <= din(31); -- for logical shift right, use '0' instead 
     END IF; 
    END LOOP; 
    END IF; 
END PROCESS; 

此版本更容易參數化爲通用。

請記住,VHDl是一種行爲描述,它沒有指定多路複用器。編譯器可以生成不同的設計,具體取決於您是否優化了大小,速度,允許流水線等。

請注意,5 2:1多路複用器可以在比單個32:1多路複用器小得多的區域內實現。如果這不是限制你的時鐘頻率的塊,那可能是更可取的。

另請注意,您的sel輸入太寬,只需要5位。

+0

Thx爲答案。我同意這是更通用的方法,使它更好。問題是,在我的情況下sel必須是32位寬,我認爲「shift_count:= to_integer(sel)」在這種情況下不起作用。正如你所說,這個設計中棘手的部分是使用聰明的解碼器 - 做32:1並不明智。你認爲堅持你的設計和使用sel(5 downto 0)是一個好主意嗎?另一件事是,如果出於性能方面的考慮,首先有異步是有好處的?謝謝。 – name 2010-11-13 23:23:10

+1

這是一個FPGA,對吧? FPGA的邏輯單元對每個D觸發器都有專門的異步復位輸入,因此無論是性能還是LE使用(它可能報告使用更多*門*)都不會造成任何損失,但這些門不能用於任何其他功能)。擁有更廣泛的'sel'總線不應該傷害任何東西,因爲'I + shift_count <32'測試會自動正確處理'shift_count'的任何值。 – 2010-11-14 06:20:47

+0

「如果我+ shift_count <32那麼」這很聰明! – name 2010-11-15 12:34:11

1
從硬件的角度來看

好了,在一個單一的時鐘右移可變數量的位置,每個位是單觸發器與基於選擇32個可能值之一。所以從這個角度來看,這是你如何做到的。

雖然,我會讓sel == 0一個案例,並使其成爲直通。從邏輯上講,這比將所有內容設置爲零更有意義。

+0

嗨,thx指出它。 case語句中的其他語句規定res信號寫入每個分支。這有助於綜合工具來防止創建鎖存器。 – name 2010-11-13 23:25:58

4

可以使用SRA功能沒有任何循環或case語句:你需要做SEL無符號,而不是std_logic_vector

res <= to_stdlogicvector(to_bitvector(di) sra to_integer(sel)); 

注:

sel: in unsigned (31 downto 0); 

在你所不懂的情況下,不要這樣,你仍然可以將sel轉換爲無符號。您還需要我們numeric_bit:

use ieee.numeric_bit.all;