Verilog 模块例化小工具

自己刚刚进入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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值