计数器和时钟分频器
通过组合算术电路和顺序元素,可以建立许多有趣的事情。在该项目中,我们将通过与触发器集成算术电路来提供具有定时参考的算术电路。在第一部分中,我们将使用带有寄存器文件(触发器数组)的加法器来实现计数器,当时钟的上升沿到达时,将数量增加1。在第二部分,我们将重新审视时钟分隔符。然后,我们将实现与先前项目中实现的时钟分频器相比,可以更精确地计算的时钟分频器。
先决条件
软件
-
Xilinx Ise WebPack..
硬件
程序
1.设计一个8位计数器
计数器不超过用于每个输出位的触发器的加法器。计数器的框图如下图所示。1。
当断言复位信号“RST”时,计数器的输出(Q [7:0])为0.触发器的输出馈送回到纹波携带加法器的输入,并呈现0 + 1 = 1触发器的输入。当复位信号被断开时,在时钟到达的上升沿之后,输出转到1。触发器的输入,将显示1 + 1 = 2。在时钟的第二个上升沿到达后,2将显示在计数器的输出上。由于分析,触发器为加法器提供定时参考(时钟),使得每次时钟到达的上升沿,计数器的输出增加1。
要在Verilog中结构化的电路,您可以使用先前项目中实现的RCA和触发器。实际上,行为地编写它是更容易的。要描述任何顺序电路,我们可以使用类似的始终块作为我们用于描述D触发器的一个。要同时实施计数器,我们需要进行三个语句:
始终会触发何时触发?计数器的输出将在时钟的上升沿(FF的功能)或复位信号的上升沿(异步复位)。复位时输出如何发生反应?断置重置时计数器的输出将被重置为“0”。当时钟的上升沿到达时,输出如何做出反应?将输出更新为加法器的输出,这是上升沿到达之前计数器的输出,加1。
因此,计数器的代码如下所示:
模块计数器(输入CLK,输入RST,输出reg[7.:0.]问:的);总是@(提出(CLK.的),提出(rst.的)的)//当将总是块被触发开始如果(rst.==1'B1.的)//如何输出反应什么时候重置是断言Q.<=8.'B0.;别的//如何输出反应什么时候上升沿的时钟到达还问:<=问:+1'B1.;结尾末端
2.时钟分频器
在之前的项目中,我们解释了如何使用触发器和逆变器来实现时钟分频。在本节中,我们可以使用一个带有比较器的计数器来调节一个带有逆变器的触发器来实现一个时钟分频器,从而可以更精确地控制输出频率。这种时钟分频器的框图如图2所示。
在框图中,每当CLK的上升沿到达时,计数器增加1。当它到达常量块中定义的常量数字时,它还将其输出重置为“0”。比较器将计数器的输出与预定义的常数进行比较,并且如果计数器的输出等于预定义的常数,则断言EQ。当EQ被断言时,时钟分频器翻转的输出。
让我们假设预先定义的数字是3,时钟分配器(clk_div)的输出被初始化为0。在计数器的输出等于预先定义的常数3之前需要3个时钟周期。当它达到3时,时钟分压器(clk_div)的输出变为1,计数器自己复位。在计数器的输出等于预先定义的常数3之前又需要三个周期。当它再次达到3时,clk_div返回0。因此,在clk_div返回1并再次返回0之前需要6个时钟周期。因此,clk_div的频率是原始clk频率的六分之一。
在此示例中,我们将使用此时钟分频器来实现恰好1的信号赫兹频率。首先,我们需要计算常数。作为示例,NEXYS3的输入时钟频率为100MHz..我们希望我们的clk_div是1赫兹.因此,在clk_div进入'1'并返回'0'之前,它应该占用100000000个时钟周期。换句话说,clk_div翻转它的值需要50000000个时钟周期。我们需要选择的常数是5000万。现在我们开始描述电路:
为时钟分频器创建Verilog模块。
模块clkdivider(输入CLK,输入RST,输出reg<em.>clk_div.em.>的);末端
将常量定义为一个局部参数:
localparam constantNumber=50000000;
描述always块中的计数器。
reg[31.:0.]数数;总是@(提出(CLK.的),提出(rst.的)的)开始如果(rst.==1'B1.的)数数<=32.'B0.;别的如果(数数==Constannumber.-1的)数数<=32.'B0.;别的数数<=数数+1;结尾
将触发器与比较器一起描述如下:
总是@(提出(CLK.的),提出(rst.的)的)开始如果(rst.==1'B1.的)clk_div.<=1'B0.;别的如果(数数==constNumber-1的)clk_div.<=~ clk_div;别的clk_div.<=clk_div.;结尾
既然,当时钟上升沿到达时,我们有一个计数器,该计数器增加1,并且可以提供完全1的时钟信号的时钟分频器赫兹,我们现在可以编写包装器模块。在包装器中,我们可以使用该时钟分频器的输出来为我们设计的8位计数器提供时钟信号,我们在步骤1中设计。因此,我们得到了每秒增加的计数器。将计数器的输出绑在LED上。
挑战
-
你能实现每100毫秒计数一次的计数器吗?
-
您可以在七个段显示器上显示计数器的输出吗?