------数码管动态显示,模块清晰,显示效果为4320dcba
module seg7x8(
input CLOCK_50, // 板载50MHz时钟
input Q_KEY, // 板载按键RST
output [7:0] SEG7_SEG, // 七段数码管 段脚
output [7:0] SEG7_SEL // 七段数码管 待译位脚
);
seg7x8_drive u0(
.i_clk(CLOCK_50),
.i_rst_n(Q_KEY),
.i_turn_off(8'b0000_0000),
.i_dp (8'b0000_0100),
.i_data (32'h4320_DCBA),
.o_seg(SEG7_SEG),
.o_sel(SEG7_SEL)
);
endmodule
module seg7x8_drive(
input i_clk,
input i_rst_n,
input [7:0] i_turn_off,
input [7:0] i_dp,
input [31:0] i_data,
output [7:0] o_seg,
output [7:0] o_sel
);
//++++++++++++++++++++++++++++++++++++++
// 分频部分 开始
//++++++++++++++++++++++++++++++++++++++
reg [16:0] cnt; // 计数子
always @ (posedge i_clk, negedge i_rst_n)
if (!i_rst_n)
cnt <= 0;
else
cnt <= cnt + 1'b1;
wire seg7_clk = cnt[16]; // (2^17/50M = 2.6114)ms
//--------------------------------------
// 分频部分 结束
//--------------------------------------
//++++++++++++++++++++++++++++++++++++++
// 动态扫描, 生成seg7_addr 开始
//++++++++++++++++++++++++++++++++++++++
reg [2:0] seg7_addr; // 第几个seg7
always @ (posedge seg7_clk, negedge i_rst_n)
if (!i_rst_n)
seg7_addr <= 0;
else
seg7_addr <= seg7_addr + 1'b1;
//--------------------------------------
// 动态扫描, 生成seg7_addr 结束
//--------------------------------------
//++++++++++++++++++++++++++++++++++++++
// 根据seg7_addr, 译出位码 开始
//++++++++++++++++++++++++++++++++++++++
reg [7:0] o_sel_r; // 位选码寄存器
always
case (seg7_addr)
0 : o_sel_r = 8'b11111110; // SEG7[7]
1 : o_sel_r = 8'b11111101; // SEG7[6]
2 : o_sel_r = 8'b11111011; // SEG7[5]
3 : o_sel_r = 8'b11110111; // SEG7[4]
4 : o_sel_r = 8'b11101111; // SEG7[3]
5 : o_sel_r = 8'b11011111; // SEG7[2]
6 : o_sel_r = 8'b10111111; // SEG7[1]
7 : o_sel_r = 8'b01111111; // SEG7[0]
endcase
//--------------------------------------
// 根据seg7_addr, 译出位码 结束
//--------------------------------------
//++++++++++++++++++++++++++++++++++++++
// 根据seg7_addr, 选择熄灭码 开始
//++++++++++++++++++++++++++++++++++++++
reg turn_off_r; // 熄灭码
always
case (seg7_addr)
0 : turn_off_r = i_turn_off[0];
1 : turn_off_r = i_turn_off[1];
2 : turn_off_r = i_turn_off[2];
3 : turn_off_r = i_turn_off[3];
4 : turn_off_r = i_turn_off[4];
5 : turn_off_r = i_turn_off[5];
6 : turn_off_r = i_turn_off[6];
7 : turn_off_r = i_turn_off[7];
endcase
//--------------------------------------
// 根据seg7_addr, 选择熄灭码 结束
//--------------------------------------
//++++++++++++++++++++++++++++++++++++++
// 根据seg7_addr, 选择小数点码 开始
//++++++++++++++++++++++++++++++++++++++
reg dp_r; // 小数点码
always
case (seg7_addr)
0 : dp_r = i_dp[0];
1 : dp_r = i_dp[1];
2 : dp_r = i_dp[2];
3 : dp_r = i_dp[3];
4 : dp_r = i_dp[4];
5 : dp_r = i_dp[5];
6 : dp_r = i_dp[6];
7 : dp_r = i_dp[7];
endcase
//--------------------------------------
// 根据seg7_addr, 选择小数点码 结束
//--------------------------------------
//++++++++++++++++++++++++++++++++++++++
// 根据seg7_addr, 选择待译段码 开始
//++++++++++++++++++++++++++++++++++++++
reg [3:0] seg_data_r; always
case (seg7_addr)
0 : seg_data_r = i_data[3:0];
1 : seg_data_r = i_data[7:4];
2 : seg_data_r = i_data[11:8];
3 : seg_data_r = i_data[15:12];
4 : seg_data_r = i_data[19:16];
5 : seg_data_r = i_data[23:20];
6 : seg_data_r = i_data[27:24];
7 : seg_data_r = i_data[31:28];
endcase
reg [7:0] o_seg_r;
always @ (posedge i_clk, negedge i_rst_n)
if (!i_rst_n)
o_seg_r <= 8'hFF;
else
if(turn_off_r)
o_seg_r <= 8'hFF;
else
if(!dp_r)
case(seg_data_r)
4'h0 : o_seg_r <= 8'hC0;
4'h1 : o_seg_r <= 8'hF9;
4'h2 : o_seg_r <= 8'hA4;
4'h3 : o_seg_r <= 8'hB0;
4'h4 : o_seg_r <= 8'h99;
4'h5 : o_seg_r <= 8'h92;
4'h6 : o_seg_r <= 8'h82;
4'h7 : o_seg_r <= 8'hF8;
4'h8 : o_seg_r <= 8'h80;
4'h9 : o_seg_r <= 8'h90;
4'hA : o_seg_r <= 8'h88;
4'hB : o_seg_r <= 8'h83;
4'hC : o_seg_r <= 8'hC6;
4'hD : o_seg_r <= 8'hA1;
4'hE : o_seg_r <= 8'h86;
4'hF : o_seg_r <= 8'h8E;
endcase
else
case(seg_data_r)
4'h0 : o_seg_r <= 8'hC0 ^ 8'h80;
4'h1 : o_seg_r <= 8'hF9 ^ 8'h80;
4'h2 : o_seg_r <= 8'hA4 ^ 8'h80;
4'h3 : o_seg_r <= 8'hB0 ^ 8'h80;
4'h4 : o_seg_r <= 8'h99 ^ 8'h80;
4'h5 : o_seg_r <= 8'h92 ^ 8'h80;
4'h6 : o_seg_r <= 8'h82 ^ 8'h80;
4'h7 : o_seg_r <= 8'hF8 ^ 8'h80;
4'h8 : o_seg_r <= 8'h80 ^ 8'h80;
4'h9 : o_seg_r <= 8'h90 ^ 8'h80;
4'hA : o_seg_r <= 8'h88 ^ 8'h80;
4'hB : o_seg_r <= 8'h83 ^ 8'h80;
4'hC : o_seg_r <= 8'hC6 ^ 8'h80;
4'hD : o_seg_r <= 8'hA1 ^ 8'h80;
4'hE : o_seg_r <= 8'h86 ^ 8'h80;
4'hF : o_seg_r <= 8'h8E ^ 8'h80;
endcase
assign o_sel = o_sel_r;
assign o_seg = o_seg_r;
endmodule
------花样彩灯,本代码由版主提供,具体效果看后续视频
module led_run(sys_clk,led);
input sys_clk;
output [7:0]led;
reg [7:0]led;
reg [24:0]count;
reg [4:0]state;
wire clk;
always @(posedge sys_clk)
count<=count+1'b1;
assign clk=count[23];
always @(posedge clk )
begin
case(state)
5'b00000: led=8'b1111_1111;
5'b00001: led=8'b0000_0000;
5'b00010: led=8'b1000_0000;
5'b00011: led=8'b1100_0000;
5'b00100: led=8'b1110_0000;
5'b00101: led=8'b1111_0000;
5'b00110: led=8'b1111_1000;
5'b00111: led=8'b1111_1100;
5'b01000: led=8'b1111_1110;
5'b01001: led=8'b1111_1111;
5'b01010: led=8'b0000_0000;
5'b01011: led=8'b1111_1111;
5'b01100: led=8'b0000_0001;
5'b01101: led=8'b0000_0010;
5'b01110: led=8'b0000_0100;
5'b01111: led=8'b0000_1000;
5'b10000: led=8'b0001_0000;
5'b10001: led=8'b0010_0000;
5'b10010: led=8'b0100_0000;
5'b10011: led=8'b1000_0000;
5'b10100: led=8'b1111_1111;
5'b10101: led=8'b0000_0000;
5'b10110: led=8'b1111_1111;
5'b10111: led=8'b1000_0001;
5'b11000: led=8'b1100_0011;
5'b11001: led=8'b1110_0111;
5'b11010: led=8'b1111_1111;
5'b11011: led=8'b0001_1000;
5'b11100: led=8'b0011_1100;
5'b11101: led=8'b0111_1110;
5'b11110: led=8'b1111_1111;
5'b11111: led=8'b0000_0000;
endcase
state=state+1;
end
endmodule
module Pwm_LED(clk,key,led);
input clk; -------系统时钟
input [1:0]key;--------定义按键1,2
output [7:0]led;--------定义8盏LED灯
reg [32:0]count;
reg [9:0]pwm_count;
reg flag;
reg [7:0]pwm_flag;
always @(posedge clk)
begin
count=count+1'b1;
if(count[13:4]<pwm_count)
pwm_flag=8'b11111111;
else
pwm_flag=8'b00000000;
if(count[15]==1'b1)
begin
if(flag==1'b1)
begin
flag=1'b0;
if(key[0]==1'b0)
pwm_count=(pwm_count+10'b0000000001);
else if(key[1]==1'b0)
pwm_count=(pwm_count-10'b0000000001);
else pwm_count=pwm_count;
end
end
else
flag=1'b1;
end
assign led=pwm_flag;
endmodule
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |