今天給個程序大家玩玩。因為今天遇到一個問題,就是要向UART發送指令,指令非常多,都是字符串。一直copy 函數 UART ("COMM_1"); UART ("COMM_2");........可是指令有好幾十個哦。如果遇上百個豈不是更慘。
如果是C語言,大家肯定想到用數組遍歷。不過Verilog中想用數組遍歷,我沒有嘗試過 —— 我這里是字符串不是簡單的16進制數。有興趣的同學可以自己玩玩,大家一起交流。目前我采用的是文件的方式來做
第一步建立一個文件 ,名稱是test_case.dat。里面保存你需要發送的指令,例如:
FPGA!! gong-- cheng- shi--- zhi--- jia--- oyeoye
第二步使用下列代碼
1 `timescale 1ns/1ps 2 3 4 5 module readfile ; 6 7 integer str_cnt ; 8 integer file_r,file_w ; 9 10 reg [47:0]reg0 ; 11 reg str_p ; 12 initial begin 13 str_cnt = 0 ; 14 file_r = $fopen ("test_case.dat","r"); 15 file_w = $fopen ("test_case_h.dat","w"); 16 17 while(!$feof(file_r)) begin 18 str_p = $fgets(reg0,file_r); 19 if(reg0==10); //Tab 20 else if (reg0==0) ; //file finish 21 else begin 22 str_cnt = str_cnt + 1 ; 23 $display("%s",reg0); 24 $fwrite(file_w, "NO=%d, %s = %h\n", str_cnt,reg0, reg0); 25 end 26 end 27 28 $fclose (file_r); 29 $fclose (file_w); 30 #2 31 $stop ; 32 end 33 34 endmodule
輸出到一個 test_case_h.dat文件。輸出是這個樣子的
NO= 1, FPGA!! = 465047412121 NO= 2, gong-- = 676f6e672d2d NO= 3, cheng- = 6368656e672d NO= 4, shi--- = 7368692d2d2d NO= 5, zhi--- = 7a68692d2d2d NO= 6, jia--- = 6a69612d2d2d NO= 7, oyeoye = 6f79656f7965
注意看哦,我的test_case.dat中所有的字符串都是6*8bit的。對應程序中的reg0是48bit的。如果字符串bit少了會把換行符讀進去,如果字符串的bit多了會遺漏。
都說了是給大家玩的程序。所以有興趣的朋友可以查詢一下standard中對$feof以及$fgets的解讀
歡迎加入: FPGA廣東交流群:162664354
FPGA開發者聯盟: 485678884