要开始编写verilog代码了,以常用的分频为例,编写一个简单的代码。
FPGA设计中,分频分为偶数分频和奇数分频。
偶数分频只要计上升沿的个数,然后按照分频要求的不同计相应个数的上升沿并进行波形翻转即可。
例如二分频,每计到一个上升沿,波形翻转一次;
例如四分频,每计到两个上升沿,波形翻转一次。
奇数分频相对比较麻烦,因为奇数分频经常要在给出时钟的下降沿进行翻转,而Verilog本质上是硬件描述,设计的本质仍然是硬件设计。在综合设计时,Verilog代码必须映射到FPGA上的可用硬件上。
FPGA常用的电路是触发器,触发器是一个具有时钟且仅对该时钟的一个边沿敏感的器件。
always@(posedge clk)综合后映射到只对一个时钟边沿敏感的触发器,always@(posedge
clk or negedge rst)综合后映射到有一个异步控制端且仅对时钟的一个边沿敏感的触发器。
不管always@()综合后映射到哪种触发器,它都只能使用一个时钟沿触发。
奇数分频注定要比偶数分频复杂,可以采用这样的方式进行奇数分频:
假设要对给定的时钟进行2N+1分频:先计数;将计数分成N、N+1的两段;前一段将变量div1置0,后一段将变量div1置1;用一个下降沿触发的触发器,div1延迟半个时钟周期后输出,生成div2;div1和div2相与,即得到分频后的时钟。
module FreDivDou(
input clk_i,
input rst_n_i,
output div2_o,
<