МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1
  • 2
  • 3

ТЕМА: ШИМ на verilog

ШИМ на verilog 6 года 9 мес. назад #721

  • ElaX
  • ElaX аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 10
  • Спасибо получено: 0
Всем привет!)
Хочется сделать ШИМ на плиске и что можно было по нажатияс клавиш изменять длительность... вроде всё просто...но... чёт не хочет работать)

Вот код:
module PWM(input wire clock,
		   input duration_increase,
		   input duration_decrease,
		   output reg out_pwm);

reg [3:0]cnt_reg;
reg [3:0]cmp_reg;

wire [1:0]duration_wire;

assign duration_wire[0] = duration_increase;
assign duration_wire[1] = duration_decrease;

initial
begin
	cnt_reg <= 0;
	cmp_reg <= 1;
end

always @(posedge clock)
begin
	cnt_reg <= cnt_reg + 1'b1;
	
	if(cnt_reg > cmp_reg)
		out_pwm <= 1'b0;
	else
		out_pwm <= 1'b1;
end

always @(negedge duration_increase or negedge duration_decrease)
begin
	if(duration_increase == 0)
	begin 
		cmp_reg <= cmp_reg + 4'b00000001;
	end
	
	if(duration_decrease == 0)
	begin
		cmp_reg <= cmp_reg + 4'b11111111;
	end

end

endmodule 

Уменьшать длительность получается (cmp_reg <= cmp_reg + 4'b11111111;), а вот увеличивать нет... пробовал через case ноль эффекта)
Может ктонить подскажет?)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: ШИМ на verilog 6 года 9 мес. назад #722

Может в строке "4'b00000001" лишние нолики выбросить?

UPD
И вот здесь "always @(negedge duration_increase or negedge duration_decrease)" нужно как-то по другому.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от umarsohod.

Re: ШИМ на verilog 6 года 9 мес. назад #723

  • ElaX
  • ElaX аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 10
  • Спасибо получено: 0
Нолики убрал)... а вот как изменить "always @(negedge duration_increase or negedge duration_decrease)" пока не пойму....
И ещё вопросик когда выше переведённое переписываю следующим образом "always @(posedge duration_increase or posedge duration_decrease)" вылетает ошибка: cannot match operand(s) in the condition to the corresponding adges in the enclosing event control of the allways construction?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: ШИМ на verilog 6 года 9 мес. назад #724

  • ElaX
  • ElaX аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 10
  • Спасибо получено: 0
Что это заначит?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: ШИМ на verilog 6 года 9 мес. назад #731

posedge duration_increase or posedge duration_decrease

Я так понимаю, что ты хочешь запустить на клок и фронт, и спад одного и того же сигнала. Конечно, это ошибка.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от SOVA.

Re: ШИМ на verilog 3 года 4 мес. назад #4493

  • KPN
  • KPN аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 10
  • Спасибо получено: 0
Доброго времени суток!!! так и всё же, как сделать две рабочие кнопки для управления ШИМ, по отдельности они работают, а вот вместе не хотят....

module PWM(input wire clock,
input increase,
input decrease,
output reg out_pwm);

reg [3:0]cnt_reg; //разрядность шим
reg [3:0]cmp_reg; //4 разрядный -> 3.125 MHz

wire [1:0] duration_wire;

assign duration_wire[0] = increase;
assign duration_wire[1] = decrease;

initial
begin
cnt_reg <= 0;
cmp_reg <= 0; //0-15 -> 6.25 - 100% к.заполнения
end

always @(posedge clock)
begin
cnt_reg <= cnt_reg + 1'b1;

if(cnt_reg > cmp_reg)
out_pwm <= 1'b0;
else
out_pwm <= 1'b1;

end

always @(increase or decrease)
begin
if(increase == 0) //увеличение к.заполнения
begin
cmp_reg = cmp_reg + 1;
end
else
if(decrease == 0) //уменьшение к.заполнения
begin
cmp_reg = cmp_reg - 1;
end
end
endmodule

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: ШИМ на verilog 3 года 4 мес. назад #4494

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 631
  • Спасибо получено: 51
Почитать про синхронный дизайн, и для кнопок добавить обнаружитель фронта.
reg inc_reg, dec_reg;
always @(posedge clock)
begin
	inc_reg <= increase;
	dec_reg <= decrease;
	if(increase == 0 && inc_reg == 1) //увеличение к.заполнения
		cmp_reg <= cmp_reg + 1;
	else 
		if(decrease == 0 && dec_reg== 1) //уменьшение к.заполнения
			cmp_reg <= cmp_reg - 1;
end
Спасибо сказали: KPN

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

ШИМ на verilog 3 года 4 мес. назад #4495

  • KPN
  • KPN аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 10
  • Спасибо получено: 0
с коэффициентом заполнения разобрался, теперь пытаюсь сделать чтобы можно было еще и частоту изменять, вроде все аналогично, но... не работает
module PWM#(
			parameter bits_reg = 4
			)(
			 input wire clock,
		    input increase,
		    input decrease,
			 input increase_resolution, //увеличение разрядности
			 input decrease_resolution, //уменьшение разрядности
		    output reg out_pwm
			 );		
			
initial
begin
	cnt_reg <= 0; // разрядность ШИМ
	cmp_reg <= 0;  //0-15 -> 6.25 - 100% к.заполнения
end	

reg inc_reg, dec_reg; 

reg increase_resolution_reg, decrease_resolution_reg;

always @(posedge clock)
begin
	increase_resolution_reg <= increase_resolution;
	decrease_resolution_reg <= decrease_resolution_reg;
	if(increase_resolution == 0 && increase_resolution_reg == 1)
		bits_reg = 8;
	else
	if(decrease_resolution == 0 && decrease_resolution_reg == 1)
		bits_reg = 2;
end

reg [bits_reg-1:0]cnt_reg;   //разрядность шим
reg [bits_reg-1:0]cmp_reg;   //n разрядный 

always @(posedge clock)
begin
	inc_reg <= increase;
	dec_reg <= decrease;
	if(increase == 0 && inc_reg == 1) //увеличение к.заполнения
		cmp_reg <= cmp_reg + 1;
	else 
		if(decrease == 0 && dec_reg == 1) //уменьшение к.заполнения
			cmp_reg <= cmp_reg - 1;
end

always @(posedge clock)
begin	
	cnt_reg <= cnt_reg + 1'b1;
	
	if(cnt_reg > cmp_reg)
		out_pwm <= 1'b0;
	else
		out_pwm <= 1'b1;
end

endmodule 
Info: *******************************************************************
Info: Running Quartus II 64-Bit Analysis & Synthesis
	Info: Version 15.0.0 Build 145 04/22/2015 SJ Web Edition
	Info: Processing started: Wed Jul 08 14:11:29 2015
Info: Command: quartus_map --read_settings_files=on --write_settings_files=off PWM -c PWM
Warning (20028): Parallel compilation is not licensed and has been disabled
Info (12021): Found 1 design units, including 1 entities, in source file pwm.v
	Info (12023): Found entity 1: PWM
Error (10049): Verilog HDL error at PWM.v(27): value must not be assigned to nonvariable "bits_reg"
Error (10049): Verilog HDL error at PWM.v(30): value must not be assigned to nonvariable "bits_reg"
Error: Quartus II 64-Bit Analysis & Synthesis was unsuccessful. 2 errors, 1 warning
	Error: Peak virtual memory: 674 megabytes
	Error: Processing ended: Wed Jul 08 14:11:50 2015
	Error: Elapsed time: 00:00:21
	Error: Total CPU time (on all processors): 00:00:49
Error (293001): Quartus II Full Compilation was unsuccessful. 4 errors, 1 warning
вроде же по логике правильно

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от KPN.

ШИМ на verilog 3 года 4 мес. назад #4496

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 631
  • Спасибо получено: 51
1) Параметр сам по-себе не синтезируется в физический регистр.
2) Разрядность регистра "на лету" менять нельзя, можно маскировать "лишние" разряды:
reg [7:0] mask = 15;

always @(posedge clock)
begin
	increase_resolution_reg <= increase_resolution;
	decrease_resolution_reg <= decrease_resolution_reg;
	if(increase_resolution == 0 && increase_resolution_reg == 1)
		mask = 255;
	else
		if(decrease_resolution == 0 && decrease_resolution_reg == 1)
			mask = 3;
end

reg [7:0] cnt_reg;   //разрядность шим
reg [7:0] cmp_reg;   //n разрядный 

always @(posedge clock)
begin	
	cnt_reg <= cnt_reg + 1'b1;
	
	if((cnt_reg & mask) > (cmp_reg & mask))
		out_pwm <= 1'b0;
	else
		out_pwm <= 1'b1;
end

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

ШИМ на verilog 3 года 4 мес. назад #4497

  • KPN
  • KPN аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 10
  • Спасибо получено: 0
а как например в С++ динамические массивы такой вариант возможен?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3
Время создания страницы: 0.204 секунд

facebook  GitHub  YouTube  Twitter