2

我正在寻找一些可以用来测量功率的简单写法的想法。我只需要它来确保我的功率测量工作正常。我在 Virtex-6 上使用 Xilinx ISE 14.1。我想要一个简单的电路来编写和合成。

到目前为止,我尝试了一个 1K 位的计数器,但这并不是很明显。我尝试了一个 9K 位计数器,但 ISE 在合成它时遇到了麻烦(我让它运行了一个小时才杀死它)。现在我正在尝试实现大型 BRAM 并使其永久启用。

我需要一种方法来限制大向量得到优化,所以我想将所有位异或一起并将单个位输出提供给 LED。对于非常大的向量,有没有一种简单的方法可以做到这一点?

4

2 回答 2

2

在 VHDL 2008 中,您可以像这样对一堆位进行异或运算:

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 更有效。

于 2012-08-17T10:16:23.437 回答
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;
于 2012-08-21T00:29:08.043 回答