需要变量还是信号?

时间:2016-04-25 20:23:59

标签: variables signals vhdl

所以我正在设计一个串行平方器。我的程序采用一个基本的二进制计数器,并使用计数器的每个计数来计算串联的方块。当我尝试合成我的代码时,根据我如何安排我的代码,要么合成几乎无限运行,要么合成运行完全崩溃。所以我认为我无法更新我的信号r_final => r_final + r_min1,因为我记得在vhdl中不是一个东西。所以我决定将r_final设置为变量而不是信号。我不确定如何将r_final声明为变量。任何人都可以提供一些有关我如何让r_final自行更新的见解吗?

这是我的主要代码,有问题的部分是在评论下 - 下一个状态逻辑:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity serial_square is
    port(
    clk, reset: in std_logic;
    q: out std_logic_vector (3 downto 0));
end serial_square;

architecture behavioral of serial_square is
    signal r_reg : unsigned (3 downto 0) := "0000";
    signal r_next : unsigned (3 downto 0);
    signal r_2i : unsigned (3 downto 0); 
    signal r_min1 : unsigned (3 downto 0);
    shared variable r_final : unsigned := "0000";

begin
-- register
    process(clk,reset)
    begin
        if (reset='1') then
            r_reg <= (others => '1');
        elsif (clk'event and clk='1') then 
            r_reg <= r_final;
            end if;
    end process;
        -- next state logic
        r_next <= r_reg +1; -- r_reg + 1
        r_2i <= r_next(2 downto 0) & '0'; -- multiply by 2
        r_min1 <= r_2i - 1; -- minus one
        r_final := r_min1 + r_final; -- add r_min1 to r_final, output should be the count r_next, squared.
        --output logic
        q <= std_logic_vector(r_reg);
end behavioral;

1 个答案:

答案 0 :(得分:0)

r_final的更新必须在时钟进程中,因此下一个值是通过同步(时钟)更新生成的,因为这是与可用硬件匹配的结构。

无法合成共享变量,但这是仅用于测试平台的功能。