Понимание времени сигнала в Xilinx Simulink - PullRequest
2 голосов
/ 12 мая 2011

У меня возникли проблемы с пониманием концепции временных сигналов в Simulink (Xilink Library).

Я объясню на примере,

Предположим, у вас есть последовательный битовый поток, и вы хотите взять сумму нечетного и четного битов,

Итак, вы, вероятно, написали бы Matlab Code примерно так:

Data_Bits=[1 2 3 0 4 5 1 2 0 9];

Sum_Bits=[];
for i=1:length(Data_Bits)/2
    Sum_Bits=[Sum_Bits Data_Bits(2*i-1)+Data_Bits(2*i)]
end

Предположим, на мгновение мы игнорируем все случаи оптимизации и углов, за исключением случаев, когда этот код может не работать.

Предполагая, что мы должны реализовать это на аппаратном уровне, Data_Bits поступает последовательно, так что вы в основном ждете 2 такта, чтобы получить 2 входных бита, добавить их и сгенерировать вывод.

Так что на каждые 2 такта у вас есть выход.

Так можно ли управлять синхронизирующим сигналом в Xilinx, чтобы у нас был правильный вывод.

Так что я не хочу иметь промежуточный результат на выходе.

Как мы можем этого достичь? Я подумываю об использовании какого-нибудь входного разрешения с свободно работающими часами (счетчиком).

Но как нам это сделать при проектировании действительно сложной системы?

У меня нет такого большого опыта в разработке аппаратного обеспечения. Поэтому, если мой вопрос опасно граничит с ПРОСТЫМ и глупым, я прошу прощения за мой интеллект.

Спасибо за чтение

Киран

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Если вы хотите, чтобы ваш выход изменялся только тогда, когда он «действителен», вы используете включенный регистр на выходном выводе с сигналом разрешения, подключенным к чему-то, что является высоким для одного такта в то же время, что и значение в регистр тот, который вы хотите представить на выходе.

В вашем случае ваш «действительный» сигнал переключается между «1» и «0» в альтернативных тактовых циклах, так что вы можете просто использовать триггер с его выходом, возвращаемым через инвертор. (В коде Дэвидда вы можете увидеть это в строке с комментариями //tflipflop).

Если у вас была более сложная система, которая действительна только один раз в n циклах, вы можете использовать счетчик, который сбрасывает каждые n циклов и использовать импульс сброса в качестве "действительного" сигнала.

0 голосов
/ 12 мая 2011
Input stream -------------> AddSub -> register -> output stream
Input stream -> register -> AddSub    register
                                      register
                           counter -> register(enable)

добавить входной поток и входной поток с задержкой на 1 цикл.используйте 1-битный счетчик (или T-триггер), чтобы включить регистр на выходе сумматора.

Это то, что вы ищете?

Также, что вы подразумеваете под«управлять» этим во время работы сложной системы?Verilog или VHDL для этой конструкции будет очень простым и может использоваться вместо блоков системного генератора.

//note: initialization/reset and limit handling is not included and would need to be considered.
always@(posedge clk)
begin
    databits_1dly <= databits;  //create a once cycle delayed version of databits
    sum <= databits_1dly + databits; //adder
    every_other <= !every_other //t flip flop.
    if (every_other)  //invert if you want the other every_other
       sum_every_other <= sum
end
...