在VHDL中制作一个简单的功耗电路

在VHDL中制作一个简单的功耗电路,vhdl,xilinx,circuit,virtex,Vhdl,Xilinx,Circuit,Virtex,我正在寻找一些简单的想法,我可以用它来衡量权力。我只需要它来确保我的功率测量正常。我正在Virtex-6上使用Xilinx ISE 14.1。我想要一个简单的电路来写和合成 到目前为止,我尝试了一个1K位计数器,但这并不是很明显。我尝试了一个9K位的计数器,但ISE在合成它时遇到了麻烦(我让它运行了一个小时,然后才杀死它)。现在,我正在尝试实现大型BRAM并使其永久启用 我需要一种方法来限制大向量得到优化,所以我希望将所有位异或到一起,并将单个位输出馈送到LED。对于非常大的向量,有没有一种简单

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

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


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

在VHDL 2008中,您可以对一组位进行异或运算,如下所示:

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

narrow <= xor wide;
(未经测试,只是直接输入-可能需要调整语法!)


对于功耗,您可以尝试将交替的
'1'
'0'
模式输入移位寄存器而不是计数器,这样每个周期所有位都会改变。对移位寄存器进行重置,以确保工具不会推断SRL16的效率更高。

以下是我的想法。我觉得它为简单的代码和快速的编译时间提供了一个很好的折衷方案。它是一个移位器,每隔一位高,因此每个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;
top的架构行为是 信号移位器:标准逻辑向量(向下至0):=(其他=>“0”); 开始 过程(clk) 开始 如果(clk'事件和clk='1'),则
为了补充Martin的建议,请使用。。。生成循环以创建许多较小的xor类型组合。然后有一个地方,您可以将for循环的所有输出组合在一起,并连接到一个LED。如果您可以将设计分解为更小的部分,那么您就不太可能遇到地图/位置问题。另外,请记住使用同步(FF)和异步(LUT)元素的组合。@josh:在向量上使用for..generate vs a function vs
xor
函数将产生完全相同的结果。合成器将看到相同的逻辑,并对其进行优化。如果没有,那就是个错误是的,同意。他们很可能会一起去。使用您在for generate中显示的函数。@Josh-不需要generate-只需传入整个1000位向量(或不管它有多大),然后让工具来完成其余的工作。@Josh:您能解释一下为什么我要将sync和async元素组合在一起吗?如果您好奇的话,向计数器中添加位不会对功耗产生明显影响。不改变状态的位不会消耗很多能量,计数器中的第n位只会每2^n个时钟翻转一次。关于集成电路,尤其是FPGA的功耗,有很多文献,但最通用的模型是P=aCV^2f,其中P是功率,C是栅极电容,V是电压,f是频率。“a”项是一个介于0和1之间的活动因子,它定义了位翻转的频率。这应该比一个大的异或门更容易合成,因为每个移位器片只需要具有1的扇出和扇入。
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;