我需要设计一个模数" n"计数器与通用参数。我无法修复将保存输出的std_logic_vector的长度。首先,我在数字类型上使用airthmetic运算符时遇到错误。其次,我不允许在向量的范围规范中使用动态表达式。到目前为止,这是我的代码:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.math_real.all;
entity counter_mod is
generic(n: integer range 1 to integer'right);
port(clk,reset,load:in std_logic;
data_in:in std_logic_vector(ceil(log2(1.0*n))-1 downto 0);
q:out std_logic_vector(ceil(log2(1.0*n))-1 downto 0));
end counter_mod;
architecture behavioral of counter_mod is
begin
process(clk,reset,load)
variable count:std_logic_vector(ceil(log2(1.0*n))-1 downto 0):=(others=>'0');
begin
if(reset='1') then
count:=(others=>'0');
else if(load='1') then
count:=data_in;
else if(clk'event and clk='1') then
if(conv_integer(count)=n-1) then
count:=0;
else
count:=count+1;
end if;
end if;
end if;
end if;
q<=count;
end process;
end architecture;
答案 0 :(得分:6)
一些建议:
必须将ceil(log2(1.0*n))
更改为natural(ceil(log2(real(n))))
才能解决问题
类型不匹配
必须将count := 0
更改为count := (others => '0')
,因为它不是
可以直接将0
分配给std_logic_vector
。
可以将integer range 1 to integer'right
更改为positive
,因为使用了。{
standard
包类型明确说明意图
可以将变量声明中的范围更改为data_in'range
,因为使用了。{
VHDL属性明确说明意图
可能会将if(conv_integer(count)=n-1) then
更改为if (count = n-1) then
,
因为使用时不需要conv_integer
ieee.std_logic_unsigned.all
可能会将if(...) then
更改为if ... then
,因为()
不需要if
if
因为clk'event and clk = '1'
是一个陈述而不是一个函数
可以将rising_edge(clk)
更改为std_logic_1164
,因为使用了。{
else if
包函数明确说明意图
可能会更改elsif
使用library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.math_real.all;
entity counter_mod is
generic(n : positive);
port(clk, reset, load : in std_logic;
data_in : in std_logic_vector(natural(ceil(log2(real(n))))-1 downto 0);
q : out std_logic_vector(natural(ceil(log2(real(n))))-1 downto 0));
end counter_mod;
architecture behavioral of counter_mod is
begin
process(clk, reset, load)
variable count : std_logic_vector(data_in'range) := (others => '0');
begin
if reset = '1' then
count := (others => '0');
elsif load = '1' then
count := data_in;
elsif rising_edge(clk) then
if count = n-1 then
count := (others => '0');
else
count := count+1;
end if;
end if;
q <= count;
end process;
end architecture;
以获得更清晰,更简洁的详细信息
式
然后可以将代码更新为:
ieee.std_logic_unsigned
考虑将ieee.numeric_std.all
更改为ieee.std_logic_unsigned
ieee
不是标准包,所以在...中的位置
if
库有误导性。它需要将内部if to_integer(unsigned(count)) = n-1 then
count := (others => '0');
else
count := std_logic_vector(unsigned(count)+1);
end if;
更改为:
{{1}}