自己刚刚进入FPGA行业不久,对写好的module进行调用时,每次都是自己手动敲,而且还要对齐什么的,比较麻烦。所以自己就写了小工具,将module前面的部分导入进软件中,会自动生成相应的Inst模块,并进行了对齐。
PS:可能有这样的小工具,但是自己没仔细查,想着自己写一个算了,所以就有了这个小工具。
具体操作看上图即可知。
小工具使用MATLAB APPDesigner设计的,版本号是2019a。
核心代码:
% Button pushed function: GenInstButton
function GenInstButtonPushed(app, event)
app.InstTextArea.Value = '';
moduleCell = app.ModuleTextArea.Value;
allCodeLine = numel(moduleCell); %%%module模块的所有行数
% STEP1:寻找模块名行和结束行
moduleLine = [];
endLine = [];
for iLine = 1:allCodeLine
strTemp = moduleCell{iLine};
if(strfind(strTemp,'module')~=0)
moduleLine = iLine;
end
if(strfind(strTemp,');')~=0)
endLine = iLine;
end
end
if(isempty(moduleLine)|isempty(endLine))
msgbox("未能够搜索到正确的模块名行和结束行");
return;
end
% STEP2:确定模块名并生成例化名
%%% 锁定模块名的范围
moduleNameStr = moduleCell{moduleLine};
indTemp1 = strfind(moduleNameStr,'module');
indTemp2 = strfind(moduleNameStr,'(');
%%% 生成有效模块名
moduleValidNameStr = moduleNameStr(indTemp1+6:indTemp2-1);
if ~isempty(moduleValidNameStr)
%%% 说明:这部分从module到(之间除了模块名就是空格,没有其他的值
indTemp3 = find(abs(moduleValidNameStr) ~= 32);%%% 空格字符的ASCII为32
instNameStr = [moduleValidNameStr(indTemp3(1):indTemp3(end)),' ',moduleValidNameStr(indTemp3(1):indTemp3(end)),'_inst('];
instCell{1} = instNameStr;
end
% STEP3:确定端口名并生成相应的例化部分
%%% 锁定端口名的范围
lineNum = moduleLine;
for jj = lineNum + 1:endLine - 1
portNameStr = moduleCell{jj};
%%%% 锁定端口起始位置
if (strfind(portNameStr,']') ~=0)
indTemp4 = strfind(portNameStr,']') + 1;
elseif (strfind(portNameStr,'input') ~=0)
indTemp4 = strfind(portNameStr,'input') + 5;
elseif (strfind(portNameStr,'output') ~=0)
indTemp4 = strfind(portNameStr,'output') + 6;
else
continue;
end
lineNum = lineNum + 1;
%%%% 锁定端口终止位置
if (strfind(portNameStr,',') ~=0)
indTemp5 = strfind(portNameStr,',') - 1;
end
%%%% 确定端口名
strTemp1 = portNameStr(indTemp4:indTemp5);
indTemp6 = find(abs(strTemp1) ~= 32);
if(jj < endLine - 1)
portValidNameStr = [' .',strTemp1(indTemp6(1):indTemp6(end)),'(),'];
cellLen(lineNum) = length(portValidNameStr);
else
%%%%% 最后一个端口没有逗号
portValidNameStr = [' .',strTemp1(indTemp6(1):indTemp6(end)),'()'];
cellLen(lineNum) = length(portValidNameStr) + 1;
end
instCell{lineNum} = portValidNameStr;
end
instCell{lineNum + 1} = ');';
%%!!! 说明:instCell不能存在空cell,即使"[]",否则在textarea赋值时会报错
% STEP4:对例化后的模块名进行对齐操作
maxLen = max(cellLen);
for ii = 2:lineNum
strTemp2 = ones(1,maxLen)*32;%%% 生成空格字符
instStrTemp = instCell{ii};
len = length(instStrTemp);
if ii ~= lineNum
strTemp2(1:len - 3) = instStrTemp(1:len - 3);
strTemp2(maxLen - 2:maxLen) = instStrTemp(len - 2:len);
else
strTemp2(1:len - 2) = instStrTemp(1:len - 2);
strTemp2(maxLen - 2:maxLen-1) = instStrTemp(len - 1:len);
end
instCell{ii} = char(strTemp2);
end
app.InstTextArea.Value = instCell';
end
链接:https://download.csdn.net/download/liweinjit/86514068