Kraklog

PWM / CRC 본문

[Harman] 하만 반도체 설계/NiosII

PWM / CRC

Krakens 2023. 8. 28. 10:26
728x90

 

<EX3>

PWM : Pulse Width Modulation, 펄스의 폭을 제어하는 주기 제어방법

New Component - Files (tab) - Add File - Analyze Synthesis

이때 에러는 나오는 에러는 지금은 무시한다.

 

 

module avalon_pwm
(
	clk, wr_data, wr_n, addr, clr_n, rd_data, pwm_out
)
;



	input clk;
	input [31:0] wr_data;
	input wr_n;
	input addr;
	input clr_n;
	output [31:0] rd_data;
	output [7:0] pwm_out;

	reg [7:0]	div3, div2, div1, div0;
	reg [7:0]	duty3, duty2, duty1, duty0;
	reg [31:0] counter;
	reg off;
	reg [31:0] rd_data;
	wire div_en3, div_en2, div_en1, div_en0, duty_en3, duty_en2, duty_en1, duty_en0;
	
	always @(posedge clk or negedge clr_n)
	begin
		if (clr_n == 0)
		begin
			div3 <= 8'h 00;
			div2 <= 8'h 00;
			div1 <= 8'h 00;
			div0 <= 8'h 00;
			duty3 <= 8'h 00;
			duty2 <= 8'h 00;
			duty1 <= 8'h 00;
			duty0 <= 8'h 00;
		end
		else
		begin
			if (div_en3)
				div3 <= wr_data[31:24];
			else
				div3 <= div3;

			if (div_en2)
				div2 <= wr_data[23:16];
			else
				div2 <= div2;

			if (div_en1)
				div1 <= wr_data[15:8];
			else
				div1 <= div1;

			if (div_en0)
				div0 <= wr_data[7:0];
			else
				div0 <= div0;
			
			if (duty_en3)
				duty3 <= wr_data[31:24];
			else
				duty3 <= duty3;

			if (duty_en2)
				duty2 <= wr_data[23:16];
			else
				duty2 <= duty2;

			if (duty_en1)
				duty1 <= wr_data[15:8];
			else
				duty1 <= duty1;

			if (duty_en0)
				duty0 <= wr_data[7:0];
			else
				duty0 <= duty0;
		end		
	end
	
	always @(posedge clk or negedge clr_n)
	begin
		if (clr_n == 0)
			counter <= 0;
		else
			if (counter >= {div3, div2, div1, div0})
				counter <= 0;
			else	
				counter <= counter + 1;
	end
	
	always @(posedge clk or negedge clr_n)
	begin
		if (clr_n == 0)
			off <= 0;
		else
			if (counter >= {duty3, duty2, duty1, duty0})
				off <= 1;
			else
				if (counter == 0)
					off <= 0;
				else
					off <= off;
	end

	always @(addr or div3 or div2 or div1 or div0 or duty3 or duty2 or duty1 or duty0)
	if (addr == 0)
		rd_data = {div3, div2, div1, div0};
	else
		rd_data = {duty3, duty2, duty1, duty0};
		
	assign div_en3 = !wr_n & !addr ;
	assign div_en2 = !wr_n & !addr ;
	assign div_en1 = !wr_n & !addr ;
	assign div_en0 = !wr_n & !addr ;
	assign duty_en3 = !wr_n & addr ;
	assign duty_en2 = !wr_n & addr ;
	assign duty_en1 = !wr_n & addr ;
	assign duty_en0 = !wr_n & addr ;
	assign pwm_out[0] = ! off;
	assign pwm_out[1] = ! off;
	assign pwm_out[2] = ! off;
	assign pwm_out[3] = ! off;
	assign pwm_out[4] = ! off;
	assign pwm_out[5] = ! off;
	assign pwm_out[6] = ! off;
	assign pwm_out[7] = ! off;	
endmodule
`timescale 1 ns/1 ns

module avalon_pwm_tb();

	reg clk;
	reg [31:0] wr_data;
	reg wr_n;
	reg addr;
	reg reset_n;
	wire [31:0] rd_data;
	wire [7:0] pwm_out;
	
	avalon_pwm U_avalon_pwm (
		.clk(clk),
		.wr_data(wr_data),
		.wr_n(wr_n),
		.addr(addr),
		.clr_n(reset_n),
		.rd_data(rd_data),
		.pwm_out(pwm_out)
	);
	
	
	//clk
	initial begin
		clk = 0;
		forever clk = #10 ~clk;
	end

	//reset_n
	initial begin
		reset_n = 1'b0;
		#20 reset_n = 1'b1;
	end


	//address, wr_n
	initial begin
		addr = 1'b0;
		wr_n = 1'b1;
		@(negedge clk);
		@(negedge clk);
		wr_n = 1'b0;
		@(negedge clk);
		addr = 1'b1;
		@(negedge clk);
		@(negedge clk);
		@(negedge clk);
		wr_n = 1'b1;
		@(negedge clk);
		@(negedge clk);
		@(negedge clk);
		@(negedge clk);
		@(negedge clk);
		@(negedge clk);
		addr = 1'b0;
	end

		
	//wr_data
	initial begin
		wr_data = 32'h10;
		@(negedge clk);
		@(negedge clk);
		@(negedge clk);
		@(negedge clk);
		@(negedge clk);
		wr_data = 32'h7;
	end
	
endmodule

 

wr_n 이 Low, addr 이 High 일때 값이 유지되고, 각각 16 7이 저장되어짐

 

PWM 결과 - (첫 번째 -PWM에 따른 intensity 변화, 두 번째-버튼에 따른 밝기 변화(인터럽트 발생))

 

 

728x90

'[Harman] 하만 반도체 설계 > NiosII' 카테고리의 다른 글

Avalon PWM, PWM Interrupt  (0) 2023.09.08
Avalon BUS + reg 설계  (0) 2023.08.28
Nios Processor  (0) 2023.07.28
SoC sytem  (0) 2023.07.28
Day25. Simple UART TX & RX  (0) 2023.07.28