-
sin313
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 2
-
Спасибо получено: 0
-
-
|
Здравствуйте. Помогите реализовать мультивибратор АГ3 на Verilog. Имеется постоянная тактовая частота 2МГЦ, но не суть, относительно которой можно что то делать. Вся задача в том что бы на вход подать один импульс, который может быть любой длительности, а на выходе получить так же один импульс, только уже определенной длительности. Ребят, помогите пожалуйста. На работе дали схему перевести на ПЛИС в которой напихано куча АГ3 и в добавок у всех разные временные интервалы , а это без RC цепочки можно только счетчик+компоратор+триггер и схема будет расти до неузнаваемости ) .
Как вариант пытаюсь реализовать, но видимо чего то не до понимаю. Код ниже:
module ag3 (
input in_clk, input in_ag, output out_ag
);
reg [7:0] cnt;
always @ (posedge in_clk)
if (in_ag)
cnt <= 0;
else if (cnt < 7)
cnt <= cnt + 1;
assign out_ag = (in_ag == 1 || cnt < 7) ? 1:0;
endmodule
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от sin313.
|
-
Nick83
-
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 23
-
Спасибо получено: 0
-
-
|
Длительность выходного импульса может быть меньше входного?
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
sin313
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 2
-
Спасибо получено: 0
-
-
|
Нашел одно решение как реализовать К155АГ3 на Verilog . Возможно кому ни будь пригодится. Составляем два небольших модуля и соединяем их последовательно. Получается идеальный АГ3.
Код для первого модуля:
module ag3_under_out (
input in_clk, input in_ag, output out_ag, output out_inv
);
reg [7:0] cnt;
always @ (posedge in_clk)
if (in_ag && cnt == 0)
cnt <= 25;
else if (cnt > 0)
cnt <= cnt - 1;
assign out_ag = (in_ag == 1 || cnt > 0) ? 1:0;
assign out_inv = (in_ag == 1 || cnt > 0) ? 0:1;
endmodule
Код для второго модуля:
module ag3 (
input in_clk, input in_ag, output out_ag, output out_inv
);
reg [7:0] cnt;
always @ (posedge in_clk)
if (cnt == 0 && in_ag == 0)
cnt <= 25;
else if (in_ag && cnt > 0)
cnt <= cnt - 1;
assign out_ag = (in_ag == 1 && cnt > 0) ? 1:0;
assign out_inv = (in_ag == 1 && cnt > 0) ? 0:1;
endmodule
Выход первого модуля out_ag соединяете со входом in_ag второго модуля. С выхода out_ag второго модуля соответственно снимается сигнал. На входы in_clk подаем тактовою частоту. Число записанное в cnt определяет длину импульса на выходе. В моем случае cnt <= 25 и тактовой частотой на входах in_clk = 2МГЦ дает импульс 12,25мкс.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
mdg
-
-
Не в сети
-
Новый участник
-
-
Сообщений: 1
-
Спасибо получено: 0
-
-
|
module les40 (clk, in_pulse,out_pulse);
parameter tz = 4, ti = 3 ; // задержка и длительность импульса в периодах тактовой частоты 0,1,2,...
input clk, in_pulse;
output out_pulse ;
reg [clogb2(ti) - 1'b1 : 0] tii;
reg [clogb2(tz) - 1'b1 : 0] tzz;
reg front;
always @ (posedge clk)
begin
front <= in_pulse;
if (in_pulse && (~front)) begin
tzz <= tz;
tii <= ti;
end
else if(tzz) tzz <= tzz - 1'b1;
else if ((~|tzz) && tii) tii <= tii - 1'b1;
end
assign out_pulse = (~|tzz)&&(tii);
// define the clogb2 function
function integer clogb2;
input [31:0]z;
integer i , result = 1'b0;
begin
for (i = 0; 2**i <= z ; i = i + 1'b1)
result = i+1'b1;
clogb2 = result ;
end
endfunction
//
endmodule
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.133 секунд