⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm_register_file.v

📁 PWM Verilog HDL原码和底层C驱动
💻 V
字号:

















/***************************************************************************/
/*	Copyright ?2004 Altera Corporation. All rights reserved.            */
/* Altera products are protected under numerous U.S. and foreign patents,  */
/* maskwork rights, copyrights and other intellectual property laws.  This */
/* reference design file, and your use thereof, *is subject to and         */
/* governed by the terms and conditions of the applicable Altera Reference */
/* Design License Agreement (either as signed by you or found at           */
/* www.altera.com).  By using this reference design file, you indicate     */
/* your acceptance of such terms and conditions between you and Altera     */
/* Corporation.  In the event that you do not agree with such terms and    */
/* conditions, you may not use the reference design file and please        */
/* promptly destroy any copies you have made. This reference design file   */
/* is being provided on an 揳s-is?basis and as an accommodation and       */
/* therefore all warranties, representations or guarantees of any kind     */
/* (whether express, implied or statutory) including, without limitation,  */
/* warranties of merchantability, non-infringement, or fitness for a       */
/* particular purpose, are specifically disclaimed.  By making this        */
/* reference design file available, Altera expressly does not recommend,   */
/* suggest or require that this reference design file be used in           */
/* combination with any other product not provided by Altera.              */
/***************************************************************************/

/***************************************************************************/
/* File: pwm_register_file                                                 */
/* Description: Register interface for PWM.  Contains logic for reading    */
/*    and writing to PWM registers.                                        */
/***************************************************************************/

module pwm_register_file
(	//Avalon Signals
	clk,
	resetn, 
	chip_select,
	address,
	write,
	write_data,
	read,
	read_data,

	//PWM Output Signals
	pwm_clock_divide,
	pwm_duty_cycle,
	pwm_enable
);

//Parameters
parameter clock_divide_reg_init = 32'h0000_0000;
parameter duty_cycle_reg_init   = 32'h0000_0000;

//Inputs

input clk;			      //System Clock
input resetn;			//System Reset
input chip_select;		//Avalon Chip select signal
input [1:0] address;	      //Avalon Address bus 
input write;			//Avalon Write signal
input [31:0] write_data;	//Avalon Write data bus
input read;			      //Avalon read signal
	
//Outputs
output [31:0] read_data;	  //Avalon read data bus
output [31:0] pwm_clock_divide; //PWM clock divide drive signals
output [31:0] pwm_duty_cycle;   //PWM duty cycle drive signals
output        pwm_enable;       //PWM enable drive signals

//Signal Declarations	
		
reg [31:0] clock_divide_register;	//Clock divider register
reg [31:0] duty_cycle_register;  	//Duty Cycle Register
reg        enable_register;	 	//Enable Bit	
reg [31:0] read_data;			//Read_data bus
	
//Nodes used for address decoding
wire clock_divide_reg_selected, duty_cycle_reg_selected, enable_reg_selected;
//Nodes for determining if a valid write occurred to a specific address
wire write_to_clock_divide, write_to_duty_cycle, write_to_enable;
//Nodes for determining if a valid read occurred to a specific address
wire read_to_clock_divide, read_to_duty_cycle, read_to_enable;
//Nodes used to determine if a valid access has occurred
wire valid_write, valid_read;

//Start Main Code	

//address decode
assign clock_divide_reg_selected = !address[1] & !address[0];  //address 00
assign duty_cycle_reg_selected   = !address[1] &  address[0];  //address 01
assign enable_reg_selected       =  address[1] & !address[0];  //address 10

//determine if a vaild transaction was initiated 
assign valid_write = chip_select & write;		
assign valid_read  = chip_select & read;

//determine if a write occurred to a specific address
assign write_to_clock_divide = valid_write & clock_divide_reg_selected;
assign write_to_duty_cycle   = valid_write & duty_cycle_reg_selected;
assign write_to_enable       = valid_write & enable_reg_selected;

//determine if a read occurred to a specific address
assign read_to_clock_divide = valid_read & clock_divide_reg_selected;
assign read_to_duty_cycle   = valid_read & duty_cycle_reg_selected;
assign read_to_enable       = valid_read & enable_reg_selected;

//Write to clock_divide Register
always@(posedge clk or negedge resetn)
begin
	if(~resetn)begin //Async Reset
		clock_divide_register <= clock_divide_reg_init; //32'h0000_0000;
	end
	else begin	
		if(write_to_clock_divide) begin
			clock_divide_register <= write_data; 	 
		end
		else begin
			clock_divide_register <= clock_divide_register;  
		end
		
	end
end	

//Write to duty_cycle Register
always@(posedge clk or negedge resetn)
begin
	if(~resetn)begin //Async Reset
		duty_cycle_register <= duty_cycle_reg_init; //32'h0000_0000;
	end
	else begin	
		if(write_to_duty_cycle) begin
			duty_cycle_register <= write_data; 	 
		end
		else begin
			duty_cycle_register <= duty_cycle_register;  
		end
	end
end	

//Write to enable register
always@(posedge clk or negedge resetn)
begin
	if(~resetn)begin //Async Reset
		enable_register <= 1'b0;
	end
	else begin
		if(write_to_enable)begin
			enable_register <= write_data[0];
		end
		else begin
			enable_register <= enable_register;
		end
	end
end

//Read Data Bus Mux
always@(read_to_clock_divide or read_to_duty_cycle or read_to_enable or clock_divide_register or duty_cycle_register or enable_register)
begin
	if(read_to_clock_divide) begin
		read_data = clock_divide_register;
	end
	else if(read_to_duty_cycle) begin
		read_data = duty_cycle_register;
	end
	else if(read_to_enable) begin
		read_data = {31'd0,enable_register};
	end
	else begin
		read_data = 32'h0000_0000;
	end
end

//assign register values to register file outputs to the PWM
assign pwm_clock_divide = clock_divide_register;
assign pwm_duty_cycle = duty_cycle_register;
assign pwm_enable = enable_register;

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -