还请版主多多指点啊...
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
回复
我要赚赏金打赏帖 |
|
|---|---|
| PCF8574功能模块及其使用被打赏¥20元 | |
| 传感器LSM6DSO及LIS3MDL的功能检测被打赏¥18元 | |
| LPS25HB气压传感器及其检测被打赏¥18元 | |
| HTS221温湿度传感器及其检测被打赏¥18元 | |
| 【S32K3XX】HSE FW 版本更新被打赏¥21元 | |
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
| TCS3472S传感器及其色彩检测被打赏¥19元 | |
| 【S32DS】S32K3 RTD7.0.1 HSE 组件配置报错问题解决被打赏¥27元 | |
| 【S32K3XX】MCME 启动 CORE1被打赏¥23元 | |
| AG32VH407下温度大气压传感器及其检测被打赏¥20元 | |
我要赚赏金
