不同版本matlab的m语言语法会略有不同,这里使用的版本为Matlab 2021a。
一. 10进制整数矩阵转二进制字符矩阵
因为FPGA只能识别二进制,所以在做Verilog仿真时经常需要matlab生成有符号二进制的txt文件,涉及到进制转换,故编写此函数。
注意,函数内部加入了输入判断,输入不合法会报eroor。
A = [-64, -512, 9; -128, 5, 1; 3, 12, -19]
bit_width = 10
myDec2Bin(A, bit_width)
function yout_signed_bin_str = myDec2Bin(xin_int, bit_width)
%{
* description:输入十进制整数矩阵,得到指定位数的二进制补码字符矩阵,
整数数值满足范围:-(2^(bit_width - 1))~2^(bit_width - 1) - 1
* @param xin_int 十进制数矩阵
* @param bit_width 二进制位数
* return yout_signed_bin_str 有符号的指定位数的二进制字符矩阵
%}
% 判断输入参数是否合法
for i = 1:numel(xin_int)
if fix(xin_int(i)) ~= xin_int(i) % 输入应是整数
error('Error!, xin_int %d should be int, but there is %s', i, class(xin_int(i)));
% 输入不能超过有符号bit_width的范围
elseif xin_int(i) < -(2^(bit_width - 1)) || xin_int(i) > 2^(bit_width -1) - 1
error('Error!, xin_int %d should be in %d ~ %d, but it is %d', ...
i, -(2^(bit_width - 1)), 2^(bit_width -1) - 1, xin_int(i));
end
end
yout_signed_bin_str = strings(size(xin_int)); % 创造一个与输入格式相同的字符串数组
for i = 1:numel(xin_int) % numel(A)表示矩阵A元素个数
yout_signed_bin_str(i) = dec2bin(xin_int(i) + (xin_int(i) < 0) * 2^bit_width, bit_width);
if xin_int(i) < 0
yout_signed_bin_str(i) = dec2bin((2^bit_width + xin_int(i)), bit_width);
else
yout_signed_bin_str(i) = dec2bin(xin_int(i), bit_width);
end
end
end
To be continued…