原创 (转帖) 如何讀取/寫入文字檔? (IC Design) (Verilog)

2009-5-7 16:18 3518 5 5 分类: FPGA/CPLD

Abstract
Verilog雖然為硬體描述語言,亦提供讀取/寫入文字檔的功能。

Introduction
為什麼需要用Verilog讀取/寫入文字檔呢?主要用在寫Testbench,並且有兩個優點:
1.資料處理的個數不需寫死在Testbench內。
2.文字檔可以用其他更強大的語言產生,如C/C++、Python。
3.將資料輸出到文字檔後,可用其他語言分析,如C/C++、Python、Excel。

Verilog

1?/*?
2?(C) OOMusou 2008?http://oomusou.cnblogs.com
3?
4?Filename??? : FileIO_tb.v
5?Compiler??? : ModelSim SE 6.1f
6?Description : Demo how to access text file
7?Release???? : 02/11/2008 1.0
8?*/
9?
10?`timescale?1?ns/1?ns
11?
12?module FileIO_tb;
13?
14?integer fp_r, fp_w, cnt;
15?reg [7:0] reg1, reg2, reg3;
16?
17?initial begin
18??fp_r?=?$fopen("data_in.txt",?"r");
19??fp_w?=?$fopen("data_out.txt",?"w");
20?
21?while(!$feof(fp_r)) begin
22??cnt?=?$fscanf(fp_r,?"%d %d %d", reg1, reg2, reg3);
23??$display("%d %d %d", reg1, reg2, reg3);
24??$fwrite(fp_w,?"%d %d %d\n", reg3, reg2, reg1);
25??end
26?
27??$fclose(fp_r);
28??$fclose(fp_w);
29?end
30?
31?endmodule


Command Window

点击看大图

data_in.txt

1?2?3
4?5?6


data_out.txt

?3?2?1
?6?5?4


18行

fp_r?=?$fopen("data_in.txt",?"r");
fp_w?
=?$fopen("data_out.txt",?"w");


$fopen()類似C語言的fopen(),連參數都一樣,主要用來開啟檔案,並取得file handle。


21行

while(!$feof(fp_r)) begin
end


使用while迴圈,若不是最後一行,則一直讀取,類似c語言的while(!foef(fp_r)) {}。


22行

cnt?=?$fscanf(fp_r,?"%d %d %d", reg1, reg2, reg3);


$fscanf()類似C語言的fscanf(),連參數都一樣,可將資料從文字檔讀入變數;與C語言不同的是,$fscanf()傳回讀入的變數個數,一定得用一個變數去接,但C語言的fscanf()則可忽略。


23行

$display("%d %d %d", reg1, reg2, reg3);


$display()類似C語言的printf(),可將變數顯示在commanr window,並且自動換行。


24行

$fwrite(fp_w,?"%d %d %d\n", reg3, reg2, reg1);


$fwrite()類似C語言的fprintf(),可將變數寫入文字檔。


27行

$fclose(fp_r);
$fclose(fp_w);


$fclose()類似C語言的fclose(),可關閉檔案。


所對應的C語言

?1/*
2(C)OOMusou?2008?http://oomusou.cnblogs.com
3
4Filename:FileIO.c
5Compiler:Visual?C++?8.0
6Description:Demo?how?to?access?text?file
7Release:02/11/2008?1.0
8*/
9
10#include<stdio.h>
11
12intmain(){
13FILE*fp_r=fopen("data_in.txt","r");
14FILE*fp_w=fopen("data_out.txt","w");
15
16intreg1,reg2,reg3;
17while(!feof(fp_r)){
18fscanf(fp_r,"%d%d%d",?&reg1,&reg2,&reg3);
19printf("%d%d%d\n",reg1,reg2,reg3);
20fprintf(fp_w,"%d%d%d\n",reg3,reg2,reg1);
21}
22
23fclose(fp_r);
24fclose(fp_w);
25}

Conclusion
在COM、.NET之前,不同語言之間要合作,唯一的管道就是文字檔。Verilog是硬體語言,若要和軟體語言合作,又得使用文字檔這種古老的方法了。

Verilog是一個C-Like的語言,連system function也特意地跟C語言靠攏,本例又再度得到證明,Verilog程式碼幾乎與C語言一行一行的對應。若你原本熟悉軟體的C語言,又想切入硬體描述語言,Verilog會讓你備感親切。



文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条