还请版主多多指点啊...


1) 数码管静态显示、动态显示及模为60的计数器显示效果如下:
2) 模为60的计数器,功能实现代码如下:
module modulo_60(sys_clk, sys_rstn, sm_seg, sm_bit);
//输入输出信号
input sys_clk;
input sys_rstn;
output [7:0] sm_seg;
output [7:0] sm_bit;
//寄存器定义
reg [7:0] sm_seg;
reg [7:0] sm_bit;
reg [3:0] tens; //十位数
reg [3:0] units; //个位数
reg [3:0] dataout_buf;
reg [31:0] scan_cnt; //扫描延时计数器
reg [31:0] delay_cnt; //延时计数器
reg disp_dat;
//逻辑部分
always @(posedge sys_clk or negedge sys_rstn)//动态扫描延时
begin
if(!sys_rstn)
scan_cnt <= 32'd0;
else
begin
if(scan_cnt==32'd49999)
scan_cnt <= 32'd0;
else
scan_cnt <= scan_cnt + 1'b1;
end
end
always @(posedge sys_clk or negedge sys_rstn)//模计数延时
begin
if(!sys_rstn)
delay_cnt <= 32'd0;
else
begin
if(delay_cnt==32'd49999999)
delay_cnt <= 32'd0;
else
delay_cnt <= delay_cnt + 1'd1;
end
end
always @(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
disp_dat <= 1'b0;
else
begin
if(scan_cnt==32'd49999)
disp_dat <= disp_dat + 1'b1;
else
disp_dat <= disp_dat;
end
end
always @(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
begin
units = 4'h0;
tens = 4'h0;
end
else
begin
if(delay_cnt==32'd49999999)
begin
units = units + 1'b1;
if(units==4'ha)
begin
units = 4'h0;
tens = tens + 1'b1;
if(tens==4'h6)
tens = 4'h0;
end
end
else
begin
units = units;
tens = tens;
end
end
end
always @(disp_dat)
begin
case(disp_dat)
1'b0: sm_bit = 8'b1111_1110;
1'b1: sm_bit = 8'b1111_1101;
default:
sm_bit = 8'b1111_1110;
endcase
end
always @(sm_bit)
begin
case(sm_bit)
8'b1111_1110: dataout_buf = units;
8'b1111_1101: dataout_buf = tens;
default:dataout_buf = 4'ha;
endcase
end
always @(dataout_buf)
begin
case(dataout_buf)
4'h0: sm_seg = 8'hc0;
4'h1: sm_seg = 8'hf9;
4'h2: sm_seg = 8'ha4;
4'h3: sm_seg = 8'hb0;
4'h4: sm_seg = 8'h99;
4'h5: sm_seg = 8'h92;
4'h6: sm_seg = 8'h82;
4'h7: sm_seg = 8'hf8;
4'h8: sm_seg = 8'h80;
4'h9: sm_seg = 8'h90;
4'ha: sm_seg = 8'h88;
default:
sm_seg = 8'hc0;
endcase
end
endmodule

5.8课后作业
按键消抖控制1位数码管循环显示0-9,代码如下:
module key_dt(sys_clk,
sys_rstn,
key_in,
sm_seg,
sm_bit);
input sys_clk;
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; //显示数据寄存器
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;
//按键脉冲边沿检测
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)
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);
//按键控制1位数码管循环显示0-9
always @(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
disp_dat <= 4'd0;
else if(key_low)
begin
disp_dat <= disp_dat + 1'b1;
if(disp_dat==4'h9)
disp_dat <= 4'd0;
end
else
disp_dat <= disp_dat;
end
always @(disp_dat)
begin
case(disp_dat)
4'h0: sm_seg = 8'hc0;
4'h1: sm_seg = 8'hf9;
4'h2: sm_seg = 8'ha4;
4'h3: sm_seg = 8'hb0;
4'h4: sm_seg = 8'h99;
4'h5: sm_seg = 8'h92;
4'h6: sm_seg = 8'h82;
4'h7: sm_seg = 8'hf8;
4'h8: sm_seg = 8'h80;
4'h9: sm_seg = 8'h90;
endcase
end
assign sm_bit = 8'b0111_1111;
endmodule
回复
打赏帖 | |
---|---|
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K146】S32DS RTD 驱动环境搭建被打赏12分 | |
【分享开发笔记,赚取电动螺丝刀】【IAR】libc标注库time相关库函数使用被打赏23分 | |
LP‑MSPM0L1306开发版试用结果被打赏10分 |