library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.numeric_std.all;
- 实体部分包含R,用于寄存器
的输出entity register_16 is
port( input: in std_logic_vector(15 downto 0);
ld, inc, clk, clr: in std_logic;
R: buffer std_logic_vector(15 downto 0));
end register_16 ;
- 必须并行处理
architecture behavioral of register_16 is
begin
reg: process (input, ld, clk, clr)
variable R_temp : std_logic_vector(15 downto 0);
begin
if (clr='1') then
R_temp := b"0000000000000000";
elsif (clk'event and clk='1') then
if (ld='1') then
R_temp := input;
end if;
end if;
R <= R_temp;
end process reg;
- 我在此步骤中的错误
inc_R: process (inc)
begin
R <= R+'1';
end process inc_R;
end behavioral ;
- 主要流程(reg)正常工作 - 但是其他进程因添加1而出错。
答案 0 :(得分:9)
您必须将向量转换为整数并再返回,这是一个示例:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
signal in : std_logic_vector( 7 downto 0 );
signal out : std_logic_vector( 7 downto 0 );
out <= std_logic_vector(to_unsigned(to_integer(unsigned( in )) + 1, 8));
关于类型转换的好照片,请看这里:
答案 1 :(得分:6)
很抱歉,您的代码存在很多问题......
R <= R + 1;
通过您的代码,我收集到您正在尝试使用递增,加载和清除信号来编写计数器。我不只是想给你代码(这会破坏你的学习经验),而是尝试使用以下模板将整个计数器整合到一个进程中:
process(clk) begin
if(rising_edge(clk)) then
-- Your code here vvv
if(clr = '1') then
elsif(ld = '1') then
elsif(inc = '1') then
end if;
-- Your code here ^^^
end if;
end process;
答案 2 :(得分:0)
你在两个进程中都写了R.这导致了无法合成的多驱动器情况。为了解决它,结合这些过程,例如:
reg: process (clk, clr)
variable R_temp : std_logic_vector(15 downto 0);
begin
if (clr='1') then
R_temp := b"0000000000000000";
elsif (clk'event and clk='1') then
if (ld='1') then
R_temp := input;
elsif (inc='1') then
R_temp := R_temp + '1';
end if;
end if;
R <= R_temp;
end process reg;
答案 3 :(得分:0)
您应该可以添加包含值1的向量,因为您正在使用numeric_std库:
R <= R + x"0001";
答案 4 :(得分:0)
我使用了以下库,并且能够执行类似的操作
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
...
signal cnt : std_logic_vector(3 downto 0);
begin
process(clk, reset, ce, cnt)
begin
if(reset = '1') then
cnt <= "0000";
elsif(clk'event and clk='1') then
if(ce='1') then
if(cnt = "1001") then
cnt <= "0000";
else
cnt <= cnt + 1;