2013-03-03 2 views
-1

Следующий код написан для асинхронного счетчика. Программа компилируется отлично, но значение счетчика не увеличивается после 1. Что я делаю не так?Счетчик с делителем частоты не увеличивается

Вот код:

//TOP 

module CounterWithDivider(clk,reset,temp,q); 

input clk,reset; 
output [3:0]q; 
output reg [3:0]temp; 

reg [3:0]clkDivider; 

TFF a(clkDivider,clk,reset,q[0]); 
TFF b(clkDivider,q[0],reset,q[1]); 
TFF c(clkDivider,q[1],reset,q[2]); 
TFF d(clkDivider,q[2],reset,q[3]); 

always @(posedge clk or negedge reset) 
begin 

if(~reset || clkDivider==12) 
    clkDivider<=0; 

else 

if(clk) 
begin 

clkDivider<=clkDivider+1; 
temp<=clkDivider; 

end 

end 

endmodule 

// T флип-флоп

module TFF(clkDivider,clk,reset,q); 

input clk,reset; 
input [3:0]clkDivider; 
output reg q; 

always @(posedge clk or negedge reset) 
begin 

if(~reset) 
    q<=0; 

else 

if(clkDivider==11) 
    q<=1; 


end 

endmodule 

ответ

2

Т-FlipFlop или тумблер флоп должен переключить его выход, когда включен, вы просто:

if(clkDivider==11) 
    q<=1; 

Замените q<=1 на q<=~q, чтобы включить его при включении.

+0

Я сделал это уже, но выход не идет выше одного. –

+0

@JamesAflred, вы должны обновить свой вопрос с помощью этой новой информации. – toolic

0

Как вы упомянули, это асинхронный счетчик. Причина, по которой ваша симуляция Verilog не делает то, что вам нужно, - это то, что TFF экземпляр b пытается сэмплировать ввод данных (clkDivider) с использованием другого тактового сигнала. clkDivider синхронизируется сигналом clk, но вы пытаетесь его пробовать с использованием другого тактового сигнала (q[0]).

Вам необходимо либо найти способ синхронизации сигнала clkDivider в каждом из трех дозволенных до трех часов, либо использовать полностью синхронный дизайн.

+0

любой намек, как я могу это сделать? –

 Смежные вопросы

  • Нет связанных вопросов^_^