使用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“这样的
输出的文档如何转换为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文档?另,大神你今天答的另外那个问题也是我,就是现在这个问题,麻烦了!