2012-05-11 55 views
0

我創建具有類似於以下需要額外LE的VHDL函數?

-- Control Register Address Type Declaration 
    SUBTYPE ctrl_reg_addr_type IS std_logic_vector(ADDR_BITS-1 DOWNTO 0); 
    -- Control Register Data Type Declaration 
    SUBTYPE ctrl_reg_data_type IS std_logic_vector(DATA_BITS-1 DOWNTO 0); 
    -- Control Register Type Declaration 
    SUBTYPE ctrl_reg_word_type IS std_logic_vector(CTRL_BITS-1 DOWNTO 0); 

    -- Left/Right Line-In Control Type Declarations 
    CONSTANT LINE_IN_VOL_BITS : integer := 5; 

    SUBTYPE line_in_volume_type IS natural 
    RANGE 0 TO (2**LINE_IN_VOL_BITS)-1; 

    TYPE line_in_ctrl_type IS RECORD 

     -- Left/Right Channel Line Input Volume (4:0) 
     -- Registers: LINVOL/RINVOL 
     -- 0x1F = +12.0dB 
     -- ... = 1.5dB steps 
     -- 0x00 = -34.5dB 
     -- 0x17 - 0dB (Default) 
     volume : std_logic_vector(LINE_IN_VOL_BITS-1 DOWNTO 0); 
     -- Left/Right Channel Line Input Mute to ADC (7) 
     -- Registers: LINMUTE/RINMUTE 
     -- 0x1 = Enable Mute 
     -- 0x0 = Disable Mute 
     mute : std_logic; 
     -- Left/Right Channel Line Input Volume and Mute Load (8) 
     -- Registers: LRINBOTH/RLINBOTH 
     -- 0x1 = Enable Simultaneous Load of LINVOL/LINMUTE <-> RINVOL/RINMUTE 
     -- 0x0 = Disable Simultaneous Load 
     both : std_logic; 

    END RECORD line_in_ctrl_type; 

多個定義我想用類似以下的記錄類型中修改字段的功能包。

-- Left/Right Line-In Increase Volume Function Body 
    FUNCTION increase_volume(ctrl : line_in_ctrl_type) 
    RETURN line_in_ctrl_type IS 

     VARIABLE volume : line_in_volume_type := 0; 
     VARIABLE tmp : line_in_ctrl_type; 

    BEGIN 

     tmp := ctrl; 
     volume := natural(to_integer(unsigned(ctrl.volume))); 

     IF (volume < line_in_volume_type'HIGH) THEN 

      volume  := volume + 1; 

      tmp.volume := std_logic_vector(
           to_unsigned(volume, LINE_IN_VOL_BITS)); 

     END IF; 

     RETURN (tmp); 

    END FUNCTION increase_volume; 

    -- Left/Right Line-In Increase Volume Function Body 
    FUNCTION increase_volume(ctrl : line_in_ctrl_type; 
           step : natural) 
    RETURN line_in_ctrl_type IS 

     VARIABLE volume : line_in_volume_type := 0; 
     VARIABLE tmp : line_in_ctrl_type; 

    BEGIN 

     tmp := ctrl; 
     volume := natural(to_integer(unsigned(ctrl.volume))); 

     IF (volume < (line_in_volume_type'HIGH - step)) THEN 

      volume  := volume + step; 

      tmp.volume := std_logic_vector(
           to_unsigned(volume, LINE_IN_VOL_BITS)); 

     ELSE 

      tmp := increase_volume(tmp); 

     END IF; 

     RETURN (tmp); 

    END FUNCTION increase_volume; 

我的問題是,將使用類似於所示示例的函數使用更多的LE,而不是顯式修改記錄值。

+0

屬於上http://codereview.stackexchange.com? –

+0

感謝您的評論,我會研究這個資源。 – trialUnplugged

+0

沒問題 - http://stackoverflow.com是針對特定的編程問題 - http://codereview.stackexchange.com是代碼審查等 –

回答

1

在VHDL中使用函數非常抽象(因爲VHDL應該是這樣)。它可以和RTL差不多,你可以得到。這意味着詢問LE中的哪些內容非常難以確定。它主要依賴於綜合工具以及它們如何挑選出邏輯結構。

的函數被合成更像一個宏。每次調用它時,都可能最終實例化同一個邏輯塊的另一個實例。你多久打一次電話?

爲了實現高效的LE使用,您需要編寫重用功能塊的代碼。例如編寫一個通用結構讀/寫引擎並使用它一次,但將輸入和輸出路由到/到各個地方。

如果您擔心LE的使用,並且仍然想使用函數,我建議考慮您是否擁有足夠大的FPGA。

+0

感謝您的意見!我想我會比較RTL輸出使用兩種類型的實現供我參考。 – trialUnplugged

+0

這不是一個真正的答案 - 你應該不接受它。接受差的答案不會鼓勵人們回答問題。你的問題的基本答案是'不',除非你有一個非常差的合成器,但這取決於。馬丁的答案好多了。 – EML

1

使用這樣的函數只需簡單地將一個邏輯負載包裝成一個方便的形式。

如果您獲得明顯不同的邏輯用法,與複製/粘貼相比,請記錄綜合供應商的錯誤。