打印

VHDL编程碰到一个小问题,请教

[复制链接]
1832|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tigris|  楼主 | 2009-3-5 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想写一个小程序,读按键是否被按下,用到下面这个进程。不过编译的时候总是出现错误,刚学VHDL,不会解决....

process(key_push,clk2)
begin         
  if (key_push='1' and Clk2='1') then ---这一句报错,不知道如何解决
   cnt2<=cnt2+1;
   else null;
  end if;
end process;
      

相关帖子

沙发
worrior_1| | 2009-3-5 16:10 | 只看该作者

VHDL编程碰到一个小问题,请教

你赋值的时候应该用:=或者<=看你定义的Key_push 和Clk2是什么类型的,是signal型,还是variable型

使用特权

评论回复
板凳
tigris|  楼主 | 2009-3-5 18:39 | 只看该作者

~~

都是signal的  当有按键按下且延时20ms后,key_push就赋予1.  这个进程是想当key_push变成1后,cnt2+1。  cnt变化,小灯就变化。不过失败了 呵呵

使用特权

评论回复
地板
何苦| | 2009-3-5 22:15 | 只看该作者

程序太少

把整个程序关键部分贴进来,别人才能帮你分析

使用特权

评论回复
5
tigris|  楼主 | 2009-3-6 10:16 | 只看该作者

程序就是想,按一次键改变一次小灯状态

entity LED1 is
port(Clk        :in  std_logic;
      Rst    :in  std_logic;
      Key1    :in  std_logic;
      buzz    :out std_logic;
      Ledout    :out std_logic_vector(7 downto 0) );
end LED1;


architecture Behavioral of led1 is
      signal Cnt    : std_logic_vector(3 downto 0);
      signal Clk_cnt    : std_logic_vector(21 downto 0);
      signal key_cnt    : std_logic_vector(20 downto 0);
      signal Clk2    : std_logic;
      signal cnt2    : std_logic_vector(1 downto 0);
      signal Led_t1    : std_logic_vector(7 downto 0);
      signal Key    : std_logic;
      signal key_push    : std_logic;
begin

process(Rst,Clk)    ----时钟分频,将40Mhz时钟分频 得到clk2
begin
  if Rst='0' then
   Clk_cnt<=(others=>'0');
   Clk2<='0';
  elsif  Clk'event and Clk='1' then
    if   Clk_cnt="1111111111111111111111" then
    Clk2<=not Clk2;
    Clk_cnt<=(others=>'0');
    else
      Clk_cnt<=Clk_cnt+1;
    end if;
    end if;
end process;



process(Clk)         ----按键消除抖动进程
begin
  if(clk'event and clk='1')then
    key<=Key1;
    if(key='1')then
    key_cnt<=(others=>'0');
    elsif(key_cnt(20)='0')then
        key_cnt<=key_cnt+1;
    end if;
   end if;
end process;    
                
key_push<=key_cnt(20); --将按键信息赋予key_push



process(key_push,clk2)--啊,啊这个进程太难把握了.....使得按键总有冲突
begin         
  if (key_push='1' and clk2='1') then
    cnt2<=cnt2+1;
    else null;
    end if;
    end process;
      


 led_t1<="01000001" when cnt2="00" else--小灯随cnt2改变而改变
    "11000011" when cnt2="01" else
    "11000111" when cnt2="10" else
    "11001111";

Ledout<=Led_t1;  --把led信号传给小灯输出
 buzz<='1';  --嗡鸣器


end Behavioral;

使用特权

评论回复
6
tigris|  楼主 | 2009-3-6 12:04 | 只看该作者

发现问题了

哪句话的括号用的是全角的,所以有问题了,不好意思,耽误大家时间了

使用特权

评论回复
7
Joys| | 2009-3-7 18:12 | 只看该作者

所以最好用英文注释

哈哈

使用特权

评论回复
8
sleepybear| | 2009-3-13 10:26 | 只看该作者

……代码风格……

PROCESS(clk2)
BEGIN         
  IF clk2='event AND clk2 = '1' THEN
    IF key_push='1' THEN
     cnt2<=cnt2+1;
    END IF;
  END IF;
END PROCESS;

使用特权

评论回复
9
至尊宝| | 2009-3-19 10:55 | 只看该作者

呵呵,支持楼上

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

175

帖子

0

粉丝