这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 按键课程的作业

共5条 1/1 1 跳转至

按键课程的作业

助工
2014-06-11 20:44:13     打赏

按键课程的作业:按键控制数码管0到9显示。开发板上的数码管是共阴的,可能与大家的不同。另外复位脚连接的是开发板最上方的一个拨码开关。

这是实验现象:http://v.youku.com/v_show/id_XNzI0OTkxNTA4.html

/**************************************************************************

*Engineer: superdian   
*Create Date:   2014/6/11
*Design Name:   KEYXIAO 
*Module Name:   KEYXIAO
*Project Name:  KEYXIAO
*Target Devices: EP3CE5E144C8
*Tool versions: 
*Description: 按键控制数码管显示0到9.
******************************************************************************/
module KEYXIAO(sys_clk,sys_rstn,key_in,OUT);


input sys_clk;//时钟输入
input sys_rstn;//复位清零
input key_in;//按键输入
output [7:0] OUT;//数码管译码结果,并输出。


reg  [19:0] delay_cnt;
reg  [7:0]  OUT;
reg   [3:0] led_out;
wire  key_scan;
wire  key_low;
reg   key_samp;
reg   key_samp_r;
reg   key_rst;
reg   key_rst_r;


always@(posedge sys_clk,negedge sys_rstn)
   begin 
      if(!sys_rstn)
        key_samp<=1'b1;
      else 
        key_samp<=key_in;
    end 


always@(posedge sys_clk,negedge sys_rstn)
    begin
       if(!sys_rstn)
           key_samp_r<=1'b1;
       else
           key_samp_r<=key_samp;
    
         end
assign key_scan=key_samp_r&(~key_samp);


always@(posedge sys_clk,negedge sys_rstn)
      begin 
 if(!sys_rstn)
     delay_cnt<=20'h0;
else if (key_scan)
     delay_cnt<=20'h0;
else 
   delay_cnt<=delay_cnt+1'b1;
  end
always@(posedge sys_clk,negedge sys_rstn)
      begin 
          if(!sys_rstn)
       key_rst<=1'b1;
else if(delay_cnt==20'hfffff)
          key_rst<=key_in;
   end
 
always@(posedge sys_clk or negedge sys_rstn)        
begin
if(!sys_rstn)
key_rst_r<=1'b1;
else
key_rst_r<=key_rst;
end
assign key_low=key_rst_r&(~key_rst);


always@(posedge sys_clk or negedge sys_rstn) //按键按下
begin
if(!sys_rstn)
led_out<=4'b0000;
else if(key_low)

led_out<=led_out+1'b1; //按键按下次数记录
else if(led_out==4'b1010)//记录到10清零

led_out<=4'b0000;

else
led_out<=led_out;
end





always@(posedge sys_clk or negedge sys_rstn)//数码管译码,开发板上的数码管为共阴极,段码与讲师的有差异。
   begin 
     case(led_out)
            4'h0 : OUT=  8'h3F;   // "0"
4'h1 : OUT = 8'h06;   // "1"
4'h2 : OUT=  8'h5B;   // "2"
4'h3 : OUT = 8'h4F;   // "3"
4'h4 : OUT = 8'h66;   // "4"
4'h5 : OUT = 8'h6D;   // "5"
4'h6 : OUT = 8'h7D;   // "6"
4'h7 : OUT=  8'h07;   // "7"
4'h8 : OUT = 8'h7F;   // "8"
4'h9 : OUT = 8'h6F;   // "9"
4'ha : OUT = 8'h77;   // "a"
4'hb : OUT = 8'h7C;   // "b"
4'hc : OUT = 8'h39;   // "c"
4'hd : OUT = 8'h5E;   // "d"
4'he : OUT = 8'h79;   // "e"
4'hf : OUT = 8'h71;   // "f"
endcase 
   end
endmodule



关键词: 作业    

助工
2014-06-11 20:49:42     打赏
2楼

我感到这部分有对FPGA的资源的浪费,应该加上个default,如下。

always@(posedge sys_clk or negedge sys_rstn)//数码管译码,开发板上的数码管为共阴极,段码与讲师的有差异。

   begin 
     case(led_out)
            4'h0 : OUT=  8'h3F;   // "0"
4'h1 : OUT = 8'h06;   // "1"
4'h2 : OUT=  8'h5B;   // "2"
4'h3 : OUT = 8'h4F;   // "3"
4'h4 : OUT = 8'h66;   // "4"
4'h5 : OUT = 8'h6D;   // "5"
4'h6 : OUT = 8'h7D;   // "6"
4'h7 : OUT=  8'h07;   // "7"
4'h8 : OUT = 8'h7F;   // "8"
4'h9 : OUT = 8'h6F;   // "9"
default :OUT=  8'h3F;   // "0"
endcase 
   end 

助工
2014-06-11 20:53:46     打赏
3楼

再交一下上升沿检测的作业。

/**************************************************************************

*Engineer: superdian   
*Create Date:   2014/6/11
*Design Name:   Rise 
*Module Name:   Rise
*Project Name:  Rise
*Target Devices: EP3CE5E144C8
*Tool versions: 
*Description: 上升沿检测,检测到计数器清零。
******************************************************************************/
module Rise(Clk,Reset,Pluse,Counter);
input Clk;
input Reset;
input Pluse;
output reg[15:0] Counter ;
reg Pluse_r;
reg Pluse_r2;


always@(posedge Clk,negedge Reset)//D触发器对输入的脉冲延时两个时钟周期
     if(!Reset)
       begin 
       Pluse_r<=1'b0;
 Pluse_r2<=1'b0;
end
  else 
            begin 
          Pluse_r <=Pluse ;
 Pluse_r2<=Pluse_r;
end

reg fall_edge_en;


always@(posedge Clk,negedge Reset)
       if(!Reset)
      fall_edge_en<=1'b0;
else if(!Pluse<=Pluse_r)
    fall_edge_en<=1'b1;
else   
       fall_edge_en<=1'b0;
always@(posedge Clk,negedge Reset)
       if(!Reset)
          Counter <=16'b0;
   else if(fall_edge_en)
           Counter<=16'b0;
else 
           Counter<=Counter +1'b1;
endmodule

助工
2014-06-11 20:56:51     打赏
4楼
感觉随着课程的深入,代码越来越长了,结构也复杂多了,请版主及大家指正代码不规范的地方以及不足之处!

院士
2014-06-12 09:36:03     打赏
5楼
看看老师怎么判作业

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]