2012-08-17 41 views
2

我正在尋找一些簡單的東西,我可以用它來測量功率。我只需要它來確保我的功率測量工作正常。我在Virtex-6上使用Xilinx ISE 14.1。我想要一個簡單的電路來編寫和綜合。使一個簡單的電路消耗VHDL的功率

到目前爲止,我嘗試了一個1K位的計數器,但那不是很明顯。我嘗試了一個9K位計數器,但是ISE在合成它時遇到了麻煩(我在運行一小時之前殺死它)。現在我正在嘗試實施大型BRAM並保持它們永久啓用。

我需要一種方法來限制大型矢量得到優化,所以我想把所有的比特放在一起,並將單比特輸出送到LED。有一個簡單的方法來做到這一點非常大的載體?

+0

如果您好奇,向您的櫃檯添加位數應該不會對功耗產生明顯的影響。不改變狀態的位不會消耗太多的能量,而且你的計數器中的第n位只會每2^n個時鐘週期翻轉一次。 有很多對功耗文獻的在IC中和FPGA特別,但最通用的模型是 P = ACV^2F ,其中P是功率,C爲柵極電容,V是電壓, f是頻率。 「a」項是一個介於0和1之間的活動因子,它定義了位翻轉的頻率。 – Graeme 2012-08-20 22:47:21

回答

0

這是我想出來的。我覺得它爲簡單的代碼和快速的編譯時間提供了一個很好的折中方案。它是一個移位器,其他位都是高電平的,因此每個FF應該在每個時鐘週期進行切換(設置完成後)。如果需要,信號可以在開始時初始化,但根據您的時鐘,信號不應超過一秒或兩秒才能達到平衡。我使用led作爲輸出來防止電路的優化。

architecture Behavioral of top is 
signal shifter : std_logic_vector(<insert size> downto 0) := (others => '0'); 
begin  
     process(clk) 
    begin 
     if(clk'event and clk = '1')then 
      shift_bit <= not shift_bit; 
       shifter <= shift_bit & shifter(shifter'high downto 1); 
     end if; 
    end process; 

led <= shifter(0); 
end Behavioral; 
+0

這比合成一個大的異或門要容易得多,因爲每個移位器片只需要扇出1和扇出1。 – Stuart 2012-08-21 00:30:48

2

2008年VHDL可以異或一串比特這樣的:

signal wide : std_logic_vector(1000 downto 0); 
signal narrow : std_logic; 

narrow <= xor wide; 

不知道ISE支持。

你可以使用這樣的功能:

function xor_vector(i:std_logic_vector) returns std_logic is 
    variable ret:std_logic:=i(i'low); 
begin 
    for c in i'low+1 to i'high loop 
    ret := ret xor i(c); 
    end loop; 
    return ret; 
end function; 

(未經測試,只需鍵入直 - 可能需要語法調整!)

對於功耗,你可以嘗試飼養交流'1''0'模式進入一個移位寄存器而不是一個計數器 - 那麼所有的位都會在每個週期中改變。對移位寄存器進行重置,以確保這些工具不會推斷SRL16效率更高。

+0

要添加到Martin的建議,請使用for ... generate循環來創建許多更小的xor類型組合。然後有一個地方可以將for循環的所有輸出組合在一起,並連接到一個LED。如果您可以將設計分解爲更小的部分,那麼您將不太可能遇到地圖/展示位置問題。另外,請記住使用同步(FF)和異步(LUT)元素的組合。 – Josh 2012-08-17 10:47:37

+0

@josh:在矢量上使用for..generate vs函數與'xor'函數會產生完全相同的結果。合成器將看到相同的邏輯,並且對其進行優化。如果沒有(恕我直言)這是一個錯誤 – 2012-08-17 11:13:36

+0

是的,同意。他們可能會一起去。使用您在for-generate中顯示的功能。 – Josh 2012-08-17 11:19:01