Vrilog HDL 课程设计——数字钟

为了完成小学期的课程设计去图书馆查找资料敲了一个数字钟,一共有四个部分组成

p_clk_div.v

'timescal 1ns/1ns
 
module p_clk_div
#(
	parameter COEFFICIENT = 12,
	prrameter CNT_WIDTH = 4
)
(
	input i_reset_n,
	input i_clk,

	output o_div_clk
);

reg [CNT_WIDTH-1:0]r_cnt;
reg r_div_clk;
assign o_div_clk = r_div_clk;

always@(posedge i_clk, negedge i_reset_n)
	begin
		if(1'b0 == i_reset_n)
			r_cnt <= 2'd0;
		else
			if((COEFFICIENT/2 - 1) == r_cnt)
				r_cnt <= 0;
			else
				r_cnt <= r_cnt + 1;
	end



always@(posedge i_clk, negedge i_reset_n)
	begin
		if(1'b0 == i_reset_n)
			r_div_clk <= 1'b0;
		else
			if((COEFFICIENT/2 - 1) == r_cnt)
				r_div_clk <= ~r_div_clk;
	end

endmodule
seg_display.v

'timescal 1ns/1ns

module seg_display
(	
	input [3:0]i_data,		//定义10位的数据输入
	input i_dp,
	
	output [6:0]o_seg,		//定义7位的编码输出,从高到低A、B
	output o_dp
);

//定义输出信号o_code的缓存

reg [6:0]r_seg;
assign o_dp = i_dp;
assign o_seg = r_seg;

always@(*)
	begin
		case(i_data)
			4'b0000: r_seg = 8'hc0;
			4'b0001: r_seg = 8'hf9;
			4'b0010: r_seg = 8'ha4;
			4'b0011: r_seg = 8'hb0;
			4'b0100: r_seg = 8'h99;
			4'b0101: r_seg = 8'h92;
			4'b0110: r_seg = 8'h82;
			4'b0111: r_seg = 8'hf8;
			4'b1000: r_seg = 8'h80;
			4'b1001: r_seg = 8'h90;
			4'b1010: r_seg = 8'hbf;
			default: r_seg = 8'hff;
		endcase
	end

endmodule
seg_display_ctrl.v

'timescal 1ns/1ns
 
module seg_display_ctrl1
(
	input r_rst_n,
	input i_clk,
	input [3:0] i_hour_h,
	input [3:0] i_hour_l,
	input [3:0] i_minut_h,
	input [3:0] i_minut_l,
	input [3:0] i_second_h,
	input [3:0] i_second_l,

	output [7:0] o_seg_control,
	output [7:0] o_seg_display
);

	reg [3:0]r_display_data;
	reg [2:0]r_cnt;
	reg [7:0]r_seg_control;

	wire w_dp;
	wire [6:0]w_seg_display;

seg_display I_seg_display
(
	.i_data(r_dispaly_data),
	.i_dp(1'b1),
	
	.o_seg(w_seg_display[6:0]),
	.o_dp(w_dp)
);

always@(posedge i_clk, negedge r_rst_n)
	begin
		if(1'b0 == r_rst_n)
			r_cnt <= 3'd0;
		else
			r_cnt <= r_cnt + 3'd1;
	end

always@(*)
	begin
		case(r_cnt)
			3'd0:r_display_data = i_second_l;
			3'd1:r_display_data = i_second_h;
			3'd2:r_display_data = 4'hA;
			3'd3:r_display_data = i_minut_l;
			3'd4:r_display_data = i_minut_h;
			3'd5:r_display_data = 4'hA;
			3'd6:r_display_data = i_hour_l;
			3'd7:r_display_data = i_hour_l;
			defalut:r_display_data = 4'hA;
		endcase
	end

always@(*)
	begin
		case(r_cnt)
			3d'0: r_seg_control = 8b'01111111;
			3d'1: r_seg_control = 8b'10111111;
			3d'2: r_seg_control = 8b'11011111;
			3d'3: r_seg_control = 8b'11101111;
			3d'4: r_seg_control = 8b'11110111;
			3d'5: r_seg_control = 8b'11111011;
			3d'6: r_seg_control = 8b'11111101;
			3d'7: r_seg_control = 8b'11111110;
			default:r_seg_control = 8b'11111111;
		endcase
	end

endmodule
timer.v

'timescal 1ns/1ns

module timer
(
	input i_reset_n,
	input i_clk,

	output [3:0] o_hour_h,
	output [3:0] o_hour_l,
	output [3:0] o_minut_h,
	output [3:0] o_minut_l,
	output [3:0] o_second_h,
	output [3:0] o_second_l,
);

	reg [3:0] r_hour_h;
	reg [3:0] r_hour_l;
	reg [3:0] r_minut_h;
	reg [3:0] r_minut_l;
	reg [3:0] r_second_h;
	reg [3:0] r_second_l;

	assign o_hour_h = r_hour_h;
	assign o_hour_l = r_hour_l;
	assign o_minut_h =r_minut_h;
	assign o_minut_l =r_minut_l;
	assign o_second_h = r_second_h;
	assign o_second_l = r_second_l;


//秒钟个位加1
always@(posedge i_clk, negedge i_reset_n)
	begin
		if(1'b0 == i_reset_n)
			r_second_l <= 4'd0;
		else
			if(4'd9 == r_second_l)
				r_second_l <= 4'd0;
			else
				r_second_l <= r_second_l + 4'd1;
	end


//秒钟十位加1
always@(posedge i_clk, negedge i_reset_n)
	begin
		if(1'b0 == i_reset_n)
			r_second_h <= 4'd0;
		else
			if(4'd9 == r_second_l)
				if(4'd5 == r_second_h)
					r_second_h <= 4'd0;
				else
					r_second_h <= r_second_h + 4'd1;
	end


//分钟个位加1
always@(posedge i_clk, negedge i_reset_n)
	begin
		if(1'b0 == i_reset_n)
			r_minut_l <= 4'd0;
		else
			if(4'd9 == r_second_l && 4'd5 == r_second_h)
				if(4'd9 == r_minut_l || (4'd2 == r_hour_h && 4'd3 == r_hour_l))
					r_minut_l <= 4'd0;
				else
					r_minut_l <= r_minut_l + 4'd1;
	end


//分钟十位加1
always@(posedge i_clk, negedge i_reset_n)
	begin
		if(1'b0 == i_reset_n)
			r_minut_h <= 4'd0;
		else
			if(4'd9 == r_second_l && 4'd5 == r_second_h && 4'd9 == r_minut_l)
				if(4'd5 == r_minut_h)
					r_minut_h <= 4'd0;
				else
					r_minut_h <= r_minut_h + 4'd1;
	end


//时钟个位加1
always@(posedge i_clk, negedge i_reset_n)
	begin
		if(1'b0 == i_reset_n)
			r_hour_l <= 4'd0;
		else
			if(4'd9 == r_second_l && 4'd5 == r_second_h && 4'd9 == r_minut_l && 4'd5 == r_minut_h)
				if( (4'd9 == r_hour_l) || (4'd2 == r_hour_h && 4'd3 == r_hour_l))
					r_hour_l <= 4'd0;
				else
					r_hour_l <= r_hour_l + 4'd1;
	end


//时钟十位加1
always@(posedge i_clk, negedge i_reset_n)
	begin
		if(1'b0 == i_reset_n)
			r_hour_h <= 4'd0;
		else
			if(4'd9 == r_second_l && 4'd5 == r_second_h && 4'd9 == r_minut_l && 4'd5 == r_minut_h && 4'd3 == r_hour_l)
				begin
					if(4'd2 == r_hour_h)
						r_hour_h <= 4'd0;
				end
			else
				begin
					if(4'd9 == r_second_l && 4'd5 == r_second_h && 4'd9 == r_minut_l && 4'd5 == r_minut_h && 4'd9 == r_hour_l)
						r_hour_h <= r_hour_h + 4'd1;
				end
	end

endmodule







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值