设计如下:数码管从1到F循环变化,变化一次的时间为0.5s
FPGA顶层模块例化两个模块:计时模块,数码管静态显示模块。计时模块几时到0.5s时的标志信号flag传递给数码管静态显示模块,数码管静态显示模块接收到此信号时显示的数值加1。
计时模块:计时模块对系统时钟进行计数,当计时到给定值时输出标志信号。
数码管静态显示模块:数码管静态显示模块在数码管上以静态方式显示数值。
顶层模块代码:
module smg_jtxs( //定义两个输入信号,时钟信号s_clk,复位信号rst
input s_clk, //两个输出信号,数码管位选信号wx,段选信号dx
input rst,
output [5:0] wx,
output [7:0] dx
);
parameter max_t = 25'd2500_0000; //定义延时参数变量,系统时钟50MHz,计数2500-0000刚好为0.5s
wire a_flag; //定义计数标志变量,当计满0.5s,标志位使数码管发生变化
smg_jtqd u_smg_jtqd(
.s_clk (s_clk),
.rst (rst),
.s_flag (a_flag),
.wx (wx),
.dx (dx)
);
t_c #(.max_c (max_t)) u_t_c(
.s_clk (s_clk),
.rst (rst),
.flag (a_flag)
);
endmodule
计时模块代码:
module t_c( //定义两个输入变量,时钟信号s_clk,复位信号rst
input s_clk, //定义一个输出变量flag
input rst,
output reg flag
);
parameter max_c = 2500_0000; //定义计数时间0.5s
reg [24:0] c;
always @(posedge s_clk or negedge rst) //当S_CLK上升沿或者rst下降沿时触发
begin
if(!rst) begin //如果复位信号有效,标志变量falg,计数值c初始化清零
flag <= 1'b0;
c <= 24'b0;
end
else if(c < max_c - 1'b1) begin //如果计数值小于0.5s,标志位flag为0,计数值加1
flag <= 1'b0;
c <= c + 1'b1; //如果计数值达到0.5s,标志位flag变1,计数值清零
end
else begin
flag <= 1'b1;
c <= 24'b0;
end
end
endmodule
数码管静态显示驱动模块:
module smg_jtqd( //定义输入时钟信号s_clk,复位信号rst,标志信号s_clk
input s_clk, //定义输出信号位选信号wx,段选信号dx,这两个信号控制数码管显
input rst, //示
input s_flag,
output reg [5:0] wx,
output reg [6:0] dx
);
reg [3:0] num; //定义状态选择变量,1~f15个变量状态
always @(posedge s_clk or negedge rst) //s_clk上升沿或者rst下降沿触发
begin
if(!rst) //复位信号有效位选信号置1,否则置0
wx <= 6'b111111;
else
wx <= 6'b000000;
end
always @(posedge s_clk or negedge rst) //s_clk上升沿或者rst下降沿触发
begin
if(!rst) //复位信号有效,状态选择变量num为0
num <= 4'h0;
else if(s_flag) begin //当计满0.5s时,标志信号为1,状态变量加1
if(num < 4'hf)
num <= num + 1'b1; //当状态变量num<F时,状态变量清零
else
num <= 4'h0; //当标志信号无效时,状态选择变量保持不变
end
else
num <= num;
end
always @(posedge s_clk or negedge rst) //s_clk上升沿或者rst下降沿触发
begin
if(!rst) //复位信号有效时,段选信号dx置0
dx <= 8'b0;
else begin
case(num) //case结构,根据不同的状态变量num,输出不同的显示
4'h0 : dx <= 8'b1100_0000;
4'h1 : dx <= 8'b1111_1001;
4'h2 : dx <= 8'b1010_0100;
4'h3 : dx <= 8'b1011_0000;
4'h4 : dx <= 8'b1001_1001;
4'h5 : dx <= 8'b1001_0010;
4'h6 : dx <= 8'b1000_0010;
4'h7 : dx <= 8'b1111_1000;
4'h8 : dx <= 8'b1000_0000;
4'h9 : dx <= 8'b1001_0000;
4'ha : dx <= 8'b1000_1000;
4'hb : dx <= 8'b1000_0011;
4'hc : dx <= 8'b1100_0110;
4'hd : dx <= 8'b1010_0001;
4'he : dx <= 8'b1000_0110;
4'hf : dx <= 8'b1000_1110;
default : dx <= 8'b1100_0000;
endcase
end
end
endmodule