verilog读入.txt的有符号十进制数,把有符号十进制数写入到.txt文件中

17 篇文章 16 订阅

在进行功能仿真时,经常需要使用外部的数据作为输入,而数据经常存放在.txt,.dat等文本文件中;

本文介绍一种从.txt中读取有符号十进制数的方式和写入有符号数到.txt文件的方式:

代码如下:

一、从.TXT中读取有符号十进制数:

reg signed [8:0] dataa1[1:784];
reg signed [8:0] datab[1:36];
reg signed [8:0] data1;
integer i;
integer s;
integer m;
integer n;
integer fid1;
integer fid2;
initial
begin
   fid1 = $fopen("C:/Users/Desktop/conv_data.txt","r");//这里的斜杠与计算机里面的斜杠不一样
                                                       //计算机里面的斜杠为‘\’,这里为‘/’
   for(i=1;i<=784;i=i+1)
       begin
        s= $fscanf(fid1,"%d",dataa1[i]);
       end
    $fclose(fid1);
end

initial
begin
   //fid = $fopen("C:\Users\CONV_project2\Wc1_8.dat","r");  这样是会报错的
   fid2 = $fopen("C:/Users/15003813081/Desktop/ZYK/CONV_project2/core_data.txt","r");
   for(m=1;m<=36;m=m+1)
       begin
        n= $fscanf(fid2,"%d",datab[m]);
       end
   $fclose(fid2);
end
reg[11:0] count1;
reg[6:0] count2;
always@(posedge clk or negedge rst)
begin
   if(rst)
      begin
         count1 <= 0;
      end
    else
      begin
          if(count1 == 12'd2000)
             count1 <= count1;
          else
             count1 <= count1 + 1'b1;
      end
end

always@(posedge clk or negedge rst)
begin
  if(rst)
     begin
        dataa <= 16'd0;
        dataa_valid <= 1'b0;
     end
  else
     begin
        if(count1 >= 200 && count1 <= 983 )
            begin
               dataa <= dataa1[count1-199];
               dataa_valid <= 1'b1;
            end
        else 
            begin
              dataa <= 9'd0;
              dataa_valid <= 1'b0;
            end
     end
end

always@(posedge clk or negedge rst)
begin
   if(rst)
      begin
         count2 <= 0;
      end
    else
      begin
          if(count2 == 7'd100)
             count2 <= count2;
          else
             count2 <= count2 + 1'b1;
      end
end

always@(posedge clk or negedge rst)
begin
  if(rst)
     begin
        datab1 <= 9'd0;
        datab_valid1 <= 1'b0;
        datab2 <= 9'd0;
        datab_valid2 <= 1'b0;
        datab3 <= 9'd0;
        datab_valid3 <= 1'b0;
        datab4 <= 9'd0;
        datab_valid4 <= 1'b0;
     end
  else
     begin
        if(count2 >= 2 && count2 <= 10)
            begin
               datab1 <= datab[count2-1];
               datab_valid1 <= 1'b1;
               datab2 <= datab[count2+8];
               datab_valid2 <= 1'b1;
               datab3 <= datab[count2+17];
               datab_valid3 <= 1'b1;
               datab4 <= datab[count2+26];
               datab_valid4 <= 1'b1;
            end
        else 
            begin
              datab1 <= 9'd0;
              datab_valid1 <= 1'b0;
              datab2 <= 9'd0;
              datab_valid2 <= 1'b0;
              datab3 <= 9'd0;
              datab_valid3 <= 1'b0;
              datab4 <= 9'd0;
              datab_valid4 <= 1'b0;
            end
     end
end

二、把有符号数写入.TXT文件:

 

integer fid3,fid4,fid5,fid6;
initial
begin
   fid3 = $fopen("C:/Users/pooling1.txt","w");
   fid4 = $fopen("C:/Users/pooling2.txt","w");
   fid5 = $fopen("C:/Users/pooling3.txt","w");
   fid6 = $fopen("C:/Users/pooling4.txt","w"); 
   #20000
   $fclose(fid3) ;
   $fclose(fid4) ;
   $fclose(fid5) ;
   $fclose(fid6) ;
end

always@(posedge clk2)
begin
   if(result_pooling_valid1)
    begin
        // $fdisplay(fid3,"%d",result_pooling1);
        $fwrite(fid3,"%d\n",$signed(result_pooling1));
    end 
end

always@(posedge clk2)
begin
   if(result_pooling_valid2)
     begin
        // $fdisplay(fid4,"%d",result_pooling2);
        $fwrite(fid4,"%d\n",$signed(result_pooling2));
     end
end

always@(posedge clk2)
begin
   if(result_pooling_valid3)
     begin
         //$fdisplay(fid5,"%d",result_pooling3);   默认写入换行
         $fwrite(fid5,"%d\n",$signed(result_pooling3));
     end
end

always@(posedge clk)
begin
   if(result_pooling_valid4)
     begin
         //$fdisplay(fid6,"%d",result_pooling4);
         $fwrite(fid6,"%d\n",$signed(result_pooling4));
     end
end
  1.  $fdisplay(fid4,"%d",result_pooling2);                       这个语句写入时,会把结果变成无符号数;
  2.  $fdisplay(fid4,"%d",$signed(result_pooling2));     这样应该就可以按照有符号写入了,是否可以我还没尝试
  3.  $fwrite(fid4,"%d\n",$signed(result_pooling2));         这个语句写入时,会把结果按成有符号数写入文件
  4. fdispaly与fwriter的区别应该是fdisplay会在写入一个数据之后自动换行,但是fwriter不会

关于verilog中其他的读写文件方式,再以后的博客中继续更新;


  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Verilog ,你可以使用 `$readmemh` 或 `$readmemb` 系统任务来从 `.dat` 文件读取十进制或十六进制的值,并将其赋值给 `parameter` 参。这些系统任务可以读取文件的内容,并将其存储在一个内存。 首先,确保你的 `.dat` 文件包含了你想要读取十进制值,每个值占一行。 然后,在你的 Verilog 代码,你可以按照以下步骤进行操作: 1. 定义一个适当大小的内存组来存储从文件读取的值。例如,如果你的 `.dat` 文件有 8 个十进制值,你可以定义一个大小为 8 的内存组。 ```verilog reg [31:0] data_array [0:7]; // 定义一个大小为 8 的内存组来存储 32 位的十进制值 ``` 2. 使用 `$readmemh` 或 `$readmemb` 系统任务来读取 `.dat` 文件,并将其存储在内存。如果你的 `.dat` 文件包含十进制值,你应该使用 `$readmemh`。 ```verilog initial begin $readmemh("data_file.dat", data_array); // 从 .dat 文件读取十进制值并存储在 data_array end ``` 3. 现在,你可以使用 `parameter` 参来赋值从文件读取的值。例如,假设你想将第一个值赋给一个 `parameter` 参 `PARAM1`,你可以这样写: ```verilog parameter PARAM1 = data_array[0]; ``` 这样,`PARAM1` 将被赋值为从文件读取的第一个十进制值。 记得在你的代码包含 `data_file.dat` 文件,并确保路径正确。 希望这个解答能对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值