2012-08-17 38 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