gpt4 book ai didi

generics - 模数通用计数器

转载 作者:行者123 更新时间:2023-12-05 00:25:44 26 4
gpt4 key购买 nike

我需要设计一个带有通用参数的模“n”计数器。我无法修复将保存输出的 std_logic_vector 的长度。首先,我在数字类型上使用算术运算符时出现错误。其次,我不允许在向量的范围规范中使用动态表达式。到目前为止,这是我的代码:

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;

最佳答案

一些建议:

  • 必须改ceil(log2(1.0*n))natural(ceil(log2(real(n)))) , 讲话
    类型不匹配
  • 必须改count := 0count := (others => '0') ,因为它不是
    可以分配 0直接到 std_logic_vector .
  • 可改integer range 1 to integer'rightpositive ,由于使用standard包装类型明确意图
  • 可以将变量声明的范围更改为 data_in'range ,由于使用
    VHDL 属性明确表达意图
  • 可改if(conv_integer(count)=n-1) thenif (count = n-1) then ,
    conv_integer使用时不需要ieee.std_logic_unsigned.all
  • 可改if(...) thenif ... 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_unsignedieee.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;

    关于generics - 模数通用计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23882781/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com