如何verilog将txt中的二进制码元输入

使用verilog将txt文档中的01码导入,数据量较多,大概有80000个码元,然后将01码变为串行的型号,即方波,在系统中运行,我自己写的代码不行,希望能给出代码
reg rp [0:100000];
initial $readmemb ("meme.txt",rp);
always begin
#50;clk = ~clk;
end
integer k;
initial begin
for (k=0;k<80000;k=k+1);
begin
#10;
pi1 = rp[k];
end
end
txt文档中的01码没有空格,即”0101010101010111100001010001“这样的

$readmemb通常用于仿真时初始化ram的 那个很长的码只是一个数据 只会被放到rp[0]里 并且被截位了

verilog处理txt中数据没有空格的情况可以用$fgetc这个函数 每执行一次读一个ASCII字符 然后你再把这个字符转换成二进制数 也可以用$fwrite输出到txt
比如
reg [7:0] char;
integer fid0, fid1;

initial
begin
fid0 = $fopen({"./input/", filename0}, "r");
fid1 = $fopen({"./output/", filename1}, "w");
while (!$feof(fid0))//对于你的情况 也可以repeat(80000)
begin
char = $fgetc(fid0);
//如果想直接用char的话 就要转一下格式 asicii的48h就是0 49是1
$fwrite(fid1, "%c", char);//输出到文件的话不用转格式 但是需要用$fscanf(fid, "%h", temp)来二次读取
end
end追问

输出的文档如何转换为01码呢?怎么直接用这个读取的数据呢?

追答

用$fwrite输出到文件不用转格式就是01了 你可以写一段代码运行一下 打开输出文件看看

直接用的话就是把读进来的数据减去48 从ascii码变成数字 比如 bin = char - 48;
或者用字符串的方式 比如if (char == "0") bin = 0;if (char == "1") bin = 1
建议不用$readmemb给一个很大的数组初始化 除非数据不多 否则在整个仿真过程中都占很多内存

追问

因为你代码中filename0 不知道如何写,我用的是fid0 = $fopen( "meme.txt", "r");然后输出数据少了一截,源码为120行,输出115行。另外我不知如何用这个char,如何将数值一个个输入系统,每个时钟进一个,或者进一组都行。如果方便,希望能QQ联系85188629,不胜感激!必当重谢!

追答

filename0就是个输入文件名的字符串 写成"meme.txt"没问题

char是8位变量 可以存储一个ascii字符
之前是以为你只有1行数 如果多行的话需要丢掉换行字符
$fwrite输出是不换行的 应该用$fdisplay(之前写错了)
我写了一段简单代码 你看一下就明白了

module test ();

reg [7:0] char;
integer fid0, fid1;

initial
begin
fid0 = $fopen("test.in", "r");
fid1 = $fopen("test.out", "w");
while (!$feof(fid0))
begin
char = $fgetc(fid0);
if (char != 10 && char != 32 && char != 255) //丢掉换行、空格和文件尾
begin
$display("char = %0d", char-48); //这个char-48可以直接用 就是0或者1
$fdisplay(fid1, "%c", char); //输出文件是一行一个数字 用$fscanf读进来直接就是0或者1 执行一次$fscanf就是一个数 添上@(posedge clk)就是一个时钟沿进一个数
end
$finish;
end

endmodule

追问

非常感谢您的指导!想再问一个问题,我这个系统最后需要输出码元到txt文档,最后结果是这样的,从5000ns开始,输出data_out 为一个1723位的二进制数值,往后每100ns 数值变换一次,到第三组数据的时候,只有前628个数值有效,后面全为1,(这就是系统输入的码元)请问如何准确输出txt文档?另,大神你今天答的另外那个问题也是我,就是现在这个问题,麻烦了!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-26
建议先用matlab来生成01序列的TXT文件,然后再modelsim仿真TB中加入这个TXT就可以了。
给你个模板:
假设序列数有1000个,clk周期是10ns。

matlab中存入TXT(每个数以8进制存入)
(yourdata是你要写入TXT的数据)
fid = fopen('din.dat','wt');
fprintf(fid,'%x\n',yourdata); (%x是八进制也就是8位,如果16位宽,请改为十六进制)
fclose(fid);

在modelsim的testbench中:
reg [7:0] din; //这是你要的数据,每位8bit,每个clk传输一个,一共1000个
reg [7:0] din_txt[999 : 0]; //因为有1000个数据,缓存从TXT读入的数据

integer i;

initial
begin
clk = 0;
rst_n = 0;
din = 0;
$readmemh("din.dat",din_txt);
#100
rst_n = 1;
for(i=0; i<1000; i = i+1)
begin
#10 //这个是你clk的周期

din = din_txt[i];
end
end

always #5 clk = ~clk;
第2个回答  2014-01-25
txt中的01001这样的格式代表它是一个reg
应该写成:
reg [0:100000] rp;

如果写成reg rp [0:100000];

txt中要每行写一个二进制数,类似:
1
0
0
1
1
这样
相似回答