1.请设计一个50进制的加法计数器(从00计到49),每1 秒加一次,用两个数码管显示计数结果,进行程序设计、软件编译、仿真分析、硬件测试。
2.请设计一个24进制的减法计数器(从24计到00),每2 秒减一次,用两个数码管显示计数结果,给出程序设计、软件编译、仿真分析、硬件测试及详细实验过程
两部分代码有不少共用模块
1Hz 分频
0-23 计数
0-49 计数
7段LED数码管译码
top_led_50
led_cnt50_sim 测试激励代码
top_led_24
led_cnt24_sim 测试激励代码
module clk_fp #
(
parameter CLK_IN_FREQ = 50*1000*1000 //50MHz
)
(
input clk,
output clk1s, //1Hz
output clk2s //0.5Hz
);
reg clk1 = 0;
reg clk2 = 0;
reg [31:0] cnt=0;
assign clk1s = clk1;
assign clk2s = clk2;
always @(posedge clk)
begin
if(cnt < CLK_IN_FREQ-1)
cnt <= cnt + 1;
else
cnt <= 0;
end
always @(posedge clk)
begin
if(cnt == CLK_IN_FREQ/2-1||cnt == CLK_IN_FREQ-1)
clk1 <= !clk1;
else
clk1 <= 0;
end
always @(posedge clk)
begin
if(cnt == CLK_IN_FREQ-1)
clk2 <= !clk2;
else
clk2 <= 0;
end
endmodule
module cnt_24 //0-23 同步计数器,异步清零
(
input clk,
input rst_n,
output [7:0] dat
);
reg [7:0] cnt = 0;
assign dat = cnt;
always @(posedge clk or negedge rst_n) //rst_n 异步复位
begin
if( rst_n == 0 )
cnt <= 0;
else if(cnt < 23)
cnt <= cnt + 1;
else
cnt <= 0;
end
endmodule
module cnt_50 //0-49 同步计数器,异步清零
(
input clk,
input rst_n,
output [7:0] dat
);
reg [7:0] cnt = 0;
assign dat = cnt;
always @(posedge clk or negedge rst_n) //rst_n 异步复位
begin
if( rst_n == 0 )
cnt <= 0;
else if(cnt < 49)
cnt <= cnt + 1;
else
cnt <= 0;
end
endmodule
module led_7s //led 7 段数码管译码 0-F
(
input [3:0] dat,
output reg [6:0] led7s //{a,b,c,d,e,f,g} //7段LED 排列 a->led7s[6] g->led7s[0]
);
always@(*)
begin
case(dat)
4'b0000:led7s=7'b0111111; //0
4'b0001:led7s=7'b0000110; //1
4'b0010:led7s=7'b1011011; //2
4'b0011:led7s=7'b1001111; //3
4'b0100:led7s=7'b1100110; //4
4'b0101:led7s=7'b1101101; //5
4'b0110:led7s=7'b1111101; //6
4'b0111:led7s=7'b0000111; //7
4'b1000:led7s=7'b1111111; //8
4'b1001:led7s=7'b1101111; //9
4'b1010:led7s=7'b1110111; //A
4'b1011:led7s=7'b1111100; //B
4'b1100:led7s=7'b0111001; //C
4'b1101:led7s=7'b1011110; //D
4'b1110:led7s=7'b1111001; //E
4'b1111:led7s=7'b1110001; //F
endcase
end
endmodule
module top_led_50
(
input clk,
input rst_n,
output [6:0] led7s_a, //个位
output [6:0] led7s_b //十位
);
wire clk1s;
wire clk2s;
wire [7:0] cnts;
wire [3:0] gw_dat;
wire [3:0] sw_dat;
clk_fp u1
(
.clk (clk), //输入 50MHz
.clk1s (clk1s), //输出 1Hz
.clk2s (clk2s) //维护处 0.5Hz
);
cnt_50 u2 //0-49 同步计数器,异步清零
(
.clk (clk1s),
.rst_n (rst_n),
.dat (cnts)
);
assign gw_dat = cnts%10;
assign sw_dat = cnts/10;
led_7s ua //个位
(
.dat (gw_dat),
.led7s (led7s_a)
);
led_7s ub //十位位
(
.dat (sw_dat),
.led7s (led7s_b)
);
endmodule
module led_cnt50_sim();
reg clk;
reg rst_n;
initial begin
clk = 0;
rst_n = 0;
#100 rst_n = 1;
end
always #20 clk = ~clk; //50MHz
wire [6:0] led7s_a; //个位
wire [6:0] led7s_b; //十位
top_led_50 u1
(
.clk (clk),
.rst_n (rst_n),
.led7s_a (led7s_a),
.led7s_b (led7s_b)
);
endmodule
module top_led_24
(
input clk,
input rst_n,
output [6:0] led7s_a, //个位
output [6:0] led7s_b //十位
);
wire clk1s;
wire clk2s;
wire [7:0] cnts;
wire [3:0] gw_dat;
wire [3:0] sw_dat;
clk_fp u1
(
.clk (clk), //输入 50MHz
.clk1s (clk1s), //输出 1Hz
.clk2s (clk2s) //维护处 0.5Hz
);
cnt_24 u2 //0-49 同步计数器,异步清零
(
.clk (clk2s),
.rst_n (rst_n),
.dat (cnts)
);
assign gw_dat = cnts%10;
assign sw_dat = cnts/10;
led_7s ua //个位
(
.dat (gw_dat),
.led7s (led7s_a)
);
led_7s ub //十位位
(
.dat (sw_dat),
.led7s (led7s_b)
);
endmodule
`timescale 1ns / 1ns
module led_cnt24_sim();
reg clk;
reg rst_n;
initial begin
clk = 0;
rst_n = 0;
#100 rst_n = 1;
end
always #20 clk = ~clk; //50MHz
wire [6:0] led7s_a; //个位
wire [6:0] led7s_b; //十位
top_led_24 u1
(
.clk (clk),
.rst_n (rst_n),
.led7s_a (led7s_a),
.led7s_b (led7s_b)
);
endmodule
B站 百度搜索 Quartus实现加减法计数器设计,一堆资料