名称:数字钟设计Verilog代码远程云端平台Quartus
软件:Quartus
语言:Verilog
代码功能:
数字钟设计要求:
1.由100MHZ的系统时钟分频得到秒时基
2.对秒时基计数,在数码管上显示小时,分钟和秒的计时信息。
3.可对分和时进行校准
使用BTN1和BTN0两个按键完成校准。
其中BTN1用于切换三种模式:正常计时,分校准,时校准、
在校准时或分模式时,相应的地位数码管要闪烁
BTN0案件用于在校准时,调整具体的计数值
本代码已在远程云端平台验证,远程云端平台如下,其他远程云端平台可以修改管脚适配:
设计要求:
1.由100MHZ的系统时钟分频得到秒时基
2.对秒时基计数,在数码管上显示小时,分钟和秒的计时信息。
3.可对分和时进行校准
使用BTN1和BTN0两个按键完成校准。
其中BTN1用于切换三种模式:正常计时,分校准,时校准、
在校准时或分模式时,相应的地位数码管要闪烁
BTN0案件用于在校准时,调整具体的计数值
语言选择Verilog hdl
引脚编译完后,如此设置
第一个模块为分频模块产生1HZ的时钟信号,
参数化任意进制加计数器的 Veriog HDL 描述。
module counter #(parameter COUNT_MAX = 60, parameter N = 6)(
input clk, rst_n,
input cin,
output reg [N-1:0] count,
output reg cout
);
always@(posedge clk, negedge rst_n)
if(!rst_n)
count<= 0;
else begin
cout <= 0;
if (cin) begin
if(count < (COUNT_MAX - 1))
count <= count + 1;
else begin
count<= 0;
cout <= 1;
end
end
end
endmodule
第二个模块为计时模块,以下代码为例
任意进制bcd码计数
module bcd_ counter #(parameter M=60, parameter N = 6)(
input clk, rst_n,
input cin,
output [9:0] bcd,
output cout
);
wire [N-1:0] count;
counter #(. COUNT_MAX (M), . N(N))
U1(. clk(clk),
. rst_n(rst_n),
. cin(cin),
. count (count),
. cout (cout)); //调用自然二进制码的六十进制计数器
bin2bcd U2(. bin(count), . bcd(bcd)); //调用代码转换模块, 转换为 BCD码
endmodule
第三个模块为用于产生扫描信号分频器
module divider # ( parameter CLK_FREQ = 25000000,//系统时钟输入频率: 25 MHz
parameter CLK_OUT_FREQ = 1) //分频器输出时钟频率: 1 Hz
( input clk, rst_n,
output reg clk_out );
parameter integer N = CLK_FREQ/ (2 * CLK_OUT_FREQ) - 1;
// log2 constant function
function integer log2(input integer x);
integer i;
begin
i = 1;
while (2**i< x)
begin
i = i +1;
end
log2=i;
end
endfunction
parameter M = log2(N ) -1;
reg [M:0] counter; //内部结点
always @ (posedge cl k or negedge rst_n)
begin
if(!rst_n) begin //异步清零
clk_out <= 0;
counter <= 0;
end
else begin
if ( counter < N)
counter <= counter +1'b1; //分频计数器加1计数
else begin
counter <= 0;
clk_out <= ~ clk_out;
end
end
end
endmodule
第四个模块为显示模块 数码管动态显示
module indicator_scan_top(
input clk, rst_n,
input [15:0] data1,
input [15:0] date2,
output reg [7:0] seg,
output reg [7:0] an
);
reg [2:0] sel;
reg [4:0] disp;
always @ (posedge clk or negedge rst_n) begin
if( !rst_n ) begin
an =8'b00000000;
部分代码展示:
module Digital_clock( input clk_in, input key_1,//设置修改--BTN1 input key_0,//修改时分秒--BTN0 output[7:0] SEG1,//段选显示 output[3:0] SEL1, //位选显示 output[7:0] SEG2,//段选显示 output[3:0] SEL2 //位选显示 ); wire [7:0] hour_time;//时 wire [7:0] minute_time;//分 wire [7:0] second_time;//秒 wire key_1_negedge; wire key_0_negedge; wire [1:0] state_o; wire clk_1Hz; fenping fenping_Hz( . clk_in(clk_in), . clk_1Hz(clk_1Hz) ); key_jitter key_1_jitter( . clkin(clk_in), . key_in(key_1), . key_negedge(key_1_negedge) ); key_jitter key_0_jitter( . clkin(clk_in), . key_in(key_0), . key_negedge(key_0_negedge) ); jishi i_jishi( . clk_in(clk_in), . clk_1Hz(clk_1Hz), . set_time_key(key_1_negedge),//设置时间 . change_time_key(key_0_negedge),//设置时分秒 . state_o(state_o), . hour_time(hour_time),//时 . minute_time(minute_time),//分 . second_time(second_time)//秒 ); display i_display( . clk(clk_in), . state_o(state_o), . hour_time(hour_time),//时 . minute_time(minute_time),//分 . second_time(second_time),//秒 . SEG1(SEG1),//段选显示 . SEL1(SEL1), //位选显示 . SEG2(SEG2),//段选显示 . SEL2(SEL2) //位选显示 ); endmodule
源代码
扫描文章末尾的公众号二维码