VHDL向上/向下计数器

VHDL向上/向下计数器,vhdl,counter,updown,Vhdl,Counter,Updown,各位晚上好。首先,我要说我对VHDL非常陌生。我有一个项目,要求我用VHDL(任何好奇的人都可以使用MC14510B)对摩托罗拉公司生产的上下计数器进行建模 从数据表中可以看出,如果将输入PE(预设启用)切换为高,则输入引脚p4…p1处的4个预设值将直接传递到输出q4…q1 由于某种原因,我的代码拒绝编译,抛出错误:COMP96_0143:MC14510B.vhd:(56,13):无法写入对象“p”。我使用Aldec作为编译器,不知道我做错了什么。我不想写入p输入,我想用p中存储的值写入qtem

各位晚上好。首先,我要说我对VHDL非常陌生。我有一个项目,要求我用VHDL(任何好奇的人都可以使用MC14510B)对摩托罗拉公司生产的上下计数器进行建模

从数据表中可以看出,如果将输入PE(预设启用)切换为高,则输入引脚p4…p1处的4个预设值将直接传递到输出q4…q1

由于某种原因,我的代码拒绝编译,抛出错误:COMP96_0143:MC14510B.vhd:(56,13):无法写入对象“p”。我使用Aldec作为编译器,不知道我做错了什么。我不想写入p输入,我想用p中存储的值写入qtemp

有人能看到我把事情搞砸了吗?在process语句中,主if else语句中的else是给我带来问题的原因(p 0) qtemp:=qtemp-1; cotemp:='1'; 其他的 qtemp:=“0000”; cotemp:=“0”; 如果结束; 如果ci_not='0',则 qtemp:=“1010”; cotemp:='1'; 其他的 如果pe='1',则--启用预设
p你似乎有一个qtemp的任务,你有
p:=qtemp
并且应该有
qtemp敏感度列表?恐怕我不知道这意味着什么:/这是一个学习基本VHDL概念的好机会;试试这里:括号中的位:
进程(pe,ci_not,reset,updown,clk)
是敏感度列表。在进程结束时有一个隐含的
wait on pe,ci_not,reset,updown,clk;
语句。它将暂停进程执行,直到在其中一个信号上发生事务。与时钟一起,影响异步分配的任何内容都应该在敏感度列表中。在这种情况下,发生了什么ens如果P在PE为“1”时发生变化?如果灵敏度列表中没有P,则该变化将被忽略。灵敏度列表中似乎不需要updown或ci_。
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.std_logic_unsigned.all;

entity MC14510B is
  port (
    signal pe     : in    std_logic;
    signal ci_not : inout std_logic;
    signal reset  : in    std_logic;
    signal updown : in    std_logic;
    signal clk    : in    std_logic;
    signal p      : in    std_logic_vector (3 downto 0);
    signal q      : out   std_logic_vector(3 downto 0);
    signal co_not : inout std_logic
    );
end;

architecture myarch of MC14510B is
begin

  process(pe, ci_not, reset, updown, clk)
    variable qtemp  : std_logic_vector(3 downto 0);
    variable cotemp : std_logic;
  begin
    if reset = '1' then                                     --reset condition
      qtemp := "0000";
    elsif clk'event and updown = '1' and ci_not = '1' then  --count up
      if qtemp < 15 then
        qtemp  := qtemp + 1;
        cotemp := '1';
      else
        qtemp  := "0000";
        cotemp := '0';
      end if;
    elsif clk'event and updown = '0' and ci_not = '1' then  --count down
      if qtemp > 0 then
        qtemp  := qtemp - 1;
        cotemp := '1';
      else
        qtemp  := "0000";
        cotemp := '0';
      end if;
    elsif ci_not = '0' then
      qtemp  := "1010";
      cotemp := '1';
    else
      if pe = '1' then                                      --enable preset
        p      <= qtemp;                                    --output = input presets
        cotemp := '1';
      else
        qtemp  := qtemp;                                    --output = output
        cotemp := '1';
      end if;
    end if;
    q      <= qtemp;
    co_not <= cotemp;
  end process;
end myarch;