Целочисленное преобразование в двоичное в Simulink
Это может выглядеть повторением моего предыдущего вопроса. Но я думаю, что нет. Я ищу технику для преобразования сигнала в десятичном формате в двоичный формат.
Я намерен использовать блоки Simulink в библиотеке Xilinx для преобразования десятичного в двоичный формат.
Таким образом, если вход равен 3, ожидаемый результат должен быть в 11( 2 тактовых цикла). Я ищу выход, который будет получен серийно.
Пожалуйста, предложите мне, как это сделать, или какие-либо ссылки в Интернете будут полезны.
Спасибо
3 ответа
Вы правы, что вам нужно, это параллельный последовательный блок от системного генератора.
Это описано в этом документе:
http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_1/sysgen_ref.pdf
Этот блок является блоком изменения скорости. Проверьте упоминания параллельного последовательного блока в этих документах для дальнейших описаний:
http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_1/sysgen_gs.pdf
http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_1/sysgen_user.pdf
Используйте нормальный константный блок с переменной Matlab в нем, это уже дает вывод в "нормальном" двоичном файле (при условии, что вы установили для него свойства без знака и двоичную точку в 0.
Затем вам нужно написать небольшой блок сериализатора, который принимает этот вход, фиксирует его в регистре сдвига, а затем сдвигает регистр один раз за такт, причем бит, который "падает с конца", становится вашим выходным битом. В зависимости от того, в какую сторону идет ваша смена, вы можете сделать так, чтобы MSB был первым, а LSB первым
Вам придется создать регистр сдвига из обычных регистров и мультиплексора перед каждым, чтобы выбрать, выполняете ли вы параллельную загрузку или переключение. (Это такая штука, которая представляет собой пару строк кода в VHDL, но правильная ошибка в графике).
Если вам нужно увеличить последовательную скорость, вам нужно синхронизировать ее с более быстрой тактовой частотой - вы можете использовать DCM для ее генерации.
Матлаб имеет dec2bin
функция, которая преобразует десятичное число в двоичную строку. Так, например dec2bin(3)
вернется 11
,
Есть также соответствующий bin2dec, который принимает двоичную строку и преобразует в десятичное число, так что bin2dec('11')
вернется 3
,
Если вы хотите преобразовать нецелое десятичное число в двоичную строку, сначала вам нужно определить, какое наименьшее двоичное место вы хотите представить, а затем выполнить небольшую предварительную и последующую обработку в сочетании с dec2bin, чтобы получить результаты, которые вы ищете. Итак, если наименьшее двоичное место, которое вам нужно, это 1/512-е место (или 2^-9), то вы можете сделать следующее (где binPrecision равно 1/512):
function result = myDec2Bin(decNum, binPrecision)
isNegative=(decNum < 0);
intPart=floor(abs(decNum));
binaryIntPart=dec2bin(intPart);
fracPart=abs(decNum)-intPart;
scaledFracPart=round(fracPart / binPrecision);
scaledBinRep=dec2bin(scaledFracPart);
temp=num2str(10^log2(1/binPrecision)+str2num(scaledBinRep),'%d');
result=[binaryIntPart,'.',temp(2:end)];
if isNegative
result=['-',result];
end
end
Результат myDec2Bin(0.256, 1/512)
будет тогда 0.010000011
и результат myDec2Bin(-0.984, 1/512)
было бы -0.111111000
, (Обратите внимание, что выводом является строка.)