所以我正在设计一个串行平方器。我的程序采用一个基本的二进制计数器,并使用计数器的每个计数来计算串联的方块。当我尝试合成我的代码时,根据我如何安排我的代码,要么合成几乎无限运行,要么合成运行完全崩溃。所以我认为我无法更新我的信号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;
答案 0 :(得分:0)
r_final
的更新必须在时钟进程中,因此下一个值是通过同步(时钟)更新生成的,因为这是与可用硬件匹配的结构。
无法合成共享变量,但这是仅用于测试平台的功能。