-
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 ноль эффекта)
Может ктонить подскажет?)
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
umarsohod
-
-
Не в сети
-
Администрация форума
-
-
Сообщений: 816
-
Спасибо получено: 168
-
-
|
Может в строке "4'b00000001" лишние нолики выбросить?
UPD
И вот здесь "always @(negedge duration_increase or negedge duration_decrease)" нужно как-то по другому.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
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?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
SOVA
-
-
Не в сети
-
Давно я тут
-
-
Сообщений: 82
-
Спасибо получено: 5
-
-
-
-
|
posedge duration_increase or posedge duration_decrease
Я так понимаю, что ты хочешь запустить на клок и фронт, и спад одного и того же сигнала. Конечно, это ошибка.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от SOVA.
|
-
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
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Почитать про синхронный дизайн, и для кнопок добавить обнаружитель фронта. 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
-
-
Не в сети
-
Новый участник
-
-
Сообщений: 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.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
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
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
KPN
-
-
Не в сети
-
Новый участник
-
-
Сообщений: 10
-
Спасибо получено: 0
-
-
|
а как например в С++ динамические массивы такой вариант возможен?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.151 секунд