Ну...
код ничего для начальной курсовой.
1. Капитальная ошибка.
always @(poasedge in1) - эта конструкция заводит сигнал in1 на клоки триггера. И вот тут есть засада. Если у вас in идет на клоковую ногу (специальные ноги ПЛИС), то все не плохо. А если нет, то синтезатор потянет сначала этот сигнал на так называемое клоковое дерево, а только потом на триггера, это создает достаточно большую задержку между фронтом и тем как фронт дойдет до триггера... это может и все убить, и частоту снизить, и глюки вызывать если не хватит констраинов
2. В ПЛИС есть такая хрень как метастабильность. Всегда есть шанс что вы по клоку поймаете момент переключения триггера, а так же есть шанс что сигнал не успеет дойти до разных частей ПЛИС, то есть если у вас
Код
always @(posedge clk1)
begin
reg <= reg + 1;
end
и код
Код
always @(posedge clk2)
begin
if(reg == 1)
begin
A<=2;
B<=3;
end
end
то при некоторых сочетания положения clk1 и clk2 у вас может быть что угодно. Иногда А защелкниться а В нет, Иногда в них будет мусор, если они ловят какие-то меняющиеся сигналы....
Потому считается гораздо правильнее и проще на начальных этапах все делать на одном общем клоке. Тогда большую часть неприятностей берет на себя синтезатор, и отследит всю фигню.. Чтобы избежать метастабильность надо вход пропускать через цепочку 2 триггеров.
то есть ваш код должен быть таким
CODE
reg in1_0 = 0;
reg in2_0 = 0;
reg in3_0 = 0;
reg in1_1 = 0;
reg in2_1 = 0;
reg in3_1 = 0;
reg in1_2 = 0;
reg in2_2 = 0;
reg in3_2 = 0;
reg in1_reg = 0;
reg in2_reg = 0;
reg in3_reg = 0;
always @(posedge clk or posedge reset)
begin
//убираем метастабильность
reg in1_0 <= in1;
reg in2_0 <= in2;
reg in3_0 <= in3;
reg in1_1 <= reg_in1_0;
reg in2_1 <= reg_in2_0;
reg in3_1 <= reg_in3_0;
//для отловки фронта
reg in1_2 <= reg_in1_1;
reg in2_2 <= reg_in2_1;
reg in3_2 <= reg_in3_1;
//ловим фронты сигнала
if((reg_in1_2 == 1'b0)&&(reg_in1_1 == 1'b1))
in1_reg <= in1_reg + 1'b1;
if((reg_in2_2 == 1'b0)&&(reg_in2_1 == 1'b1))
in2_reg <= in2_reg + 1'b1;
//ловим фронты сигнала
if((reg_in3_2 == 1'b0)&&(reg_in3_1 == 1'b1))
in3_reg <= in3_reg + 1'b1;
if(reset == 1'b1)
begin
in1_reg <= 0;
in2_reg <= 0;
in3_reg <= 0;
end
end
размер счетчика влияет на максимальную частоту с которой счетчик может считать, о том получается или нет работать на желаемой вам частоте. Плис класса спартан 6 тащит на частоте 100-200 мГц, 64 битные регистры, виртексы еще больше, что может ваша CPLD хрен знает....
При этом частота падает и по мере загрузки плис кодом, чем больше блок тем медленнее...
ресет бывает синхронный и асинхронный, первый работает по клоку внешнему, другой по фронту самого ресета
первый описывается так
Код
always @(posedge clk)
begin
if(reset == 1'b1)
....
end
то есть каждый клок, пока ресет в 1 он выполняется и сбрасывает регистры.
второй описывается так
Код
always @(posedge clk or posedge reset)
begin
if(reset == 1'b1)
....
end
работает по фронту сигнала ресет, заводиться прям на специальные ножки блоков внутри плис, вроде как на фронты клока кладет...
да важно знать что в верилоге последняя строка выполняется приоритетно то есть описание вида
Код
always @(posedge clk)
begin
A<= A + 1'b1;
if(reset1 == 1'b1)
A<= 1;
if(reset2 == 1'b1)
A<=2;
end
работает как запись вида
Код
always @(posedge clk)
begin
if(reset2 == 1'b1)
A<=2;
else if(reset1 == 1'b1)
A<= 1;
else
A<= A + 1'b1;
end
но читается первый вариант проще..
ну и последние конечно же можно делать инстансы
Код
module InOut(
clk,
in,
Out
);
input clk;
input in;
output reg Out = 0;
always @(posedge clk)
begin
Out <= in;
end
endmodule
а в основном коде
Код
InOut InOutInst
(
.clk(g_clk),
.in(in_1),
.Out(out_1)
)
InOut InOutInst2
(
.clk(g_clk),
.in(in_2),
.Out(out_2)
)
а в целом отправляйтесь в раздел ПЛИС, там есть iosifik а у него есть курс молодого бойца, в целом он полезен%) ну или пишите в личку если что)