【verilog】如何使用verilog写一个秒表

设计要求如上图所示在这里插入图片描述

其实要实现这题的功能很简单,就是一个简单的映射关系,话不多说,直接上代码!

代码如下所示

// An highlighted block
module stopwatch(
	input clk,
	input rst_n,

	input timer_start,
	input timer_stop,

	output [5:0] light_a,
	output [5:0] light_b,
	output [5:0] light_c,
	output [5:0] light_d,
	output [5:0] light_e,
	output [5:0] light_f,
	output [5:0] light_g,
	output [1:0] light_dp
);
logic [5:0] light_a;
logic [5:0] light_b;
logic [5:0] light_c;
logic [5:0] light_d;
logic [5:0] light_e;
logic [5:0] light_f;
logic [5:0] light_g;
logic [1:0] light_dp;

logic [3:0] hh_l;
logic [3:0] hh_h;
logic [3:0] mm_l;
logic [3:0] mm_h;
logic [3:0] ss_l;
logic [3:0] ss_h;

logic [3:0] clk_cnt;
logic [5:0] s_cnt;
logic [5:0] m_cnt;
logic [6:0] h_cnt;

logic timer_stop_en;
logic timer_start_en;

always@(posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		timer_stop_en <= 0;
		timer_start_en <= 0;
	end
	else if(timer_stop) begin
		timer_stop_en <= 1;
		timer_start_en <= 0;
	end
	else if(timer_start) begin
		timer_stop_en <= 0;
		timer_start_en <= 1;
	end
end

always@(posedge clk or negedge rst_n) begin
	if(!rst_n) 
		clk_cnt <= 0;
	else if(timer_stop_en) begin
		clk_cnt <= clk_cnt;
	end
	else if(timer_start_en) begin
		if(clk_cnt == 9) clk_cnt <= 0;
		else clk_cnt <= clk_cnt + 1;
	end
end
always@(posedge clk or negedge rst_n) begin
	if(!rst_n) 
		s_cnt <= 0;
	else if(timer_stop_en) 
		s_cnt <= s_cnt;
	else if(timer_start_en) begin
		if(clk_cnt == 9 && s_cnt == 59) s_cnt <= 0;
		else if(clk_cnt == 9) s_cnt <= s_cnt + 1;
		else s_cnt <= s_cnt;
	end
end
always@(posedge clk or negedge rst_n) begin
	if(!rst_n) 
		m_cnt <= 0;
	else if(timer_stop_en) 
		m_cnt <= m_cnt;
	else if(timer_start_en) begin
		if(clk_cnt == 9 && s_cnt == 59 && m_cnt == 59) m_cnt <= 0;
		else if(clk_cnt == 9 && s_cnt == 59) m_cnt <= m_cnt + 1;
		else m_cnt <= m_cnt;
	end
end
always@(posedge clk or negedge rst_n) begin
	if(!rst_n) 
		h_cnt <= 0;
	else if(timer_stop_en) 
		h_cnt <= h_cnt;
	else if(timer_start_en) begin
		if(clk_cnt == 9 && s_cnt == 59 && m_cnt == 59 && h_cnt == 99) h_cnt <= 0;
		else if(clk_cnt == 9 && s_cnt == 59 && m_cnt == 59) h_cnt <= h_cnt + 1;
		else h_cnt <= h_cnt;
	end
end
always@(*) begin
	case(s_cnt % 10)
		0:beigin light_a[0] = 1; light_b[0] = 1; light_c[0] = 1; light_d[0] = 1; light_e[0] = 1; light_f[0] = 1; light_g[0] = 0;end
		1:beigin light_a[0] = 0; light_b[0] = 1; light_c[0] = 1; light_d[0] = 0; light_e[0] = 0; light_f[0] = 0; light_g[0] = 0;end
		2:beigin light_a[0] = 1; light_b[0] = 1; light_c[0] = 0; light_d[0] = 1; light_e[0] = 1; light_f[0] = 0; light_g[0] = 1;end
		3:beigin light_a[0] = 1; light_b[0] = 1; light_c[0] = 1; light_d[0] = 1; light_e[0] = 0; light_f[0] = 0; light_g[0] = 1;end
		4:beigin light_a[0] = 0; light_b[0] = 1; light_c[0] = 1; light_d[0] = 0; light_e[0] = 0; light_f[0] = 1; light_g[0] = 1;end
		5:beigin light_a[0] = 1; light_b[0] = 0; light_c[0] = 1; light_d[0] = 1; light_e[0] = 0; light_f[0] = 1; light_g[0] = 1;end
		6:beigin light_a[0] = 1; light_b[0] = 0; light_c[0] = 1; light_d[0] = 1; light_e[0] = 1; light_f[0] = 1; light_g[0] = 1;end
		7:beigin light_a[0] = 1; light_b[0] = 1; light_c[0] = 1; light_d[0] = 0; light_e[0] = 0; light_f[0] = 0; light_g[0] = 0;end
		8:beigin light_a[0] = 1; light_b[0] = 1; light_c[0] = 1; light_d[0] = 1; light_e[0] = 1; light_f[0] = 1; light_g[0] = 1;end
		9:beigin light_a[0] = 1; light_b[0] = 1; light_c[0] = 1; light_d[0] = 1; light_e[0] = 0; light_f[0] = 1; light_g[0] = 1;end
		default:beigin light_a[0] = 1; light_b[0] = 1; light_c[0] = 1; light_d[0] = 1; light_e[0] = 1; light_f[0] = 1; light_g[0] = 0;end
	endcase
end
always@(*) begin
	case(s_cnt / 10)
		0:beigin light_a[1] = 1; light_b[1] = 1; light_c[1] = 1; light_d[1] = 1; light_e[1] = 1; light_f[1] = 1; light_g[1] = 0;end
		1:beigin light_a[1] = 0; light_b[1] = 1; light_c[1] = 1; light_d[1] = 0; light_e[1] = 0; light_f[1] = 0; light_g[1] = 0;end
		2:beigin light_a[1] = 1; light_b[1] = 1; light_c[1] = 0; light_d[1] = 1; light_e[1] = 1; light_f[1] = 0; light_g[1] = 1;end
		3:beigin light_a[1] = 1; light_b[1] = 1; light_c[1] = 1; light_d[1] = 1; light_e[1] = 0; light_f[1] = 0; light_g[1] = 1;end
		4:beigin light_a[1] = 0; light_b[1] = 1; light_c[1] = 1; light_d[1] = 0; light_e[1] = 0; light_f[1] = 1; light_g[1] = 1;end
		5:beigin light_a[1] = 1; light_b[1] = 0; light_c[1] = 1; light_d[1] = 1; light_e[1] = 0; light_f[1] = 1; light_g[1] = 1;end
		6:beigin light_a[1] = 1; light_b[1] = 0; light_c[1] = 1; light_d[1] = 1; light_e[1] = 1; light_f[1] = 1; light_g[1] = 1;end
		7:beigin light_a[1] = 1; light_b[1] = 1; light_c[1] = 1; light_d[1] = 0; light_e[1] = 0; light_f[1] = 0; light_g[1] = 0;end
		8:beigin light_a[1] = 1; light_b[1] = 1; light_c[1] = 1; light_d[1] = 1; light_e[1] = 1; light_f[1] = 1; light_g[1] = 1;end
		9:beigin light_a[1] = 1; light_b[1] = 1; light_c[1] = 1; light_d[1] = 1; light_e[1] = 0; light_f[1] = 1; light_g[1] = 1;end
		default:beigin light_a[1] = 1; light_b[1] = 1; light_c[1] = 1; light_d[1] = 1; light_e[1] = 1; light_f[1] = 1; light_g[1] = 0;end
	endcase
end
always@(*) begin
	case(m_cnt % 10)
		0:beigin light_a[2] = 1; light_b[2] = 1; light_c[2] = 1; light_d[2] = 1; light_e[2] = 1; light_f[2] = 1; light_g[2] = 0;end
		1:beigin light_a[2] = 0; light_b[2] = 1; light_c[2] = 1; light_d[2] = 0; light_e[2] = 0; light_f[2] = 0; light_g[2] = 0;end
		2:beigin light_a[2] = 1; light_b[2] = 1; light_c[2] = 0; light_d[2] = 1; light_e[2] = 1; light_f[2] = 0; light_g[2] = 1;end
		3:beigin light_a[2] = 1; light_b[2] = 1; light_c[2] = 1; light_d[2] = 1; light_e[2] = 0; light_f[2] = 0; light_g[2] = 1;end
		4:beigin light_a[2] = 0; light_b[2] = 1; light_c[2] = 1; light_d[2] = 0; light_e[2] = 0; light_f[2] = 1; light_g[2] = 1;end
		5:beigin light_a[2] = 1; light_b[2] = 0; light_c[2] = 1; light_d[2] = 1; light_e[2] = 0; light_f[2] = 1; light_g[2] = 1;end
		6:beigin light_a[2] = 1; light_b[2] = 0; light_c[2] = 1; light_d[2] = 1; light_e[2] = 1; light_f[2] = 1; light_g[2] = 1;end
		7:beigin light_a[2] = 1; light_b[2] = 1; light_c[2] = 1; light_d[2] = 0; light_e[2] = 0; light_f[2] = 0; light_g[2] = 0;end
		8:beigin light_a[2] = 1; light_b[2] = 1; light_c[2] = 1; light_d[2] = 1; light_e[2] = 1; light_f[2] = 1; light_g[2] = 1;end
		9:beigin light_a[2] = 1; light_b[2] = 1; light_c[2] = 1; light_d[2] = 1; light_e[2] = 0; light_f[2] = 1; light_g[2] = 1;end
		default:beigin light_a[2] = 1; light_b[2] = 1; light_c[2] = 1; light_d[2] = 1; light_e[2] = 1; light_f[2] = 1; light_g[2] = 0;end
	endcase
end
always@(*) begin
	case(m_cnt / 10)
		0:beigin light_a[3] = 1; light_b[3] = 1; light_c[3] = 1; light_d[3] = 1; light_e[3] = 1; light_f[3] = 1; light_g[3] = 0;end
		1:beigin light_a[3] = 0; light_b[3] = 1; light_c[3] = 1; light_d[3] = 0; light_e[3] = 0; light_f[3] = 0; light_g[3] = 0;end
		2:beigin light_a[3] = 1; light_b[3] = 1; light_c[3] = 0; light_d[3] = 1; light_e[3] = 1; light_f[3] = 0; light_g[3] = 1;end
		3:beigin light_a[3] = 1; light_b[3] = 1; light_c[3] = 1; light_d[3] = 1; light_e[3] = 0; light_f[3] = 0; light_g[3] = 1;end
		4:beigin light_a[3] = 0; light_b[3] = 1; light_c[3] = 1; light_d[3] = 0; light_e[3] = 0; light_f[3] = 1; light_g[3] = 1;end
		5:beigin light_a[3] = 1; light_b[3] = 0; light_c[3] = 1; light_d[3] = 1; light_e[3] = 0; light_f[3] = 1; light_g[3] = 1;end
		6:beigin light_a[3] = 1; light_b[3] = 0; light_c[3] = 1; light_d[3] = 1; light_e[3] = 1; light_f[3] = 1; light_g[3] = 1;end
		7:beigin light_a[3] = 1; light_b[3] = 1; light_c[3] = 1; light_d[3] = 0; light_e[3] = 0; light_f[3] = 0; light_g[3] = 0;end
		8:beigin light_a[3] = 1; light_b[3] = 1; light_c[3] = 1; light_d[3] = 1; light_e[3] = 1; light_f[3] = 1; light_g[3] = 1;end
		9:beigin light_a[3] = 1; light_b[3] = 1; light_c[3] = 1; light_d[3] = 1; light_e[3] = 0; light_f[3] = 1; light_g[3] = 1;end
		default:beigin light_a[3] = 1; light_b[3] = 1; light_c[3] = 1; light_d[3] = 1; light_e[3] = 1; light_f[3] = 1; light_g[3] = 0;end
	endcase
end
always@(*) begin
	case(h_cnt % 10)
		0:beigin light_a[4] = 1; light_b[4] = 1; light_c[4] = 1; light_d[4] = 1; light_e[4] = 1; light_f[4] = 1; light_g[4] = 0;end
		1:beigin light_a[4] = 0; light_b[4] = 1; light_c[4] = 1; light_d[4] = 0; light_e[4] = 0; light_f[4] = 0; light_g[4] = 0;end
		2:beigin light_a[4] = 1; light_b[4] = 1; light_c[4] = 0; light_d[4] = 1; light_e[4] = 1; light_f[4] = 0; light_g[4] = 1;end
		3:beigin light_a[4] = 1; light_b[4] = 1; light_c[4] = 1; light_d[4] = 1; light_e[4] = 0; light_f[4] = 0; light_g[4] = 1;end
		4:beigin light_a[4] = 0; light_b[4] = 1; light_c[4] = 1; light_d[4] = 0; light_e[4] = 0; light_f[4] = 1; light_g[4] = 1;end
		5:beigin light_a[4] = 1; light_b[4] = 0; light_c[4] = 1; light_d[4] = 1; light_e[4] = 0; light_f[4] = 1; light_g[4] = 1;end
		6:beigin light_a[4] = 1; light_b[4] = 0; light_c[4] = 1; light_d[4] = 1; light_e[4] = 1; light_f[4] = 1; light_g[4] = 1;end
		7:beigin light_a[4] = 1; light_b[4] = 1; light_c[4] = 1; light_d[4] = 0; light_e[4] = 0; light_f[4] = 0; light_g[4] = 0;end
		8:beigin light_a[4] = 1; light_b[4] = 1; light_c[4] = 1; light_d[4] = 1; light_e[4] = 1; light_f[4] = 1; light_g[4] = 1;end
		9:beigin light_a[4] = 1; light_b[4] = 1; light_c[4] = 1; light_d[4] = 1; light_e[4] = 0; light_f[4] = 1; light_g[4] = 1;end
		default:beigin light_a[4] = 1; light_b[4] = 1; light_c[4] = 1; light_d[4] = 1; light_e[4] = 1; light_f[4] = 1; light_g[4] = 0;end
	endcase
end
always@(*) begin
	case(h_cnt / 10)
		0:beigin light_a[5] = 1; light_b[5] = 1; light_c[5] = 1; light_d[5] = 1; light_e[5] = 1; light_f[5] = 1; light_g[5] = 0;end
		1:beigin light_a[5] = 0; light_b[5] = 1; light_c[5] = 1; light_d[5] = 0; light_e[5] = 0; light_f[5] = 0; light_g[5] = 0;end
		2:beigin light_a[5] = 1; light_b[5] = 1; light_c[5] = 0; light_d[5] = 1; light_e[5] = 1; light_f[5] = 0; light_g[5] = 1;end
		3:beigin light_a[5] = 1; light_b[5] = 1; light_c[5] = 1; light_d[5] = 1; light_e[5] = 0; light_f[5] = 0; light_g[5] = 1;end
		4:beigin light_a[5] = 0; light_b[5] = 1; light_c[5] = 1; light_d[5] = 0; light_e[5] = 0; light_f[5] = 1; light_g[5] = 1;end
		5:beigin light_a[5] = 1; light_b[5] = 0; light_c[5] = 1; light_d[5] = 1; light_e[5] = 0; light_f[5] = 1; light_g[5] = 1;end
		6:beigin light_a[5] = 1; light_b[5] = 0; light_c[5] = 1; light_d[5] = 1; light_e[5] = 1; light_f[5] = 1; light_g[5] = 1;end
		7:beigin light_a[5] = 1; light_b[5] = 1; light_c[5] = 1; light_d[5] = 0; light_e[5] = 0; light_f[5] = 0; light_g[5] = 0;end
		8:beigin light_a[5] = 1; light_b[5] = 1; light_c[5] = 1; light_d[5] = 1; light_e[5] = 1; light_f[5] = 1; light_g[5] = 1;end
		9:beigin light_a[5] = 1; light_b[5] = 1; light_c[5] = 1; light_d[5] = 1; light_e[5] = 0; light_f[5] = 1; light_g[5] = 1;end
		default:beigin light_a[5] = 1; light_b[5] = 1; light_c[5] = 1; light_d[5] = 1; light_e[5] = 1; light_f[5] = 1; light_g[5] = 0;end
	endcase
end
assign light_dp = 2'b11;
endmodule

这是较简单的写法来实现stopwatch功能,但是在实际过程中并不推荐使用除余%与除法/来实现,在时钟频率较高时可能会出现时序难以收敛,所以在下一篇中将会尝试用更好的写法来实现该功能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈何明月照沟渠丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值