硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3158|回复: 2
收起左侧

CPLD570实验二:按键滤波检测

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2013-2-2 21:06:37 | 显示全部楼层 |阅读模式
说明:1. 发现有些工程做仿真有点麻烦,还是直接下载到CPLD里面比较方便。
          2.  不过作为初学者,还是试着写了个一个功能仿真。
          3. 这里有一个很重要的方法,就是脉冲边沿检测法,这个方法很好,需要好好掌握


module KEY(
   clk,
    key,
    led
);
input[5:0]key;
output[5:0]led;
input clk;

/*
********************************************************************                                   
*           脉冲边沿检测,只要出现下降沿就产生一个高脉冲
********************************************************************
*/
reg[5:0] key_value;

always @(posedge clk )
    begin
        key_value <= key;
    end

reg[5:0] key_value_r;   

always @ ( posedge clk)
    begin   
        key_value_r <= key_value;
    end
   
//当寄存器key_value由1变为0时,led_edge的值变为高,维持一个时钟周期
wire[5:0] key_edge = key_value_r & ( ~key_value);

/*
********************************************************************                                   
*             脉冲边沿检测,只要出现下降沿就产生一个高脉冲
********************************************************************
*/
reg[19:0]  cnt;    //计数寄存器
always @ (posedge clk)
    begin
        if(key_edge) cnt <=20'd0;
        else cnt <= cnt + 1'b1;
    end
  
reg[5:0] low_sw;
always @(posedge clk)
   if (cnt == 20'hfffff)
   low_sw <= key;

//每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中   
reg  [5:0] low_sw_r;      
always @ (posedge clk)
   low_sw_r <= low_sw;
   
//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期
wire[5:0] led_ctrl = low_sw_r[5:0] & ( ~low_sw[5:0]);

/*
********************************************************************                                   
*           实现LED的翻转功能
********************************************************************
*/
reg d1=0;
reg d2=0;
reg d3=0;
reg d4=0;
reg d5=0;
reg d6=0;

always @ (posedge clk)
        begin        //某个按键值变化时,LED将做亮灭翻转
        if ( led_ctrl[0] ) d1 <= ~d1;   
        if ( led_ctrl[1] ) d2 <= ~d2;
        if ( led_ctrl[2] ) d3 <= ~d3;
          if ( led_ctrl[3] ) d4 <= ~d4;
        if ( led_ctrl[4] ) d5 <= ~d5;
          if ( led_ctrl[5] ) d6 <= ~d6;
      end

assign led[0] = d1 ? 1'b1 : 1'b0;        //LED翻转输出
assign led[1] = d2 ? 1'b1 : 1'b0;        
assign led[2] = d3 ? 1'b1 : 1'b0;        
assign led[3] = d4 ? 1'b1 : 1'b0;        
assign led[4] = d5 ? 1'b1 : 1'b0;
assign led[5] = d6 ? 1'b1 : 1'b0;   

endmodule

测试模块,功能仿真的结果有点问题
`timescale 1 ns/ 1 ps
`define clk_cycle 10
module KEY_vlg_tst();

// test vector input registers
reg clk;
reg [5:0] key;
// wires                                               
wire [5:0]  led;

// assign statements (if any)                          
KEY i1 (
// port map - connection between master ports and signals/registers   
    .clk(clk),
    .key(key),
    .led(led)
);

initial                                                
    begin                                                  
   key = 6'b11_1111;
   clk = 0;
   #100_000_000 key = 6'b01_1111;
   #50_000_000  key = 6'b11_1111;
   #50_000_000  $stop;   
    end
                                                
always  #`clk_cycle  clk = ~clk;
                                                  
endmodule
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
 楼主| 发表于 2013-2-2 21:27:25 | 显示全部楼层
1.jpg
2.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
 楼主| 发表于 2013-2-2 21:29:05 | 显示全部楼层
功能仿真没有检测到有按键按下,以后有时间再做,实际测试是没问题的。
3.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 05:46 , Processed in 0.259476 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表