文章目录
(一)前言
本次博客基于HDLBits(题目传送门☞HDLBits:Count Clock相关题目),旨在使用Verilog描述语言设计一种非常常见的12h时钟(时钟的具体功能见下文功能描述),根据题目要求,时钟必须基于四位BCD码并且尽量减小综合出的电路面积。
时钟功能描述:
- 端口说明:12h时钟包含时钟输入端口(clk)、重置信号端口(reset)、使能端口(enable)、时/分/秒时间输出端口(hh/mm/ss)、上下午时段输出标志位(am/pm)
/*端口列表与端口说明*/
module top_module(
input clk,
input reset,
input ena,
output pm,
output am,
output [7:0] hh,
output [7:0] mm,
output [7:0] ss);
- 重置(reset==1)时, 时钟输出位12:00:00AM,从AM到PM的跨越可参考:11:59:59AM之后是12:00:00PM。
- 重置信号reset和使能端信号enable全部是同步信号。
- 依据12h时钟功能給出以下参考波形图:
(二)电路结构
一、适用于本题的BCD码计数器
-
设计思路:如果是设计单纯的BCD码加法器则非常简单,我们只需要在计数值count计到9时将其清零即可。但是本题设计时应该注意以下两点:
a. 此题中的BCD码计数器需要在清零信号有效时,部分位的清零数据并不为零,如时针清零后显示应为12,因此设计时在普通BCD计数器的基础上应加上清零置数数据data_reset;另外,本题中的时针进位之后是1而不是0,因此也应该另设一个进位置数数据data_reload。
b. 此题中reload即进位信号的响应优先级应低于使能信号,以免产生Bug. -
现可根据这一思路设计电路,代码如下:
module counter_bcd(clk,reset,enable,reload,dreset,dreload,q);
input clk; //输入时钟端口
input reset; //输入重置信号端口
input enable; //输入使能信号端口
input reload; //输入重装载信号端口
input [3:0]data_reset; //重置时的数据输入:时针为1和2/分针和秒针都为0
input [3:0]data_reload; //计满进位数据输入:时针计到12后进位到01/分针和秒针进位到00
output [3:0]q;
reg [3:0]count;
assign q=count;
always @(posedge clk) begin
if(reset) //同步重置信号其响应优先级应高于使能信号
count<=data_reset;
else if(enable) begin
if(reload)
count<=data_reload;
else if(count==4'b1001)
count<=0; //根据BCD码的计数原理,在使能端允许的情况下,计满9必须清零
else
count<=count+1'b1;
end
else
count<=count+1'b0;
e