一、准备工作:
有关Quartusii的初始化配置,参见我的另一篇blog:【FPGA入门】QuartusII初始化配置
二、所用工具:
芯片:10CL006YU256C8G
三、实现功能:
实现数码管从0-60计数显示
四、思路分析:
输入为50Mhz的时钟信号,一分为二,一份经PLL分频后输出到位选段选信号源CNT2,从而输出个位十位选择控制信号到位选段选输出口。
另一份到CNT60将信号源转为M=60的计数器模块,并拆分为十位个位输出到段选数据输入模块,再通过译码器实现显示
五、Quartusii配置:
1、PLL时钟分频设置
从50Mhz分频为2000Hz
2、位选段选信号源CNT2模块
module CNT2(CLK,Q);
input CLK;
output Q;
reg Q1;
assign Q=Q1;
always @(posedge CLK) begin
Q1 <=Q1+1; end
endmodule
3、位选控制器ECODE模块
module ECODE(CD,SG);
input CD;
output [7:0]SG;
reg [7:0]SG;
always @(CD) begin
case (CD)
1'b0: SG<=8'B11111110;
1'b1: SG<=8'B11111101;
endcase
end
endmodule
4、分频M=60计数模块
module CNT60(CLK,RST,Q);
input CLK,RST;
output [7:0]Q;
reg [7:0]Q1;
assign Q[7:4]=Q1/10;
assign Q[3:0]=Q1%10;
localparam M=60;
reg [24:0] clk_cnt;
reg clk_one;
always @(posedge CLK or negedge RST)begin
if(!RST)
clk_cnt <= 25'b0;
else if (clk_cnt<25000000-1'b1)
clk_cnt <= clk_cnt+1'b1;
else
clk_cnt <= 25'b0;
end
always @(posedge CLK or negedge RST)begin
if(!RST)
clk_one <= 1'b0;
else if(clk_cnt==2500000-1'b1)
clk_one <=~clk_one;
else
clk_one <=clk_one;
end
always @(posedge clk_one or negedge RST)begin
if(!RST)
Q1=8'b0;
else if(Q1<M-1'b1)
Q1=Q1+1'b1;
else
Q1=8'b0;
end
endmodule
5、段选信号数据选择器模块
module MUXA(A,B,S,Y,DP);
input [3:0]A,B;
input S;
output reg [3:0] Y;
output reg DP;
always @(A,B,S) begin
if (S==1'B0) begin Y=A; DP=1; end
else begin Y=B; DP=1; end
end
endmodule
6、译码器DEC6模块
module DEC6(A,LED7);
input [3:0]A;
output reg [6:0] LED7;
always @(A) begin
if(A==4'B0000) LED7=7'B1000000;
else if(A==4'B0001) LED7=7'B1111001;
else if(A==4'B0010) LED7=7'B0100100;
else if(A==4'B0011) LED7=7'B0110000;
else if(A==4'B0100) LED7=7'B0011001;
else if(A==4'B0101) LED7=7'B0010010;
else if(A==4'B0110) LED7=7'B0000010;
else LED7=7'B1000000;
end
endmodule