EDA 数字时钟

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、数字时钟是什么?
  • 二、EDA里面数码管的显示
    • 1.元件模型
    • 2.参考程序
    • 3. 实验仿真波形
    • 4.实验现象
    • 5. 仿真问题
  • 三、显示时钟
    • 1. 时钟电路模块
    • 2.参考程序
    • 3.仿真波形
    • 4.实验效果
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

前面学习了基本的数字芯片逻辑编程,学会了计数器等,这次来一个做一个综合应用。数字时钟,采用数码管显示时分秒。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数字时钟是什么?

数字时钟是一种以数字显示取代模拟表盘的钟表,它能够以数字的形式显示当前的时间,并且可以同时显示时、分、秒。此外,它通常具有对时、分、秒进行准确校准的功能。
示例:能用数码管显示 时分秒的时钟
EDA 数字时钟_第1张图片
EDA 数字时钟_第2张图片
EDA 数字时钟_第3张图片

二、EDA里面数码管的显示

目标:动态数码管显示: 12345678
时间显示的状态效:”12.20.30 12-20.30 12-20-30

1.元件模型

代码如下(示例):

EDA 数字时钟_第4张图片

2.参考程序

代码如下(示例):

module seg(clk,seg7,ledcom); 
input clk; // 假设系统提供的时钟 50Mhz
output[7:0] seg7; //段
output[7:0] ledcom; //位选
reg[7:0] seg7;  //alway 里面赋值要用reg数据
reg[20:0] cnt; 
reg[7:0] ledcom;
always@(posedge clk) 
begin 
 if(cnt==21'b1 1111 1111 1111 1111 1111) // 2的22减一
 cnt<=0; 
 else 
 cnt<=cnt+1; 
end 
always@(cnt) //给位选
begin 
 case(cnt[16:14])    // 14  15  16   000 ->111   前面13为 满进位
 3'b000:ledcom<=8'b00000001;//0   只有一个位选为1 只有第一位数码管选中并显示
 3'b001:ledcom<=8'b00000010;//1 
 3'b010:ledcom<=8'b00000100;//2 
 3'b011:ledcom<=8'b00001000;//3 
 3'b100:ledcom<=8'b00010000;//0 
 3'b101:ledcom<=8'b00100000;//1 
 3'b110:ledcom<=8'b01000000;//2 
 3'b111:ledcom<=8'b10000000;//3 
 endcase 
end 
always@(cnt) //段码
begin 
 case(cnt[16:14]) 
 3'b000:seg7<=8'b00000111;//0  同时给到段码 ,保证只有 第一个数码管亮 
 3'b001:seg7<=8'b11011011;//1 
 3'b010:seg7<=8'b11001111;//2
  3'b011:seg7<=8'b10100111;//3 
 3'b100:seg7<=8'b11101101;//0 
 3'b101:seg7<=8'b11111101;//1 
 3'b110:seg7<=8'b01000111;//2 
 3'b111:seg7<=8'b11111111;//3 
 endcase 
end 
endmodule

为了仿真改小了参数

module seg(clk,seg7,ledcom,cnt,en); 
input en;
input clk; // 假设系统提供的时钟 50Mhz
output[7:0] seg7; //段
output[7:0] ledcom; //位选
reg[7:0] seg7;  //alway 里面赋值要用reg数据
output reg[8:0] cnt; 
reg[7:0] ledcom;
always@(posedge clk) 
begin 
	if(!en)
	cnt<=0;
	else
		if(cnt==8'b111111111) // 2的22减一
		cnt<=0; 
		else 
		cnt<=cnt+1; 
end 
always@(cnt) //给位选
begin 
 case(cnt[7:5])    // 14  15  16   000 ->111   前面13为 满进位
 3'b000:ledcom<=8'b00000001;//0   只有一个位选为1 只有第一位数码管选中并显示
 3'b001:ledcom<=8'b00000010;//1 
 3'b010:ledcom<=8'b00000100;//2 
 3'b011:ledcom<=8'b00001000;//3 
 3'b100:ledcom<=8'b00010000;//0 
 3'b101:ledcom<=8'b00100000;//1 
 3'b110:ledcom<=8'b01000000;//2 
 3'b111:ledcom<=8'b10000000;//3 
  default:ledcom<=8'b10000000;
 endcase 
end 
always@(cnt) //段码
begin 
 case(cnt[7:5]) 
 3'b000:seg7<=8'b00000111;//0  同时给到段码 ,保证只有 第一个数码管亮 
 3'b001:seg7<=8'b11011011;//1 
 3'b010:seg7<=8'b11001111;//2
  3'b011:seg7<=8'b10100111;//3 
 3'b100:seg7<=8'b11101101;//0 
 3'b101:seg7<=8'b11111101;//1 
 3'b110:seg7<=8'b01000111;//2 
 3'b111:seg7<=8'b11111111;//3 
 default:seg7<=8'b11111111;
 endcase 
end 
endmodule

测试文件


`timescale 1 ps/ 1 ps
module seg_tb3();
// constants                                           
// general purpose registers
reg eachvec;
// test vector input registers
reg clk;
reg en;
// wires                                               
wire [8:0]  cnt;
wire [7:0]  ledcom;
wire [7:0]  seg7;

// assign statements (if any)                          
seg i1 (
// port map - connection between master ports and signals/registers   
	.clk(clk),
	.cnt(cnt),
	.en(en),
	.ledcom(ledcom),
	.seg7(seg7)
);
initial                                                
begin                                                  
// code that executes only once                        
// insert code here --> begin                          
                                                       
// --> end 
#10 clk= 0;
#100 en=0;
#10 en=1;                                           
$display("Running testbench");                       
end 

always #10 clk=~clk;                                                   
always                                                 
// optional sensitivity list                           
// @(event1 or event2 or .... eventn)                  
begin                                                  
// code executes for every event on sensitivity list   
// insert code here --> begin                          
                                                       
@eachvec;                                              
// --> end                                             
end                                                    
endmodule


实际仿真测试元件图

EDA 数字时钟_第5张图片

3. 实验仿真波形

EDA 数字时钟_第6张图片

EDA 数字时钟_第7张图片
EDA 数字时钟_第8张图片
EDA 数字时钟_第9张图片
EDA 数字时钟_第10张图片

EDA 数字时钟_第11张图片

EDA 数字时钟_第12张图片
EDA 数字时钟_第13张图片
EDA 数字时钟_第14张图片
EDA 数字时钟_第15张图片
EDA 数字时钟_第16张图片
EDA 数字时钟_第17张图片
EDA 数字时钟_第18张图片

4.实验现象

5. 仿真问题

EDA 数字时钟_第19张图片
EDA 数字时钟_第20张图片

三、显示时钟

1. 时钟电路模块

EDA 数字时钟_第21张图片

2.参考程序

module watch(clk,reset,seg_r,dig_r); 
input clk; 
input reset; 
output[7:0] seg_r; 
output[7:0] dig_r; 
reg[25:0] count; 
reg[15:0] hour; 
reg sec; 
reg[4:0] disp_dat; 
reg[7:0] seg_r; 
reg[7:0] dig_r; 
always @(posedge clk) 
begin 
 count = count + 1'b1; 
 if(count == 26'd25000000)
 begin 
 count = 26'd0; 
 sec = ~sec; 
 end 
end 
always @(posedge sec) 
begin 
if(reset==0) 
 hour[15:0]=0; 
 else 
 begin 
 hour[3:0] = hour[3:0]+1'b1; 
 if(hour[3:0] == 4'ha) 
 begin 
 hour[3:0] = 4'h0; 
 hour[7:4] = hour[7:4]+1'b1; 
 if(hour[7:4] == 4'h6) 
 begin 
 hour[7:4] = 4'h0; 
 hour[11:8] = hour[11:8] + 1'b1; 
 if(hour[11:8] ==4'ha) 
 begin 
 hour[11:8] = 4'h0; 
 hour[15:12] = hour[15:12] + 1'b1; 
 if(hour[15:12] == 4'h6) 
 hour[15:12] =4'h0; 
 end 
 end 
 end 
 end
 end 
always @(posedge clk) 
begin 
 case(count[17:15]) 
 3'd0:disp_dat = hour[3:0]; 
 3'd1:disp_dat = hour[7:4]; 
 3'd3:disp_dat = hour[11:8]; 
 3'd4:disp_dat = hour[15:12]; 
 endcase 
 case(count[17:15]) 
 3'd0:dig_r = 8'b10000000; 
 3'd1:dig_r = 8'b01000000; 
 3'd2:dig_r = 8'b00000000; 
 3'd3:dig_r = 8'b00010000; 
 3'd4:dig_r = 8'b00001000; 
 3'd5:dig_r = 8'b00000000; 
 3'd6:dig_r = 8'b00000000; 
 3'd7:dig_r = 8'b00000000; 
 endcase 
end 
always @(posedge clk) 
begin 
 case(disp_dat) 
0:seg_r=8'b01111111; 
 1:seg_r=8'b00000111; 
 2:seg_r=8'b11011011; 
 3:seg_r=8'b11001111; 
 4:seg_r=8'b10100111; 
 5:seg_r=8'b11101101;
 6:seg_r=8'b11111101; 
 7:seg_r=8'b01000111; 
 8:seg_r=8'b11111111; 
 9:seg_r=8'b11101111; 
default:seg_r = 8'hff; 
 endcase 
end 
endmodule

3.仿真波形

4.实验效果

总结

提示:这里对文章进行总结:

你可能感兴趣的:(EDA,fpga开发)