【FPGA+ARM 学习笔记】 PHS_Cnt.v解读

版权声明:版权所有:Wanghonglong https://blog.csdn.net/qq_31251431/article/details/83211027

经过Quartus II 开发环境编译得到的RTL Viwer如下图1所示。

图1 PHS_Cnt RTL Viewer
对图1的注解如图2所示。

图2:RTL Viewer视图注释
对应的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

猜你喜欢

转载自blog.csdn.net/qq_31251431/article/details/83211027