设计要求如上图所示
其实要实现这题的功能很简单,就是一个简单的映射关系,话不多说,直接上代码!
代码如下所示
// 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功能,但是在实际过程中并不推荐使用除余%与除法/来实现,在时钟频率较高时可能会出现时序难以收敛,所以在下一篇中将会尝试用更好的写法来实现该功能。