打印

我用erilog HDL语言谢了一个按键计数、显示及发声电路。

[复制链接]
1821|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
your790522128|  楼主 | 2014-6-11 18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是EPM3064芯片,下面的程序是实现用一位数码管显示按键的操作次数0-9,每按下一次按键数码管显示加1,蜂鸣器发出“滴”响声,当加到9时回到0。我将程序下载到学习板,按键按一下,数码管显示,加一,但是蜂鸣器一直响。我觉得程序应该能实现的,但不知道是什么问题。
module cntkey(key,clk,seg,sound);
input key;
input clk;
output [6:0] seg;
output sound;
reg sound;
reg [7:0] seg;
reg [16:0] cnt;
reg [19:0] cnt20;
wire carry;
assign carry=key;
integer  i;
always@(posedge clk)//用的是20Mhz晶振,分成1hz,蜂鸣器响1s。
begin
     if(carry)
     begin
      for(i=1;i<4500;i=i+1'b1)
      begin
      for(i=1;i<4500;i=i+1'b1)
         begin
         cnt20<=cnt20+1'b1;
         end
         end
         sound=~sound;
         cnt20<=20'd0;
      end
end
always@(posedge key)
    begin
      if(cnt==4'b1001)
         cnt<=4'b0000;
      else
         cnt<=cnt+1'b1;
     end
always@(cnt)
   begin
case(cnt)
  4'b0000:seg<=8'b11000000;
  4'b0001:seg<=8'b11111001;
  4'b0010:seg<=8'b10100100;
  4'b0011:seg<=8'b10110000;
  4'b0100:seg<=8'b10011001;
  4'b0101:seg<=8'b10010010;
  4'b0110:seg<=8'b10000010;
  4'b0111:seg<=8'b11111000;
  4'b1000:seg<=8'b10000000;
  4'b1001:seg<=8'b10010000;
  default:seg<=8'b10000000;
  endcase
  end
  endmodule

相关帖子

沙发
jomanliang| | 2014-6-12 10:23 | 只看该作者
程序少了一个复位初始化.不知你板子的按键平常状态是高还是低.蜂鸣器是有源还是无源的.?.cnt20有什么用延时的话用这种延时比for好.
parameter T100US = 20'd5_000;
always@(posedge clk)
begin
      if(cnt20 == T100US)
         cnt20 <= 1'b0;
       else
          cnt20 <= cnt20 + 1'b1;

使用特权

评论回复
板凳
your790522128|  楼主 | 2014-6-12 12:52 | 只看该作者
jomanliang 发表于 2014-6-12 10:23
程序少了一个复位初始化.不知你板子的按键平常状态是高还是低.蜂鸣器是有源还是无源的.?.cnt20有什么用延时 ...

我的按键平常状态是高电平,蜂鸣器是有源的。我知道用计数器延时啊,但是我是想实现按一下按键,数码管显示及蜂鸣器响1秒,就是一次驱动两个计数器,一个40MHz晶振分频计数器,一个4位二进制计算器用来选择显示译码。

使用特权

评论回复
地板
your790522128|  楼主 | 2014-6-12 13:10 | 只看该作者
your790522128 发表于 2014-6-12 12:52
我的按键平常状态是高电平,蜂鸣器是有源的。我知道用计数器延时啊,但是我是想实现按一下按键,数码管显 ...

我将你的延时程序直接代替我原本的延时程序,然后我再把sound=~sound;放在cnt20<=1'b0;后面,板子一上电,蜂鸣器还是响个不停。你说是不是分40Mhz的计数器,不受按键的控制,一上电就开始计数,所以就响个不停。

使用特权

评论回复
5
your790522128|  楼主 | 2014-6-12 13:11 | 只看该作者
jomanliang 发表于 2014-6-12 10:23
程序少了一个复位初始化.不知你板子的按键平常状态是高还是低.蜂鸣器是有源还是无源的.?.cnt20有什么用延时 ...

我将你的延时程序直接代替我原本的延时程序,然后我再把sound=~sound;放在cnt20<=1'b0;后面,板子一上电,蜂鸣器还是响个不停。你说是不是分40Mhz的计数器,不受按键的控制,一上电就开始计数,所以就响个不停。

使用特权

评论回复
6
jomanliang| | 2014-6-12 14:42 | 只看该作者
always@(posedge clk)//用的是20Mhz晶振,分成1hz,蜂鸣器响1s。
begin
     if(carry)
     begin
      for(i=1;i<4500;i=i+1'b1)
      begin
      for(i=1;i<4500;i=i+1'b1)
         begin
         cnt20<=cnt20+1'b1;
         end
         end
         sound=~sound;
         cnt20<=20'd0;
      end
end
按我对你这段代码的理解是当你不按按键时,蜂鸣器一直在叫.按下按键后就不叫了.(我个人喜欢无源的蜂鸣器,高低电平控制就可以了.不用PWM,虽然它够响)

使用特权

评论回复
7
your790522128|  楼主 | 2014-6-12 23:33 | 只看该作者
jomanliang 发表于 2014-6-12 14:42
always@(posedge clk)//用的是20Mhz晶振,分成1hz,蜂鸣器响1s。
begin
     if(carry)

我用我的程序下载到板子上的确是你所说的。按下就不响了

使用特权

评论回复
8
your790522128|  楼主 | 2014-6-12 23:37 | 只看该作者
jomanliang 发表于 2014-6-12 14:42
always@(posedge clk)//用的是20Mhz晶振,分成1hz,蜂鸣器响1s。
begin
     if(carry)

那应该怎样写才能实现按一下按键,蜂鸣器才能响一秒钟呢?

使用特权

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

本版积分规则

3

主题

16

帖子

0

粉丝