偶然在 QQ 群里看到一個大佬發的 Modelsim 波形顯示字符,閑着沒事拿來玩玩,並將改良過程也整理一下。
一、字符點陣產生
軟件采用 PCtoLCD2002,打開后不需要設置,直接打字然后點擊【生成字模】,然后復制產生的字模。
二、字模調整
復制之后的字模如下所示:
將字模中的提示信息、標點符號、注釋都刪除。並且將相鄰兩個數據調整為一個數據,並將調整后的所有數據調整為一列,如下所示:
調整完后將該文件重命名並修改后綴為【char.hex】,供后面 Verilog 讀取該文件。
三、代碼設計
原文的設計有 2 個 Verilog 設計文件和 1 個 testbench 文件,我將其合並為 1 個,如下所示:
1 `timescale 1ns/1ps //時間精度 2 3 module char_display; 4 //========================< 信號 >========================================== 5 reg clk = 0 ; //時鍾,初始為0 6 reg [15:0] ram[2**8-1:0] ; //數組 7 reg [15:0] cnt = 0 ; //計數器,初始為0 8 wire [ 7:0] rd_addr ; //讀地址 9 reg [15:0] rd_data ; //數組讀數據 10 wire [15:0] char ; //字符顯示 11 //========================< 代碼 >========================================== 12 //時鍾 13 always #10 clk = ~clk; 14 15 //數組初始化,讀取字符數據 16 initial $readmemh("char.hex", ram); 17 18 //數組讀地址 19 always@(posedge clk) begin 20 cnt <= cnt + 1'b1; 21 end 22 23 assign rd_addr = cnt[15:8]; 24 25 //數組讀數據 26 always @(posedge clk) begin 27 rd_data <= ram[rd_addr]; 28 end 29 30 //波形輸出(rd_data已經有形狀了,再把它加粗) 31 assign char = rd_data[15:0] & {16{clk}}; 32 33 34 endmodule
四、仿真波形
建立 Modelsim 工程並顯示 char 信號的波形,展開 char 信號即可看到字符了。當然也可以寫個腳本自動化仿真,腳本文件如下所示:
1 # ========================< 清空軟件殘留信息 >============================== 2 3 # 退出之前仿真 4 quit -sim 5 6 # 清空信息 7 .main clear 8 9 # =========================< 建立工程並仿真 >=============================== 10 11 # 建立新的工程庫 12 vlib work 13 14 # 映射邏輯庫到物理目錄 15 vmap work work 16 17 # 編譯文件 18 vlog *.v 19 20 # 啟動仿真:10.7之前版本的仿真請將"-voptargs=+acc換成-novopt" 21 vsim -voptargs=+acc work.char_display 22 23 # ============================< 加載波形 >================================== 24 25 # 添加標簽和波形 26 add wave -position insertpoint \ 27 {sim:/char_display/char[15]} \ 28 {sim:/char_display/char[14]} \ 29 {sim:/char_display/char[13]} \ 30 {sim:/char_display/char[12]} \ 31 {sim:/char_display/char[11]} \ 32 {sim:/char_display/char[10]} \ 33 {sim:/char_display/char[9]} \ 34 {sim:/char_display/char[8]} \ 35 {sim:/char_display/char[7]} \ 36 {sim:/char_display/char[6]} \ 37 {sim:/char_display/char[5]} \ 38 {sim:/char_display/char[4]} \ 39 {sim:/char_display/char[3]} \ 40 {sim:/char_display/char[2]} \ 41 {sim:/char_display/char[1]} \ 42 {sim:/char_display/char[0]} 43 44 # 跑400us 45 run 400us
最后的結果如下所示:
也可以發揮創造力,弄個兩行的字符波形出來,只需要將關鍵代碼多設置一份就行了。
五、工程鏈接
鏈接:https://pan.baidu.com/s/1kKI0d2TzDfh78Ed_RAMcAA
提取碼:867g
參考資料:公眾號《數字積木》