清霜一梦

verilog中读取文件中的字符串

0
阅读(3496)

 今天给个程序大家玩玩。因为今天遇到一个问题,就是要向UART发送指令,指令非常多,都是字符串。一直copy 函数 UART ("COMM_1"); UART ("COMM_2");........可是指令有好几十个哦。如果遇上百个岂不是更惨。

  如果是C语言,大家肯定想到用数组遍历。不过Verilog中想用数组遍历,我没有尝试过 —— 我这里是字符串不是简单的16进制数。有兴趣的同学可以自己玩玩,大家一起交流。目前我采用的是文件的方式来做

第一步建立一个文件 ,名称是test_case.dat。里面保存你需要发送的指令,例如:

1
2
3
4
5
6
7
FPGA!!
gong--
cheng-
shi---
zhi---
jia---
oyeoye

第二步使用下列代码

`timescale 1ns/1ps module readfile ; integer str_cnt ; integer file_r,file_w ; reg [47:0]reg0 ; reg str_p ; initial begin str_cnt = 0 ; file_r = $fopen ("test_case.dat","r"); file_w = $fopen ("test_case_h.dat","w"); while(!$feof(file_r)) begin str_p = $fgets(reg0,file_r); if(reg0==10); //Tab else if (reg0==0) ; //file finish else begin str_cnt = str_cnt + 1 ; $display("%s",reg0); $fwrite(file_w, "NO=%d, %s = %h\n", str_cnt,reg0, reg0); end end $fclose (file_r); $fclose (file_w); #2 $stop ; end endmodule

输出到一个 test_case_h.dat文件。输出是这个样子的

1
2
3
4
5
6
7
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的解读


Baidu
map