【问题标题】:Counters VHDL multiplexer 7 segment计数器 VHDL 多路复用器 7 段
【发布时间】:2013-11-29 20:53:34
【问题描述】:

我是 VHDL 新手,我的代码可能看起来很愚蠢,但我仍在苦苦挣扎。 我正在尝试使用 Spartan 3 套件制作 BCD 计数器。 我在复用 7 段时遇到问题,我知道我应该使用组件 但我选择了更简单的方法。 我在综合中收到此错误:“第 103 行:过程敏感度列表中缺少一个或多个信号”。为了启用 FPGA/CPLD 硬件的合成,XST 将假定所有必要的信号都存在于灵敏度列表中。请注意,综合结果可能与初始设计规范不同。缺失的信号是: 任何帮助表示赞赏。谢谢。

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity lab5 is
  port (clk      : in  std_logic;
        x        : in  std_logic;
        --count : inout  STD_LOGIC_VECTOR (3 downto 0);
        data_out : out std_logic_vector (6 downto 0);
        an       : out std_logic_vector (3 downto 0)
        );

end lab5;

architecture Behavioral of lab5 is
  signal counter    : std_logic_vector (3 downto 0) := (others => '0');
  signal prescaler  : std_logic_vector (25 downto 0);
  signal prescaler2 : std_logic_vector (11 downto 0);
  signal counter2   : std_logic_vector (1 downto 0) := (others => '0');
begin

  CounterProcess : process(CLK, x)
  begin
    --prescaler is used as a clock slower to increment the counter every 50M cycles(1 sec)
    if rising_edge(CLK) then
      if prescaler < "10111110101111000010000000" then
        prescaler <= prescaler+1;

      else
        prescaler <= (others => '0');
        if x = '0' then
          if counter = "1001" then
            counter <= "0000";
          else
            counter <= counter+1;
          end if;
        else
          if counter = "0000" then
            counter <= "1001";
          else
            counter <= counter-1;
          end if;
        end if;
      end if;
    end if;

  end process;

--count<=counter;

  Sevensegclock : process(CLK)
  begin
    if rising_edge(CLK) then
      --scale clock to count(which will be the segment selector) every 1024 cycle
      if prescaler2 < "010000000000" then
        prescaler2 <= prescaler2+1;

      else
        prescaler2 <= (others => '0');
        if counter2 = "11" then
          counter2 <= "00";
        else
          counter2 <= counter2+1;
        end if;
      end if;
    end if;

  end process;

  sevenseg : process(counter2, clk)
  begin
    --counter the segment selector used to activate selector and decode data
    if counter2 = "00" then
      an <= "1110";
      if counter(0) = '0' then
        data_out <= "0000001";
      else
        data_out <= "1001111";
      end if;

    end if;

    if counter2 = "01" then
      an <= "1101";
      if counter(1) = '0' then
        data_out <= "0000001";
      else
        data_out <= "1001111";
      end if;
    end if;

    if counter2 = "10" then
      an <= "1011";

      if counter(2) = '0' then
        data_out <= "0000001";
      else
        data_out <= "1001111";
      end if;
    end if;

    if counter2 = "11" then
      an <= "0111";
      if counter(3) = '0' then
        data_out <= "0000001";
      else
        data_out <= "1001111";
      end if;
    end if;

  end process;

end Behavioral;

【问题讨论】:

    标签: vhdl spartan seven-segment-display


    【解决方案1】:

    从一个开始,每个流程确定它是否实现 顺序元素(触发器)或组合元素(门)。

    实现顺序元素(触发器)的流程模板, 没有异步复位,可以:

    process (clk) is
    begin
      if rising_edge(clk) then
        -- Code for assign to flip-flop outputs at rising edge
      end if;
    end process;
    

    实现组合元素(门)的流程模板,可以 是:

    process (all) is  -- "all" make sensitivity on all used signals
    begin
      -- Code for assign to gate outputs
    end process;
    

    请注意,(all) 仅可用于 VHDL-2008 语法,否则用于以前的 VHDL 版本语法在敏感度列表中明确列出所有信号

    匹配其中一个模板使合成工具确定如何 实现 VHDL 代码中描述的设计。但是,如果代码匹配 没有模板,那么合成工具可能有困难 确定如何在 FPGA 中实现 VHDL 代码,结果可能是 错误消息,就像你得到的那样。

    基于模板,进程Sevensegclock实现了一个顺序 元素(触发器),这个过程应该没有问题。

    但是,进程 CounterProcesssevenseg 不匹配任何一个 顺序或组合元素的模板。

    对于进程CounterProcess,看起来你想实现一个 顺序元素(触发器),但敏感度列表包含x。这 解决方案可能是从敏感度列表中删除x

    对于进程sevenseg,看起来你想实现一个组合 元素(门),但灵敏度列表并未涵盖所有使用的信号 在进程中,甚至包括进程中未使用的clk。 如果您使用 VHDL-2008,解决方案是将敏感度列表替换为 (all),如果使用以前的 VHDL 版本,则制作敏感度列表 覆盖进程中用到的所有信号(counter2, counter)

    免责声明:我没有检查代码的逻辑正确性 过程;所以以上只是给出一些关于如何写作的一般指导 以在 FPGA 中制作不同类型的设计元素。

    【讨论】:

      猜你喜欢
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多