名稱:數(shù)字鐘設(shè)計Verilog代碼遠(yuǎn)程云端平臺Quartus
軟件:Quartus
語言:Verilog
代碼功能:
數(shù)字鐘設(shè)計要求:
1.由100MHZ的系統(tǒng)時鐘分頻得到秒時基。
2.對秒時基計數(shù),在數(shù)碼管上顯示小時,分鐘和秒的計時信息。
3.可對分和時進(jìn)行校準(zhǔn)。
使用BTN1和BTN0兩個按鍵完成校準(zhǔn)。
其中BTN1用于切換三種模式:正常計時,分校準(zhǔn),時校準(zhǔn)、在校準(zhǔn)時或分模式時,相應(yīng)的地位數(shù)碼管要閃爍。
BTN0案件用于在校準(zhǔn)時,調(diào)整具體的計數(shù)值。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在遠(yuǎn)程云端平臺驗證,遠(yuǎn)程云端平臺如下,其他遠(yuǎn)程云端平臺可以修改管腳適配:
演示視頻:
設(shè)計文檔:
設(shè)計要求:
1.由100MHZ的系統(tǒng)時鐘分頻得到秒時基
2.對秒時基計數(shù),在數(shù)碼管上顯示小時,分鐘和秒的計時信息。
3.可對分和時進(jìn)行校準(zhǔn)
使用BTN1和BTN0兩個按鍵完成校準(zhǔn)。
其中BTN1用于切換三種模式:正常計時,分校準(zhǔn),時校準(zhǔn)、
在校準(zhǔn)時或分模式時,相應(yīng)的地位數(shù)碼管要閃爍
BTN0案件用于在校準(zhǔn)時,調(diào)整具體的計數(shù)值
Quartus內(nèi)創(chuàng)建工程時如此設(shè)置
語言選擇Verilog hdl
引腳編譯完后,如此設(shè)置
第一個模塊為分頻模塊產(chǎn)生1HZ的時鐘信號,
參數(shù)化任意進(jìn)制加計數(shù)器的 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
第二個模塊為計時模塊,以下代碼為例
任意進(jìn)制bcd碼計數(shù)
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));?//調(diào)用自然二進(jìn)制碼的六十進(jìn)制計數(shù)器
bin2bcd U2(. bin(count), . bcd(bcd));?//調(diào)用代碼轉(zhuǎn)換模塊, 轉(zhuǎn)換為 BCD碼
endmodule
第三個模塊為用于產(chǎn)生掃描信號分頻器
module divider # ( parameter CLK_FREQ = 25000000,//系統(tǒng)時鐘輸入頻率: 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
log?2=i;
end
endfunction
parameter M = log2(N ) -1;
reg [M:0] counter;?//內(nèi)部結(jié)點(diǎn)
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;?//分頻計數(shù)器加1計數(shù)
else begin
counter <= 0;
clk_out <= ~ clk_out;
end
end
end
endmodule
第四個模塊為顯示模塊 數(shù)碼管動態(tài)顯示
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,//設(shè)置修改--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),//設(shè)置時間 .?change_time_key(key_0_negedge),//設(shè)置時分秒 .?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
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=349