verilog讀入.txt的有符號十進制數,把有符號十進制數寫入到.txt文件中

在進行功能仿真時,經常需要使用外部的數據作爲輸入,而數據經常存放在.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中其他的讀寫文件方式,再以後的博客中繼續更新;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章