
7、数码管的动态显示
数码管的动态显示,依次显示0~7
module scan_led(clk,rst,sm_seg,sm_bit);
input clk,rst;
output[7:0] sm_seg;
output[7:0] sm_bit;
reg[7:0] sm_seg;
reg[7:0] sm_bit;
reg[15:0] cnt_scan;
reg[4:0] dataout_buf;
always@(posedge clk or negedge rst)
begin
if(!rst) begin
cnt_scan<=0;
end
else begin
cnt_scan<=cnt_scan+1'b1;
end
end
always @(cnt_scan)
begin
case(cnt_scan[15:13])
3'b000 :
sm_bit = 8'b1111_1110;
3'b001 :
sm_bit = 8'b1111_1101;
3'b010 :
sm_bit = 8'b1111_1011;
3'b011 :
sm_bit = 8'b1111_0111;
3'b100 :
sm_bit = 8'b1110_1111;
3'b101 :
sm_bit = 8'b1101_1111;
3'b110 :
sm_bit = 8'b1011_1111;
3'b111 :
sm_bit = 8'b0111_1111;
default :
sm_bit = 8'b1111_1110;
endcase
end
always@(sm_bit)
begin
case(sm_bit)
8'b1111_1110:
dataout_buf=0;
8'b1111_1101:
dataout_buf=1;
8'b1111_1011:
dataout_buf=2;
8'b1111_0111:
dataout_buf=3;
8'b1110_1111:
dataout_buf=4;
8'b1101_1111:
dataout_buf=5;
8'b1011_1111:
dataout_buf=6;
8'b0111_1111:
dataout_buf=7;
default:
dataout_buf=8;
endcase
end
always@(dataout_buf)
begin
case(dataout_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; // "5"
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"
endcase
end
endmodule

8、拨码开关控制数码管显示
这个实验值得注意的是拨码有个引脚用到了FPGA的108脚,因为这个教默认的是特殊作用的,必须把它设置成普通的IO口,不然编译出错的。
通过拨码开关控制数码管的显示,SW1~SW4控制第4~7位数码管,SW5~SW8控制第1~3位数码管。数码管的显示数字范围是0~f。
module key_disp
(
input clk,
input rst_n,
input [3:0] swith1,
input [3:0] swith2,
output [7:0] disp_reg,
output [7:0] dis_bit
);
scan_display DISP //动态显示,具体的源码在楼上贴着呢,稍微修改
//一下即可
(
.clk(clk),
.rst_n(rst_n),
.disp_1th(swith1),
.disp_2th(swith1),
.disp_3th(swith1),
.disp_4th(swith2),
.disp_5th(swith2),
.disp_6th(swith2),
.disp_reg(disp_reg),
.dis_bit(dis_bit)
);
endmodule

9、数码管、按键、分频综合实验:数字时钟
分频、按键防抖、数码管显示的综合实验。
功能:
按键S1、S2分别对时进行加1、减1操作;S3、S4分别对分进行加10、加1操作;S5、S6分别对秒进行加10、加1操作。
数字时钟分为:
1、分频模块:对50MHZ时钟进行分频,得到1HZ的时钟信号,给计数器提供使能信号。
2、counter_60:模为60的计数器,使能信号一次上升沿计数一次(使能信号需要滤波),计数60次进位。
3、counter_24:counter_60的进位信号的上升沿使能技术一次(也需要滤波)。
4、按键模块:主要是防抖和改变计数器的计数(避免信号竞争没有选择驱动使能信号,而是内部直接对寄存器改变)。
国庆前就更新到这了,视频老王还没上传,下午就出门了,所以估计是上传不了。大家先看图片吧
TOP层源码
module countdown(clk,rst_n,key_in,ledout,disp_reg,disp_bit);
input clk;
input rst_n;
input [5:0] key_in;
output ledout;
output [7:0] disp_reg;
output [7:0] disp_bit;
wire clk_en;
Div_50M CLK_DIV
(
.clk(clk),
.rst(rst_n),
.clk_out(clk_en)
);
wire [3:0] S_H;
wire [3:0] S_L;
wire SecCout;
counter60 Sec_COUNT60
(
.en(clk_en),
.clk(clk),
.rst(rst_n),
.key1(key_in[0]),
.key2(key_in[1]),
.cout(SecCout),
.HighOut(S_H),
.LowOut(S_L)
);
wire [3:0] M_H;
wire [3:0] M_L;
wire MinCout;
counter60 Min_COUNT60
(
.en(SecCout),
.clk(clk),
.rst(rst_n),
.key1(key_in[2]),
.key2(key_in[3]),
.cout(MinCout),
.HighOut(M_H),
.LowOut(M_L)
);
wire [3:0] H_H;
wire [3:0] H_L;
counter24 Hou_COUNT24
(
.en(MinCout),
.clk(clk),
.rst(rst_n),
.key1(key_in[4]),
.key2(key_in[5]),
.cout(ledout),
.HighOut(H_H),
.LowOut(H_L)
);
scan_display DISP
(
.clk(clk),
.rst_n(rst_n),
.disp_1th(S_L),
.disp_2th(S_H),
.disp_3th(M_L),
.disp_4th(M_H),
.disp_5th(H_L),
.disp_6th(H_H),
.disp_reg(disp_reg),
.dis_bit(disp_bit)
);
endmodule
可执行文件:下载
——回复可见内容——
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |