vim技巧--提取文本與文本替換

来源:https://www.cnblogs.com/xiaoguoic/p/18064396
-Advertisement-
Play Games

前幾天遇到一個使用情景,需要從一個包含各個讀取代碼文件路徑及名字的文件中把文件路徑提取出來,做一個filelist,這裡用到了文本的提取和替換,這裡做個小總結記錄一下。 從網上找了一個作者寫的代碼用來練習。 module asyn_fifo #( //parameter declaration pa ...


前幾天遇到一個使用情景,需要從一個包含各個讀取代碼文件路徑及名字的文件中把文件路徑提取出來,做一個filelist,這裡用到了文本的提取和替換,這裡做個小總結記錄一下。
從網上找了一個作者寫的代碼用來練習。

module asyn_fifo #(
//parameter declaration
parameter ADDR_WIDTH     		=	4	,
parameter DATA_WIDTH	    		=	16	,
parameter ALMOST_FULL_GAP               =	3	,//將滿,離滿還有ALMOST_FULL_GAP時,almost_full有效
parameter ALMOST_EMPTY_GAP              = 	3	,//將空,離空還有ALMOST_EMPTY_GAP時,almost_empty有效
parameter FIFO_DEEP                     =       16     
)
(
	//fifo write
	wr_clk		,
	wr_en		,
	almost_full ,
	full		,
	wr_data		,
	//fifo read
	rd_clk		,
	rd_en		,
	almost_empty,
	empty		,
	rd_data		,
	wr_reset	,
	rd_reset	
);
1)先思考寫時鐘方向,首先是寫請求,在不滿且寫使能有效拉高寫請求.

assign wen = wr_en && (!full)
2)其次是寫地址,

always @(posedge wr_clk or negedge wr_reset)
	if(!wr_reset)
		waddr <= {(ADDR_WIDTH+1){1'b0}};
	else if(wen)
		waddr <= waddr + 1'b1;
	else
		waddr  <= waddr;
3)將寫地址轉換為格雷碼

always @(posedge wr_clk or negedge wr_reset)
	if(!wr_reset)
		waddr_gray <= {(ADDR_WIDTH + 1){1'b0}};
	else
		waddr_gray<= waddr^(waddr>>1);
4)將讀格雷碼轉換到寫時鐘域,準備計算將滿和滿信號了

always @(posedge wr_clk or negedge wr_reset)
	if(!wr_reset) begin
		raddr_gray_sync 	<= {(ADDR_WIDTH+1){1'b0}};
		raddr_gray_sync_d1  <= {(ADDR_WIDTH+1){1'b0}};
	end
	else begin
		raddr_gray_sync 	<= raddr_gray;
		raddr_gray_sync_d1  <= raddr_gray_sync;
	end
5)將讀格雷碼轉換為二進位(這樣有利於將滿信號和FIFO usdws(used words,使用了多少字)的計算)

integer i;
always @(*)
begin
    for(i=0;i<ADDR_WIDTH+1;i=i+1)
	raddr_gray2bin = ^(raddr_gray_sync_d1>>i);
end
6)寫地址與讀地址間隔計算,寫了多少個字了

always @(*)begin
	if(raddr_gray2bin[ADDR_WIDTH] ^ waddr[ADDR_WIDTH])//二進位擴展位為迴圈指示位
		wr_gap = raddr_gray2bin[ADDR_WIDTH-1:0] - waddr[ADDR_WIDTH-1:0];
	else
		wr_gap = FIFO_DEEP + raddr_gray2bin - waddr;
end
7)almost full信號產生

 always @(posedge wr_clk or negedge wr_reset)begin
	if(!wr_reset)
		almost_full <= 1'b0;
	else begin
		if(wr_gap < ALMOST_FULL_GAP)
			almost_full <= 1'b1;
		else
			almost_full <= 1'b0;
	end
end
8)full信號產生

always @(posedge wr_clk or negedge wr_reset)begin
	if(!wr_reset)
		full <= 1'b0;
	else
		full <= (wr_gap==1)&&wen;
9)再來寫讀時鐘方向,其實與寫時鐘方向堆成,首先是讀請求,

assign ren = rd_en &&(!empty);
10)FIFO讀地址的產生

always @(posedge rd_clk or negedge rd_reset)
	if(!rd_reset)
		raddr <= {(ADDR_WIDTH+1){1'b0}};
	else if(ren)
		raddr <= raddr + 1'b1;
        else
                raddr <= raddr;
11)讀地址轉變為讀格雷碼

always @(posedge rd_clk or negedge rd_reset)
	if(!rd_reset)
		raddr_gray <= {(ADDR_WIDTH + 1){1'b0}};
	else
		raddr_gray <= raddr^(raddr>>1);
12)寫地址同步到讀時鐘域

always @(posedge rd_clk or negedge rd_reset)begin
	if(!rd_reset) begin
		waddr_gray_sync 	<= {(ADDR_WIDTH+1){1'b0}};
		waddr_gray_sync_d1  <= {(ADDR_WIDTH+1){1'b0}};
	end
	else begin
		waddr_gray_sync 	<= waddr_gray;
		waddr_gray_sync_d1  <= waddr_gray_sync;
	end
end
13)寫地址格雷碼變成二進位,便於讀格子的計算

integer j;
always @(*)begin
for(j=0;j<ADDR_WIDTH+1;j=j+1)
	waddr_gray2bin = ^(waddr_gray_sync_d1>>i);
end
14)讀格子的計算—即還有多少數據未讀

always @(*)
	rd_gap = waddr_gray2bin - raddr;
15)almost_empty信號產生

always @(posedge rd_clk or negedge rd_reset)begin
	if(!rd_reset)
		almost_empty <= 1'b1;
	else begin
		if(rd_gap < ALMOST_EMPTY_GAP)
			almost_empty <= 1'b1;
		else
			almost_empty <= 1'b0;
	end
end
16)產生empty信號

always @(posedge rd_clk or negedge rd_reset)begin
	if(rd_reset)
		empty <= 1'b1;//複位了FIFO為空
	else
		empty <= (rd_gap == 1) & rd_en;
end
17)例化雙口RAM,在寫請求有效時將數據存放到裡面,併在讀請求有效時讀出數據。

ram  ram_inst#(
  parameter RAM_WIDTH = 4
)(
  .wr_clk(wr_clk),
  .addra(wr_addr),
  .dina(wr_data),
  .wra(wen),
///////
  .rd_clk(rd_clk),
  .addrb(rd_addr),
  .dina(rd_data),
  .rdb(ren)
);
練習1-將作者寫的步驟文字,即x)開頭的文字提取出來

使用v/pattern/d來實現,這個命令的意思是將匹配pattern的行提取出來,其中pattern就是你定義的匹配模式,如下圖所示。其中^代表匹配行首,\d代表匹配一個數字,這樣我們就完成了提取。那如果我想刪除掉這些而只保留代碼呢?

:v/^\d/d

我們使用g/pattern/d來實現,這個命令的意思是將匹配pattern的行刪除而保留其他。

:g/^\d/d

以此類推,重點是會寫pattern,這裡有個作者已經總結的很好了,可以參考這個作者的總結,已經總結很全了。 https://blog.csdn.net/lazyclough/article/details/6193398

練習3-獲取該模塊的信號列表(先提取再替換)

第一步:
可以看出信號列表都是以,結尾,除了最後一個,所以可以先複製最後一個信號,然後使用如下命令開始提取。

:v/.*,/d

其中.*分別代表任意字元,任意多個,“,”就是匹配“,”,得到瞭如下代碼。

第二步:
可以看到,還有些以“.”開頭的和以“parameter”開頭的我們不需要,所以可以使用如下命令去除(這個時候代碼已經很少了其實可以用“ndd”刪除n行,或者滑鼠選中按“d”的方法來操作了,但這裡是為了做練習,所以不用它們):

:g/^\s\s\./d

其中^匹配行首,\s\s匹配兩個空格,也可以用\s{2},{2}代表匹配兩次,.匹配“.”,然後代碼如下。

然後輸入命令

:g/parameter/d

得到如下代碼

第三步:
然後我們需要將“,”全部去除,使用替換命令:range s/pattern/new string/command(其實這列逗號排列是整齊的,可以用列操作很方便的刪除,但是我們為了練習)。

:%s/,//g

其中range的%代表全局匹配替換,也可以用行號來指定匹配替換的範圍,g代表匹配到的全部替換,gc代表全部替換但是每次替換前要詢問。得到的代碼如下:

到這裡基本就完成了,採用列操作或者上述辦法去除掉開頭的空格,再把之前複製的最後一個信號複製上去就完成任務。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過引入分散式冪等性框架,可以有效處理分散式系統中的重覆操作問題,確保系統穩定運行並保持數據的一致性。 ...
  • 前言 雖然已經正式轉JAVA了,但最近發現一個特別好的開源項目masuit,不僅提供很多簡便的功能,還有圖像的一些特殊操作功能。 之前我們比較圖片應該都是使用的openCV,不過這個masuit,看上去也不錯,而且代碼使用簡單,因此強烈推薦。 下麵就實現一個簡單圖像對比。 實現對比 首先添加引用ma ...
  • 前一段時間我用 WPF 開發了一個查看 emoji 表情的小工具 https://github.com/he55/EmojiViewer ,由於最近我使用 macOS 系統比較多,我想能在 macOS 系統上也能使用這個工具。於是我嘗試將 WPF 應用遷移到 Electron 框架,感覺這個框架很強 ...
  • node-exporter常用監控指標 CPU相關指標: node_cpu_seconds_total{mode="idle"}:CPU空閑時間(秒)的總和。這是評估CPU使用率的重要指標之一。 node_cpu_seconds_total{mode="system"}、node_cpu_secon ...
  • STM32標準庫定時器輸入捕獲 1.輸入捕獲介紹 輸入捕獲為STM32定時器的一個功能,可以用來測量輸入信號的頻率和占空比。 具體原理:當輸入信號經過比較捕獲通道時,STM32會依據通道的極性設置決定是否觸發捕獲中斷TIM_IT_CCx。此時定時器會將當前計數值TIMx->CNT的值保存在TIMx- ...
  • 如題,在使用Pyinstaller庫打包過程中,如果遇到IndexError:tuple index out of range,不必驚慌,本質上是庫函數在傳參過程中出現異常 下麵是解決方案: 找到..\envs\steamlit\lib\dis.py這個文件。 如果你是用的虛擬環境,比如conda, ...
  • 1. 查看防火牆狀態:active (running) 即是開啟狀態 systemctl status firewalld 2. 如果不是顯示 active 狀態,需要打開防火牆 # 啟動 systemctl start firewalld # 查看狀態 systemctl status firew ...
  • 1、準備材料 正點原子stm32f407探索者開發板V2.4 STM32CubeMX軟體(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP模擬器 2、學習目標 瞭解 FreeRTOS 相關知識,並熟悉使用 STM32CubeMX 軟體配置 FreeRT ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...