Убедили. Потратил некторое время на знакомство с ПЛИСинами, сделал usbblaster. Потренировался с квартусом.
Программа получилась следующая:
CODE
module counter4bit(
input wire in0,
input wire in1,
input wire in2,
input wire in3,
input wire in4,
input wire reset,
input wire enable,
input wire read,
input wire[3:0] adr,
output reg[7:0] out8bit
);
reg[23:0] counter0;
reg[23:0] counter1;
reg[23:0] counter2;
reg[23:0] counter3;
reg[23:0] counter4;
always @ (posedge in0)
begin : COUNTER0
if (reset == 1'b0)
begin
counter0 <= 0;
end
else if (enable == 1'b1)
begin
counter0 <= counter0 + 1;
end
end
always @ (posedge in1)
begin : COUNTER1
if (reset == 1'b0)
begin
counter1 <= 0;
end
else if (enable == 1'b1)
begin
counter1 <= counter1 + 1;
end
end
always @ (posedge in2)
begin : COUNTER2
if (reset == 1'b0)
begin
counter2 <= 0;
end
else if (enable == 1'b1)
begin
counter2 <= counter2 + 1;
end
end
always @ (posedge in3)
begin : COUNTER3
if (reset == 1'b0)
begin
counter3 <= 0;
end
else if (enable == 1'b1)
begin
counter3 <= counter3 + 1;
end
end
always @ (posedge in4)
begin : COUNTER4
if (reset == 1'b0)
begin
counter4 <= 0;
end
else if (enable == 1'b1)
begin
counter4 <= counter4 + 1;
end
end
always @ (posedge read)
begin
case (adr)
0: out8bit <= counter0;
1: out8bit <= (counter0 << 8);
2: out8bit <= (counter0 << 16);
3: out8bit <= counter1;
4: out8bit <= (counter1 << 8);
5: out8bit <= (counter1 << 16);
6: out8bit <= counter2;
7: out8bit <= (counter2 << 8);
8: out8bit <= (counter2 << 16);
9: out8bit <= counter3;
10: out8bit <= (counter3 << 8);
11: out8bit <= (counter3 << 16);
12: out8bit <= counter4;
13: out8bit <= (counter4 << 8);
14: out8bit <= (counter4 << 16);
endcase
end
endmodule
Несколько идиотских впросов:
1. В коде всё более-менее или есть какие-то страшные принципиальные ошибки?
2. Каким образом выбирать пины входов и выходов, чтобы задержка была минимальной, квартус какие-то намеки делает, что могло бы быть и быстрее.
3. Правильно ли делать такую синхронизацию по каждому из входов или, например, лучше сделать глобальный клок с частотой около 300 МГц и по каждому клоку смотреть состояние всех ног.
4. Счётчик на 24-бита - это есть гут или не гут, в даташитах же все упоминают про 16-битный при описании быстродействия. Резко ли падает скорость с увеличнием разрядности счётчика?
5. Как лучше сделать ногу ресет. При импульсе на счетных входах если ресет в нуле - сброс счётчика, а как бы сделать сброс в отсутствие импкльсов на входах. Пробовал, например, по posedge ресета сбрасывать все счетные регистры в ноль - квартус матерился, как я понял, из-за того, что значения регистров могут устанавливаться в двух местах - по ресету и по счёту, поэтому возникает конфликт.
6. Совсем идиотский: как сделать модуль "счетчик" и вставить пять счетчиком в этот большой модуль вместо пяти раз always @ (posedge in_)?
ПЛИСина - сплд epm240t100c5n.
Спасибо
Сообщение отредактировал IgorKossak - Jul 13 2014, 17:27
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!