好的,谢谢大老王。嘿嘿。
led_display实验一作业:拨码开关进行八进制数显示。led_key.zip
代码:
module led_key(sys_clk,key,sm_seg,sm_bit);
//输入输出信号
input sys_clk; //全局时钟 50Mhz
input[7:0] key; //按键输入
output[7:0] sm_seg;//数码管段码
output[7:0] sm_bit;//数码管位码
//寄存器定义
reg[7:0] sm_seg;//数码管段码输出寄存器
wire[7:0] sm_bit;//数码管位码输出寄存器
reg[3:0] key_dat;//显示数据寄存器
//*wire型数据常用来表示以assign为关键字组合逻辑信号,reg型为寄存器数据类型,常用来表示always模块内指定信号,常代表触发器。*/
//逻辑部分
always@(posedge sys_clk or negedge key )
begin
case (key)
8'hff:key_dat=4'h0;
8'hfd:key_dat=4'h1;
8'hfb:key_dat=4'h2;
8'hf7:key_dat=4'h3;
8'hef:key_dat=4'h4;
8'hdf:key_dat=4'h5;
8'hbf:key_dat=4'h6;
8'h7f:key_dat=4'h7;
endcase
end
always@(key_dat)
begin
case (key_dat)
4'h0:sm_seg=8'hf9;//"1"
4'h1:sm_seg=8'ha4;//"2"
4'h2:sm_seg=8'hb0;//"3"
4'h3:sm_seg=8'h99;//"4"
4'h4:sm_seg=8'h92;//"4"
4'h5:sm_seg=8'h82;//"6"
4'h6:sm_seg=8'hf8;//"7"
4'h7:sm_seg=8'h80;//"8"
endcase
end
/*begin...end类似于C语言里面的{}*/
assign sm_bit=8'b00000000 ;
endmodule
作业:模60的计数器。
module led_60cnt(sys_clk,sys_rstn,sm_seg,sm_bit);
//输入输出端口
input sys_clk;//50Mhz时钟
input sys_rstn;//复位信号
output [7:0] sm_seg;//数码管段码
output [1:0] sm_bit;//数码管位码
//寄存器定义
reg[7:0] sm_seg;//数码管段码输出寄存器
reg[1:0] sm_bit;//数码管位码输出寄存器
reg[25:0] delay_1S;//1s的延时计数器
reg[15:0] scan_1kHz;//short 1khz扫描
reg disp_dat;//位选计数器
reg[3:0] unit;//个位
reg[3:0] decade;//十位
reg[4:0] data_buf;//数据位
//初始化
/*initial
begin
delay_1S<=26'd0;
scan_1kHz<=16'd0;
disp_dat<=4'd0;
unit<=4'd0;
decade<=4'd0;
end
*/
//逻辑部分
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
begin
unit<=4'h0;
decade<=4'h0;
end
else
begin
if(delay_1S==26'd49999999)
begin
unit<=unit+1'h1;
if(unit==4'h9)
begin
unit<=4'h0;
decade<=decade+1'b1;
if(decade==4'h5)
begin
decade<=4'h0;
end
end
end
else
begin
unit<=unit;
decade<=decade;
end
end
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
delay_1S<=26'd0;
else
begin
if(delay_1S==26'd49999999)
delay_1S<=26'd0;
else delay_1S<=delay_1S+1'b1;
end
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
scan_1kHz<=16'd0;
else
begin
if(scan_1kHz==16'd49999)
scan_1kHz<=16'd0;
else scan_1kHz<=scan_1kHz+1'b1;
end
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
begin
disp_dat<=1'd0;
end
else
begin
if(scan_1kHz==16'd49999)
disp_dat<=disp_dat+1'b1;
else
disp_dat<=disp_dat;
end
end
always@(disp_dat)
begin
case(disp_dat)
1'b0:sm_bit=2'b10;
1'b1:sm_bit=8'b01;
default:sm_bit=8'hfb;
endcase
end
always@(sm_bit)
begin
case(sm_bit)
2'b10:data_buf=unit;
2'b01:data_buf=decade;
endcase
end
always@(data_buf)
begin
case(data_buf)
4'h0:sm_seg=8'hc0;//"0"
4'h1:sm_seg=8'hf9;//"1"
4'h2:sm_seg=8'ha4;//"2"
4'h3:sm_seg=8'hb0;//"3"
4'h4:sm_seg=8'h99;//"4"
4'h5:sm_seg=8'h92;//"4"
4'h6:sm_seg=8'h82;//"6"
4'h7:sm_seg=8'hf8;//"7"
4'h8:sm_seg=8'h80;//"8"
4'h9:sm_seg=8'h90;//"9"
4'ha:sm_seg=8'h88;//"a"
4'hb:sm_seg=8'h83;//"b"
4'hc:sm_seg=8'hc6;//"c"
4'hd:sm_seg=8'ha1;//"d"
4'he:sm_seg=8'h86;//"e"
4'hf:sm_seg=8'h8e;//"f"
default: sm_seg=8'h00;
endcase
end
endmodule
按键篇:作业一 按键控制数码管0~9显示
这次作业是基于led_display改的,参考版主的按键程序,没有消抖,按键每次按下去不能正确的出现数字。
代码:
module led_8key(sys_clk,sys_rstn,key_in,sm_seg,sm_bit);
//输入输出信号
input sys_clk; //全局时钟 50Mhz
input sys_rstn; //复位信号
input key_in; //按键输入
output[7:0] sm_seg;//数码管段码
output[7:0] sm_bit;//数码管位码
//寄存器定义
reg[7:0] sm_seg;//数码管段码输出寄存器
wire[7:0] sm_bit;//数码管位码输出寄存器
reg[3:0] disp_dat;//显示数据寄存器
/*wire型数据常用来表示以assign为关键字组合逻辑信号,reg型为寄存器数据类型,常用来表示always模块内指定信号,常代表触发器。*/
//逻辑部分
/*begin...end类似于C语言里面的{}*/
initial
disp_dat<=4'd0;
always@(posedge sys_clk or negedge sys_rstn)always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
disp_dat<=4'd0;
else
if(!key_in)
begin
disp_dat<=disp_dat+1'd1;
if(disp_dat==4'h9)
disp_dat<=4'h0;
end
else
disp_dat<=disp_dat;
end
always@(disp_dat)
begin
case(disp_dat)
4'h0:sm_seg=8'hc0;//"0"
4'h1:sm_seg=8'hf9;//"1"
4'h2:sm_seg=8'ha4;//"2"
4'h3:sm_seg=8'hb0;//"3"
4'h4:sm_seg=8'h99;//"4"
4'h5:sm_seg=8'h92;//"4"
4'h6:sm_seg=8'h82;//"6"
4'h7:sm_seg=8'hf8;//"7"
4'h8:sm_seg=8'h80;//"8"
4'h9:sm_seg=8'h90;//"9"
default: sm_seg=8'hff;
endcase
end
assign sm_bit=8'b1111_1110;
endmodule
//输入输出信号
input sys_clk; //全局时钟 50Mhz
input sys_rstn; //复位信号
input key_in; //按键输入
output[7:0] sm_seg;//数码管段码
output[7:0] sm_bit;//数码管位码
output led_out;
//寄存器定义
reg[7:0] sm_seg;//数码管段码输出寄存器
wire[7:0] sm_bit;//数码管位码输出寄存器
reg[3:0] disp_dat;//显示数据寄存器
reg[19:0] delay_cnt;
wire key_scan;
wire key_low;
reg key_samp;
reg key_samp_r;
reg key_rst;
reg key_rst_r;
reg led_out;
/*wire型数据常用来表示以assign为关键字组合逻辑信号,reg型为寄存器数据类型,常用来表示always模块内指定信号,常代表触发器。*/
//逻辑部分
/*begin...end类似于C语言里面的{}*/
initial
disp_dat<=4'd0;
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_samp<=1'b1;
else key_samp<=key_in;
end
always@(posedge sys_clk or 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);
//延时20ms
always@(posedge sys_clk or 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 or negedge sys_rstn)
begin
if(!sys_rstn)
key_rst<=1'b1;
else if (delay_cnt==20'hfffff) //约20ms
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)
begin
disp_dat<=4'd0;
led_out<=1'd1;
end
else
if(key_low)
begin
led_out<=~led_out;
if(disp_dat==4'h9)
disp_dat<=4'h0;
else
disp_dat<=disp_dat+1'd1;
end
else
begin
disp_dat<=disp_dat;
led_out<=led_out;
end
end
always@(disp_dat)
begin
case(disp_dat)
4'h0:sm_seg=8'hc0;//"0"
4'h1:sm_seg=8'hf9;//"1"
4'h2:sm_seg=8'ha4;//"2"
4'h3:sm_seg=8'hb0;//"3"
4'h4:sm_seg=8'h99;//"4"
4'h5:sm_seg=8'h92;//"4"
4'h6:sm_seg=8'h82;//"6"
4'h7:sm_seg=8'hf8;//"7"
4'h8:sm_seg=8'h80;//"8"
4'h9:sm_seg=8'h90;//"9"
default: sm_seg=8'hff;
endcase
end
assign sm_bit=8'b1111_1110;
endmodule
基本上根据版主的代码改的,我还需要消化哈。消抖后的确效果很好。led等和数码管同时提示按键效果。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |