版权声明:版权所有:Wanghonglong https://blog.csdn.net/qq_31251431/article/details/83211027
经过Quartus II 开发环境编译得到的RTL Viwer如下图1所示。
对图1的注解如图2所示。
对应的Veilog 硬件描述语言如下:
module PHS_Cnt (
CLK_tree,
SYN_PRD_M,
SYN_CTRL,
SYN_PHS_M_0,
SYN_OUT,
CKDIV,
SYN_RST,SYN_SW,
);
input [15:0]CLK_tree; //16位时钟树
input [15:0]SYN_PRD_M; //16位PWM计数周期信号
input [3:0]SYN_CTRL; //4位PWM同步计数器控制寄存器SYN_CTRL
//用于存储该PWM与移相标准寄存器滞后的数值
input [15:0]SYN_PHS_M_0;
input [3:0]CKDIV; //计数器时钟分频
output [7:0]SYN_OUT; //定义一个8位的输出变量
input SYN_RST; //同步复位信号
input SYN_SW; //同步开关
reg [15:0]SYN_PHS_SD_0;
reg [15:0]SYN_PRD_SD;
wire [15:0]SYN_PHS_0;
wire [15:0]SYN_PRD; //16位PWM同步计数器周期寄存器
wire DCLK;
assign DCLK=CLK_tree[CKDIV];//将经过PLL时钟经过CKDIV分频得到时钟DCLK;
wire RunStop;
assign RunStop=SYN_CTRL[0];// SYN_CTRL是PWM同步计数器控制寄存器,第0位控制寄存器是否工作,
//0--计数器停止
//1--计数器计数
reg [15:0]CNT;
always @(posedge DCLK) //每当分频后的时钟DCLK上升沿来临时,进入该always语句
begin
if(CNT==SYN_PRD)
begin
SYN_PHS_SD_0<=SYN_PHS_M_0;
end
end
assign SYN_PHS_0=SYN_CTRL[3]?SYN_PHS_SD_0:SYN_PHS_M_0;
always@(posedge DCLK) //每当DCLK上升沿来临时,进入该always语句
begin
if(SYN_RST) //判断时钟复位信号;如果时钟复位信号为1--计数变量CNT清零
begin
CNT=0;
end
else if((!RunStop)|(!SYN_SW)) //判断RunStop信号和SYN_SW同步信号的状态,当计数器停止工作,或者不开启模块同步功能时,
//CNT<=CNT
begin
CNT<=CNT;
end
else if(CNT<SYN_PRD) //16位PWM同步计数器周期寄存器,如果CNT小于PWM同步计数器周期寄存器的值,CNT+1
begin
CNT<=CNT+1'd1;
end
else
begin
CNT<=0; //在其他情况下,CNT清零。
end
end
wire [7:0]SYN_IN;
assign SYN_IN[0]={CNT==SYN_PHS_0};
assign SYN_OUT=SYN_IN;
endmodule