任务:

电路图设计:

设计:

  模块1:1.先设计一个计数时钟,为了仿真方便,这里把1000ns当作1s。

      创建一个计数器second_lim,当计数到1000/20时清零,即1s。

      秒显示器second_show,每当second_shwo小于59且second_lim清零时second_show加一,second_shwo小于59且second_lim清零时second_show清零。

      分显示器minute_show,每当minute_show小于59且second_show等于59且second_lim清零时minute_show加一,minute_show等于59且second_show等于59且second_lim清零时minute_show清零。

      时显示器hour_show,每当hour_show小于23且minute_show等于59且second_show等于59且second_lim清零时minute_show加一,hour_show等于23且minute_show等于59且second_show等于59且second_lim清零时hour_show清零。

      2.一个接口接收设置时间的数据,当出现完整的设置时间数据和设置信号时,便直接把时间修改。

      3.遵循uart协议的串口发送模块,把数据发送给电脑。

  模块2:之前的uart串口接收模块可以直接用来接收设置时间的数据,一次可以接收八位数据,即要接收三次才能接收到时,分,秒。

      设置数据寄存器set_tim_regist[23:0],存储时,分,秒数据。

      一个计数器,计数到3便发送设置时间的数据并产生一个设置时间的信号给模块1.

完整代码如下:

module uart_receive_1(  //part1
clk ,
reset ,
baud_rate ,
uart_tx,
data ,
rx_done,
send_en
);
input clk ;
input reset ;
input [2:0]baud_rate ;
input uart_tx ;
output reg [7:0]data ;
output reg rx_done ;
output reg send_en ; reg [2:0]r_data[7:0] ;//接收每一位数据
reg [2:0]sta_bit ;
reg [2:0]sto_bit ; reg [17:0]bit_tim ;//每一位持续的时间(计数)
always@(baud_rate) //在这里一个 码元由一位组成,所以波特率=比特率
begin
case(baud_rate) //常见的串口传输波特率
3'd0 : bit_tim = 1000000000/300/20 ; //波特率为300
3'd1 : bit_tim = 1000000000/1200/20 ; //波特率为1200
3'd2 : bit_tim = 1000000000/2400/20 ; //波特率为2400
3'd3 : bit_tim = 1000000000/9600/20 ; //波特率为9600
3'd4 : bit_tim = 1000000000/19200/20 ; //波特率为19200
3'd5 : bit_tim = 1000000000/115200/20 ; //波特率为115200
default bit_tim = 1000000000/9600/20 ; //多余的寄存器位置放什么:默认速率
endcase
end wire [17:0]bit_tim_16 ;//每1/16位的持续时间(计数)
assign bit_tim_16 = bit_tim / 16; wire [8:0]bit16_mid ; //在中心点产生采样脉冲
assign bit16_mid = bit_tim_16 / 2 ; //边沿检测
reg [1:0]edge_detect ;
always @( posedge clk or negedge reset )
begin
if (!reset )
edge_detect <= 2'd0 ;
else
begin
edge_detect[0] <= uart_tx ;
edge_detect[1] <= edge_detect[0] ;
end
end wire byte_sta_neg ;
assign byte_sta_neg = ( edge_detect == 2'b10 ) ? 1 : 0 ;//输入的数据开始出现下降沿,说明出现了起始位(一直运行?) reg receive_en ;//接收使能端
reg [17:0]div_cnt ;//每1/16bit内的计数
reg [7:0]bit16_cnt ;//计数到了第几个状态(10位,每位分成16份,总共160个状态)
always @( posedge clk or negedge reset )
begin
if (!reset )
receive_en <= 1'd0 ;
else if ( byte_sta_neg ) //检测到下降沿,使能段有效(只要有下降沿就使能?)
receive_en <= 1'd1 ;
else if ( (rx_done) || (sta_bit >= 3'd4 ))
receive_en <= 1'd0 ; //检测到结束信号,使能端无效
else if ( ( bit16_cnt == 8'd159 ) && (div_cnt == bit_tim_16 - 1'd1 ) )//跑完159后re_en置零
receive_en <= 1'd0 ;
end always@( posedge clk or negedge reset )
begin
if ( ! reset )
div_cnt <= 18'd0 ;
else if (receive_en)
begin
if ( div_cnt == bit_tim_16 - 1'd1 )//计数,每1/16bit清零
div_cnt <= 18'd0 ;
else
div_cnt <= div_cnt + 1'b1 ;
end
else
div_cnt <= 18'd0 ;
end reg bit16_pulse ;//产生采样脉冲
always@( posedge clk or negedge reset )
begin
if ( ! reset )
bit16_pulse <= 18'd0 ;
else if (receive_en)
if ( div_cnt == bit16_mid )
bit16_pulse <= 1'd1 ;
else
bit16_pulse <= 1'd0 ;
else
bit16_pulse <= 1'd0 ;
end always@( posedge clk or negedge reset )
begin
if ( ! reset )
bit16_cnt <= 8'd0 ;
else if (receive_en)
begin
if (( bit16_cnt == 8'd159 ) && (div_cnt == bit_tim_16 - 1'd1 ))
bit16_cnt <= 8'd0 ;
else if ( div_cnt == bit_tim_16 - 1'd1 )
bit16_cnt <= bit16_cnt + 1'b1 ;
end
end always@(posedge clk or negedge reset)
begin
if(!reset)
begin
sta_bit <= 3'd0 ;
r_data[0] <= 3'd0 ;
r_data[1] <= 3'd0 ;
r_data[2] <= 3'd0 ;
r_data[3] <= 3'd0 ;
r_data[4] <= 3'd0 ;
r_data[5] <= 3'd0 ;
r_data[6] <= 3'd0 ;
r_data[7] <= 3'd0 ;
sto_bit <= 3'd0 ;
end
else if (bit16_pulse)//舍弃前5后4取中7
case(bit16_cnt)
0:
begin
sta_bit <= 3'd0 ;
r_data[0] <= 3'd0 ;
r_data[1] <= 3'd0 ;
r_data[2] <= 3'd0 ;
r_data[3] <= 3'd0 ;
r_data[4] <= 3'd0 ;
r_data[5] <= 3'd0 ;
r_data[6] <= 3'd0 ;
r_data[7] <= 3'd0 ;
sto_bit <= 3'd0 ;
end
5,6,7,8,9,10,11 : sta_bit <= sta_bit + uart_tx ;
21,22,23,24,25,26,27 : r_data[0] <= r_data[0] + uart_tx ;
37,38,39,41,42,43,44 : r_data[1] <= r_data[1] + uart_tx ;
53,54,55,56,57,58,59 : r_data[2] <= r_data[2] + uart_tx ;
69,70,71,72,73,74,75 : r_data[3] <= r_data[3] + uart_tx ;
85,86,87,88,89,90,91 : r_data[4] <= r_data[4] + uart_tx ;
101,102,103,104,105,106,107 : r_data[5] <= r_data[5] + uart_tx ;
117,118,119,120,121,122,123 : r_data[6] <= r_data[6] + uart_tx ;
133,134,135,136,137,138,139 : r_data[7] <= r_data[7] + uart_tx ;
149,150,151,152,153,154,155 : sto_bit <= sto_bit + uart_tx ;
default ;
endcase
end always@( posedge clk or negedge reset )
begin
if ( ! reset )
rx_done <= 0 ;
else if ( ( bit16_cnt == 8'd159 ) && (div_cnt == bit_tim_16 - 1'd1 ) )//跑完159后产生一个rx_done信号
rx_done <= 1'd1 ;
else if (rx_done <= 8'd1 )
rx_done <= 1'd0 ;
end always@( posedge clk or negedge reset )
begin
if ( ! reset )
send_en <= 1'd0 ;
else if( rx_done == 1)
send_en <= 1'd1 ;
else if( send_en == 1)
send_en <= 1'd0 ;
end always@( posedge clk or negedge reset )//接收完数据发出rx_done后,把数据从r_data传递给data
begin
if ( ! reset )
data <= 8'd0 ;
else if ( rx_done )
begin
data[0] = ( r_data[0] >3 ) ? 1 : 0 ;
data[1] = ( r_data[1] >3 ) ? 1 : 0 ;
data[2] = ( r_data[2] >3 ) ? 1 : 0 ;
data[3] = ( r_data[3] >3 ) ? 1 : 0 ;
data[4] = ( r_data[4] >3 ) ? 1 : 0 ;
data[5] = ( r_data[5] >3 ) ? 1 : 0 ;
data[6] = ( r_data[6] >3 ) ? 1 : 0 ;
data[7] = ( r_data[7] >3 ) ? 1 : 0 ;
end
else if ( receive_en )
data <= 8'd0 ;
end endmodule
module digital_clk(  //part2
clk,
set_tim,
set_sig,
reset,
dis_tim,
send_signal,
send_computer,
uart_data
);
input clk ;
input [7:0]set_tim ;
input set_sig ;
input reset ;
output reg [23:0]dis_tim ;
output reg send_signal ;
output reg send_computer ;
output reg uart_data ; parameter second_miao = 1_000 / 20 ; //把1000ns当1s
parameter minute_fen = 60_000 / 20 ; //1minute 计数
parameter hour_shi = 3600_000 / 20 ;//1hour 计数 reg [1:0]set_sig_cnt ;//计算接收到的数据位数
always@(posedge clk or negedge reset )
if (!reset)
set_sig_cnt <= 2'd0 ;
else if ( set_sig )
set_sig_cnt <= set_sig_cnt + 1 ;
else if ( 3 <= set_sig_cnt )
set_sig_cnt <= 2'd0 ; reg [23:0]set_tim_registor ; //接收串口数据并存储
always@(posedge clk or negedge reset )
if (!reset)
set_tim_registor <= 24'd0 ;
else if ( set_sig )
set_tim_registor <= {set_tim_registor[15:0],set_tim } ; //设置秒钟的显示
reg [7:0]second_lim ;
reg [7:0]second_show ;
always@( posedge clk or negedge reset)
if (!reset)begin
second_lim <= 8'd0 ;
end
else if (second_miao - 1 <= second_lim )
second_lim <= 8'd0 ;
else second_lim <= second_lim + 1 ; always@( posedge clk or negedge reset)//显示秒
if (!reset)begin
second_show <= 8'd0 ;
end
else if ( 3 <= set_sig_cnt )
second_show <= set_tim_registor[7:0] ;
else if ( 3 > set_sig_cnt )
begin
if ( ( 59 <= second_show ) && ( second_miao - 1 <= second_lim ) ) //60秒计满,秒归零
second_show <= 8'd0 ;
else if ( ( 59 > second_show ) && ( second_miao - 1 <= second_lim ) )
second_show <= second_show + 1 ;
end //设置分钟的显示
reg [7:0]minute_show ;
always@( posedge clk or negedge reset)//显示分
if (!reset)
minute_show <= 8'd0 ;
else if ( 3 <= set_sig_cnt )
minute_show <= set_tim_registor[15:8] ;
else if ( 3 > set_sig_cnt )
begin
if ( ( 59 > minute_show ) && ( 59 <= second_show ) && ( second_miao - 1 <= second_lim ) ) // 60秒计满,分 + 1
minute_show <= minute_show + 1 ;
else if ( ( 59 <= minute_show ) && ( 59 <= second_show ) && ( second_miao - 1 <= second_lim ) )//59分59秒计满 分归零
minute_show <= 8'd0 ;
end //设置时的显示
reg [7:0]hour_show ;
always@( posedge clk or negedge reset)//显示时
if (!reset)
hour_show <= 8'd0 ;
else if ( 3 <= set_sig_cnt )
hour_show <= set_tim_registor[23:16] ;
else if ( 3 > set_sig_cnt )
begin
if ( ( 23 > hour_show ) && ( 59 <= minute_show ) && ( 59 <= second_show ) && ( second_miao - 1 <= second_lim ) )//59分59秒计满 时+1
hour_show <= hour_show + 1 ;
else if ( ( 23 <= hour_show ) && ( 59 <= minute_show ) && ( 59 <= second_show ) && ( second_miao - 1 <= second_lim ) )//23时59分59秒计满 时归零
hour_show <= 8'd0 ;
end reg [7:0]second_dis ;//秒的十进制转换
always@(*)
case(second_show)
10 : second_dis = 8'b0001_0000 ;
11 : second_dis = 8'b0001_0001 ;
12 : second_dis = 8'b0001_0010 ;
13 : second_dis = 8'b0001_0011 ;
14 : second_dis = 8'b0001_0100 ;
15 : second_dis = 8'b0001_0101 ;
16 : second_dis = 8'b0001_0110 ;
17 : second_dis = 8'b0001_0111 ;
18 : second_dis = 8'b0001_1000 ;
19 : second_dis = 8'b0001_1001 ;
20 : second_dis = 8'b0010_0000 ;
21 : second_dis = 8'b0010_0001 ;
22 : second_dis = 8'b0010_0010 ;
23 : second_dis = 8'b0010_0011 ;
24 : second_dis = 8'b0010_0100 ;
25 : second_dis = 8'b0010_0101 ;
26 : second_dis = 8'b0010_0110 ;
27 : second_dis = 8'b0010_0111 ;
28 : second_dis = 8'b0010_1000 ;
29 : second_dis = 8'b0010_1001 ;
30 : second_dis = 8'b0011_0000 ;
31 : second_dis = 8'b0011_0001 ;
32 : second_dis = 8'b0011_0010 ;
33 : second_dis = 8'b0011_0011 ;
34 : second_dis = 8'b0011_0100 ;
35 : second_dis = 8'b0011_0101 ;
36 : second_dis = 8'b0011_0110 ;
37 : second_dis = 8'b0011_0111 ;
38 : second_dis = 8'b0011_1000 ;
39 : second_dis = 8'b0011_1001 ;
40 : second_dis = 8'b0100_0000 ;
41 : second_dis = 8'b0100_0001 ;
42 : second_dis = 8'b0100_0010 ;
43 : second_dis = 8'b0100_0011 ;
44 : second_dis = 8'b0100_0100 ;
45 : second_dis = 8'b0100_0101 ;
46 : second_dis = 8'b0100_0110 ;
47 : second_dis = 8'b0100_0111 ;
48 : second_dis = 8'b0100_1000 ;
49 : second_dis = 8'b0100_1001 ;
50 : second_dis = 8'b0101_0000 ;
51 : second_dis = 8'b0101_0001 ;
52 : second_dis = 8'b0101_0010 ;
53 : second_dis = 8'b0101_0011 ;
54 : second_dis = 8'b0101_0100 ;
55 : second_dis = 8'b0101_0101 ;
56 : second_dis = 8'b0101_0110 ;
57 : second_dis = 8'b0101_0111 ;
58 : second_dis = 8'b0101_1000 ;
59 : second_dis = 8'b0101_1001 ;
default second_dis = second_show ;
endcase reg [7:0]minute_dis ;//分的十进制转换
always@(*)
case(minute_show)
10 : minute_dis = 8'b0001_0000 ;
11 : minute_dis = 8'b0001_0001 ;
12 : minute_dis = 8'b0001_0010 ;
13 : minute_dis = 8'b0001_0011 ;
14 : minute_dis = 8'b0001_0100 ;
15 : minute_dis = 8'b0001_0101 ;
16 : minute_dis = 8'b0001_0110 ;
17 : minute_dis = 8'b0001_0111 ;
18 : minute_dis = 8'b0001_1000 ;
19 : minute_dis = 8'b0001_1001 ;
20 : minute_dis = 8'b0010_0000 ;
21 : minute_dis = 8'b0010_0001 ;
22 : minute_dis = 8'b0010_0010 ;
23 : minute_dis = 8'b0010_0011 ;
24 : minute_dis = 8'b0010_0100 ;
25 : minute_dis = 8'b0010_0101 ;
26 : minute_dis = 8'b0010_0110 ;
27 : minute_dis = 8'b0010_0111 ;
28 : minute_dis = 8'b0010_1000 ;
29 : minute_dis = 8'b0010_1001 ;
30 : minute_dis = 8'b0011_0000 ;
31 : minute_dis = 8'b0011_0001 ;
32 : minute_dis = 8'b0011_0010 ;
33 : minute_dis = 8'b0011_0011 ;
34 : minute_dis = 8'b0011_0100 ;
35 : minute_dis = 8'b0011_0101 ;
36 : minute_dis = 8'b0011_0110 ;
37 : minute_dis = 8'b0011_0111 ;
38 : minute_dis = 8'b0011_1000 ;
39 : minute_dis = 8'b0011_1001 ;
40 : minute_dis = 8'b0100_0000 ;
41 : minute_dis = 8'b0100_0001 ;
42 : minute_dis = 8'b0100_0010 ;
43 : minute_dis = 8'b0100_0011 ;
44 : minute_dis = 8'b0100_0100 ;
45 : minute_dis = 8'b0100_0101 ;
46 : minute_dis = 8'b0100_0110 ;
47 : minute_dis = 8'b0100_0111 ;
48 : minute_dis = 8'b0100_1000 ;
49 : minute_dis = 8'b0100_1001 ;
50 : minute_dis = 8'b0101_0000 ;
51 : minute_dis = 8'b0101_0001 ;
52 : minute_dis = 8'b0101_0010 ;
53 : minute_dis = 8'b0101_0011 ;
54 : minute_dis = 8'b0101_0100 ;
55 : minute_dis = 8'b0101_0101 ;
56 : minute_dis = 8'b0101_0110 ;
57 : minute_dis = 8'b0101_0111 ;
58 : minute_dis = 8'b0101_1000 ;
59 : minute_dis = 8'b0101_1001 ;
default minute_dis = minute_show ;
endcase reg [7:0]hour_dis ;//时的十进制转换
always@(*)
case(hour_show)
10 : hour_dis = 8'b0001_0000 ;
11 : hour_dis = 8'b0001_0001 ;
12 : hour_dis = 8'b0001_0010 ;
13 : hour_dis = 8'b0001_0011 ;
14 : hour_dis = 8'b0001_0100 ;
15 : hour_dis = 8'b0001_0101 ;
16 : hour_dis = 8'b0001_0110 ;
17 : hour_dis = 8'b0001_0111 ;
18 : hour_dis = 8'b0001_1000 ;
19 : hour_dis = 8'b0001_1001 ;
20 : hour_dis = 8'b0010_0000 ;
21 : hour_dis = 8'b0010_0001 ;
22 : hour_dis = 8'b0010_0010 ;
23 : hour_dis = 8'b0010_0011 ;
default hour_dis = hour_show ;
endcase //输出
always@(posedge clk or negedge reset )//接收到设置时间的信号后,输出该时间信号
if (!reset)
dis_tim <= 24'd0 ;
else if ( 3 <= set_sig_cnt )
begin
dis_tim <= set_tim_registor ;
end
else dis_tim <= { hour_dis , minute_dis , second_dis } ; always@(posedge clk or negedge reset )//设置输出时间值的标志信号:发送到数码管
if (!reset)
send_signal <= 0 ;
else if ( 3 <= set_sig_cnt )
send_signal <= 1 ;
else if ( ( 3 > set_sig_cnt) && ( second_miao - 1 <= second_lim ) )
send_signal <= 1 ;
else
send_signal <= 0 ; //遵循uart协议发送到电脑
always@(posedge clk or negedge reset )//设置输出时间值的标志信号:发送到电脑
if (!reset)
send_computer <= 0 ;
else if ( second_miao - 1 <= second_lim )
send_computer <= 1 ;
else
send_computer <= 0 ; reg send_computer_en ;//发送使能标志
reg send_computer_done ;//发送结束标志
always@(posedge clk or negedge reset )//设置输出时间值的标志信号:发送到电脑
if (!reset)
send_computer_en <= 0 ;
else if ( send_computer )
send_computer_en <= 1 ;
else if ( send_computer_done )
send_computer_en <= 0 ; reg [5:0]com_cnt ;//串口输出状态计数
always@(posedge clk or negedge reset )//设置串口输出数据 结束标志信号
if (!reset)
send_computer_done <= 0 ;
else if ( send_computer )
send_computer_done <= 0 ;
else if ( com_cnt == 6'd29 )
send_computer_done <= 1 ;
else
send_computer_done <= 0 ; always@(posedge clk or negedge reset )//
if (!reset)
com_cnt <= 0 ;
else if ( send_signal )
com_cnt <= 0 ;
else if ( send_computer_en )
com_cnt <= com_cnt + 1 ; always@(*)//串口输出 时:分:秒
case(com_cnt)
0:uart_data = 0 ;
1:uart_data = dis_tim[23] ;
2:uart_data = dis_tim[22] ;
3:uart_data = dis_tim[21] ;
4:uart_data = dis_tim[20] ;
5:uart_data = dis_tim[19] ;
6:uart_data = dis_tim[18] ;
7:uart_data = dis_tim[17] ;
8:uart_data = dis_tim[16] ;
9:uart_data = 1 ;
10:uart_data = 0 ;
11:uart_data = dis_tim[15] ;
12:uart_data = dis_tim[14] ;
13:uart_data = dis_tim[13] ;
14:uart_data = dis_tim[12] ;
15:uart_data = dis_tim[11] ;
16:uart_data = dis_tim[10] ;
17:uart_data = dis_tim[9] ;
18:uart_data = dis_tim[8] ;
19:uart_data = 1 ;
20:uart_data = 0 ;
21:uart_data = dis_tim[7] ;
22:uart_data = dis_tim[6] ;
23:uart_data = dis_tim[5] ;
24:uart_data = dis_tim[4] ;
25:uart_data = dis_tim[3] ;
26:uart_data = dis_tim[2] ;
27:uart_data = dis_tim[1] ;
28:uart_data = dis_tim[0] ;
29:uart_data = 1 ;
default:uart_data = 1 ;
endcase endmodule
module digital_clk_complete(//连线
clk_wire,
reset_wire,
uart_tx_wire,
baud_rate,
dis_tim,
send_signal,
send_computer,
uart_data
);
input clk_wire ;
input reset_wire ;
input uart_tx_wire ;
input [2:0]baud_rate ;
output dis_tim ;
output send_signal ;
output send_computer ;
output uart_data ; wire [7:0]data ;
wire rx_done ;
wire send_en ;
uart_receive_1 part1(
.clk(clk_wire) ,
.reset(reset_wire) ,
.baud_rate(baud_rate) ,
.uart_tx(uart_tx_wire),
.data(data) ,
.rx_done(rx_done),
.send_en(send_en)
); wire [23:0]dis_tim ;
wire send_signal ;
wire send_computer ;
wire uart_data;
digital_clk part2(
.clk(clk_wire),
.set_tim(data),
.set_sig(send_en),
.reset(reset_wire),
.dis_tim(dis_tim),
.send_signal(send_signal),
.send_computer(send_computer),
.uart_data(uart_data)
); endmodule
`timescale 1ns / 1ns
module digital_clk_complete_tb(//测试激励文件
); reg clk_wire ;
reg reset_wire ;
reg uart_tx_wire ;
reg [8:0]baud_rate ;
wire [23:0]dis_tim ;
wire send_signal ;
wire send_computer ;
wire uart_data ;
digital_clk_complete digital_clk_complete_sim(
clk_wire,
reset_wire,
uart_tx_wire,
baud_rate,
dis_tim,
send_signal,
send_computer,
uart_data
); initial clk_wire = 1 ;
always #10 clk_wire = ! clk_wire ;
initial
begin
reset_wire = 0 ;
baud_rate = 0 ;
uart_tx_wire = 1 ;
#201 ;
reset_wire = 1 ;
baud_rate = 3'd5 ;
#4500000;
uart_input(8'b0001_0101) ; #1000000 ;
uart_input(8'b0010_0000) ; #1000000 ;
uart_input(8'b0011_0110) ; #1000000 ;
$stop;
end task uart_input ;//设定一个任务uart_inpt,有一个输入端uart_tx_data_stm 。在这个task里可以对task外的变量进行赋值
input [7:0]uart_tx_data_stm ;//不返回值,所以不能用x=uart_input。而是直接uart_input。
begin //结构简单的begin-end
uart_tx_wire = 1 ;
#20 ;
uart_tx_wire = 0 ;
#8640 ;
uart_tx_wire = uart_tx_data_stm[0] ;
#8640 ;
uart_tx_wire = uart_tx_data_stm[1] ;
#8640 ;
uart_tx_wire = uart_tx_data_stm[2] ;
#8640 ;
uart_tx_wire = uart_tx_data_stm[3] ;
#8640 ;
uart_tx_wire = uart_tx_data_stm[4] ;
#8640 ;
uart_tx_wire = uart_tx_data_stm[5] ;
#8640 ;
uart_tx_wire = uart_tx_data_stm[6] ;
#8640 ;
uart_tx_wire = uart_tx_data_stm[7] ;
#8640 ;
uart_tx_wire = 1 ;
#8640 ;
end
endtask endmodule

      

      

基于串口校时的数字钟设计(verilog实现)的更多相关文章

  1. 基于BASYS2的VHDL程序——数字钟

    在编电子表时发现FPGA求余,取模只能针对2的次方.毕竟是数字的嘛! 时钟用到了动态刷新数码管.以一个大于50Hz的速度刷新每一个数码管. 因为数码管只有四个,只写了分针和秒针. 代码如下: libr ...

  2. 基于BASYS2的VHDL程序——数字钟(最终版)

    转载请注明原地址:http://www.cnblogs.com/connorzx/p/3674178.html 调时电路正常工作.一切正常.发现做FPGA还是得从数电的思路思考,设置一个预置使能端,预 ...

  3. 基于BASYS2的VHDL程序——数字钟(改进版)

    扩展到时分秒.加了入调时电路,但不知道为什么有两个按键不好使.而且不知道以何种方式假如按键消抖电路,因为加入后会多个时钟控制一个信号,物理不可实现.调试电路待解决.还有,四个数目管中间的那两个圆点怎么 ...

  4. VHDL 数字时钟设计

    序言 这个是我在做FPGA界的HelloWorld--数字钟设计时随手写下的,再现了数字钟设计的过程 目标分析 时钟具有时分秒的显示,需6个数码管.为了减小功耗采用扫描法显示 按键设置时间,需要对按键 ...

  5. 基于basys2用verilog设计多功能数字钟(重写)

    话不多说先上图         前言 自从学习FPGA以来,唯一做过的完整系统就是基于basys2得多功能数字表.记得当时做的时候也没少头疼,最后用时间磨出来了一个不是很完整的小系统,当时还是产生了满 ...

  6. 基于Verilog HDL 的数字时钟设计

    基于Verilog HDL的数字时钟设计 一.实验内容:     利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能.时间设置由开关S1和S2控制,分别是增和减.开关S3是模式选择:0是正常时钟 ...

  7. 实现基于NTP协议的网络校时功能

    无论PC端还是移动端系统都自带时间同步功能,基于的都是NTP协议,这里使用C#来实现基于NTP协议的网络校时功能(也就是实现时间同步). 1.NTP原理 NTP[Network Time Protoc ...

  8. 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器

    九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...

  9. 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器

    北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 论述当下网络时间同步 ...

随机推荐

  1. Linux-ls-cp-tr-命令拓展及通配符

    显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录 [11:23:02 root@centos8 ~]#ls -d /etc/[^[:alpha:]][[:alph ...

  2. [题解][P5206][WC2019] 数树 (op = 1)

    简要题意 给定 \(n, y\). 一张图有 \(|V| = n\) 个点,现在给出两棵树 \(T_1=G(V, E_1)\) 和 \(T_2=G(V, E_2)\). 定义这两棵树的权值 \(F(E ...

  3. 一文搞懂CDN加速原理

    开源Linux 长按二维码加关注~ 一.什么是 CDN CDN的全称是(Content Delivery Network),即内容分发网络.其目的是通过在现有的Internet中增加一层新的CACHE ...

  4. Docker容器网络-基础篇

    开源Linux 一个执着于技术的公众号 Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/N ...

  5. Android 4.4系统,User模式adb默认开启,取消授权,开启root调试记录

    开启User模式adb,取消授权,修改如下: 1. /build/core/main.mk  修改以下内容 ifeq (true,$(strip $(enable_target_debugging)) ...

  6. SpringBoot从0到0.7——序言

    SpringBoot从0到0.7-- 序言 最近做java代码审计发现很多地方看不懂,所以就开始学框架,自己做网站来了解网站的运行原理.函数.接口.参数等等,通过学习SpringBoot框架来从点到面 ...

  7. 【多线程】创建线程方式一:继承Thread类

    创建线程方式一:继承Thread类 代码示例: /** * @Description 继承Thread类,重写run方法,调用start开启线程 * @Author hzx * @Date 2022- ...

  8. 796. Rotate String - LeetCode

    Question 796. Rotate String Solution 题目大意:两个字符串匹配 思路:Brute Force Java实现: public boolean rotateString ...

  9. 腾讯产品快速尝鲜,蓝鲸智云社区版V6.1灰度测试开启

    这周小鲸悄悄推送了社区版V6.1(二进制部署版本,包含基础套餐.监控日志套餐),没过一天就有用户来问6.1的使用问题了.小鲸大吃一鲸,原来你还是爱我的. ![请添加图片描述](https://img- ...

  10. Node.js连接MySQL数据库报错

    解决Node.js第一次连接MySQL数据库时出现[SELECT ERROR] - ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authen ...