murcdix 发表于 2010-8-14 19:23:16

在 vhdl 或 Verilog 中如何读取 二进制的数据文

在 vhdl 或 Verilog 中如何读取 二进制的数据文件。 已经郁闷有一段时间了。

以下蓝色文字由站长:armok 于:2010-08-15,00:07:36 加入。你的原标题:“<font color=black>哪位资深高人知道?” 不合符规定。请更改成能说明帖子大意的标题
试想一下,如果本论坛的帖子标题清一色的‘帮助!’,‘ADC求救!’等笼统的标题,你在阅读的过程中会造成许多麻烦。
所以本论坛规定:一定要起一个能说明帖子大意的标题。不允许“关于 AVR 的 ADC 使用!”这种笼统标题。作为标题,必须说明清楚:
 ①你是在请教问题,还是在介绍有关的知识?
 ②ADC的问题有许多,你是想说那方面的内容?
注意以上两点,标题应该改成如:“请教:ADC 可以不使用中断吗?”。
起一个能说明帖子大意的标题,除了减轻我们的帖子分类整理工作,还方便其它人阅读,节省大家的时间。
注:使用合格的标题,对你来说只是举手之劳,但却会为我们的管理工作提供很大的便利。谢谢你的支持。
./bbs_upload/files_6/armok01122228.gif

NJ8888 发表于 2010-8-14 20:21:19

文件如果来源是想SD卡等标准介质中的文件系统管理的文件,你就惨了,FPGA做文件管理通常要个微处理器的软核,并且要有个兼容标准格式的文件系统。不然你从读物理扇区开始,工程非常大,一个人难

maqingbiao 发表于 2010-8-14 20:21:55

这是我做滤波器用的一个测试文件,里面包含文件的读写

`define auto_init
`timescale 1ns/1ns
`define INPUT_FILE "fir_in8.txt"
`define OUTPUT_FILE "fir_out31.txt"

module test_ser_fir ();

parameter   NOOFDATA = 40000;
parameter   FIR_TAP = 125;
parameter   FIR_TAPHALF = 63;
parameter   IDATA_WIDTH = 8;
//parameter   PDATA_WIDTH = 9;
parameter   COEFF_WIDTH = 24;
parameter   OUT_WIDTH = 31;

parameter   CLK_CYCLE = 20;
parameter   CLK_HCYCLE = 10;

reg   clk;
reg   rst_n;
reg    fir_in;
wire    fir_out;


reg    memb ;
reg    membyte ;

reg   write;
/*
integer   count_w;
integer   regcount;
integer   handle;
integer   k;
*/
integer   handle;
reg    count_w;
reg     regcount;
reg    k;
reg    k0;



ser_fir dut ( clk,rst_n,fir_in,fir_out );

`ifdef auto_init
   initial
      begin
         $readmemb(`INPUT_FILE,memb);
         regcount = 0;
         count_w = 0;
         handle = 0;
         clk = 1'b0;
         k =0 ;
         k0 = 0;
         
         rst_n = 1'b0;
         #(10*CLK_CYCLE + CLK_HCYCLE) rst_n = 1'b1;
      end
`endif

always #CLK_HCYCLE clk = ~clk;

always @ ( posedge clk or negedge rst_n )
begin
   if ( !rst_n )
      regcount <= 6'b0;
else
   if ( regcount == 6'd63 )
      regcount <= 6'b0;
    else
       regcount <= regcount + 1'b1;
end      

always @ ( posedge clk or negedge rst_n )
begin
   if ( !rst_n )
      begin
         fir_in <= 10'b0;
         k <= 19'd1;
      end
   else
   if ( regcount==6'd63 )
      begin
         k <= k + 1'b1;      
         fir_in <= memb;
      end

end

always @ ( posedge clk or negedge rst_n )
begin
if ( !rst_n )
   k0 <= 19'b0;
else
   if ( regcount==6'b0 )
   begin
      k0 <= k0 + 1'b1;
      membyte <= fir_out;
   end
end




always @ ( posedge clk or negedge rst_n )
begin
   if ( !rst_n )
      write <= 1'b0;
   else
      begin
         if ( k == NOOFDATA )
             write <= 1'b1;
      end
end


always @ ( posedge write )
begin
   handle = $fopen(`OUTPUT_FILE);
   $display("writing results to file...");
   for ( count_w=0;count_w<NOOFDATA;count_w=count_w+1 )
   begin
      $fdisplay(handle,"%d",membyte);
      $display("%d",membyte);
   end
   $fclose(handle);
end

endmodule

maqingbiao 发表于 2010-8-14 20:41:30

一楼说得好   我弄过一下读写FAT32格式的SD卡是用AVR来做的   感觉蛮复杂的    如果改写成FPGA就更   麻烦了,所以加个软核就比较好了

murcdix 发表于 2010-8-14 21:16:12

总算找到了

看来 Verilog和 VHDL 都能读 二进制文件。
用    File_Open(Status      => fStatus_v,
               F             => DataIn_f,   
               External_Name => "IntOut.txt",
               Open_Kind   => Read_Mode);    -- Or Write_Mode
就可以了。

操作二进制文件是如此简单。真是不用完全不知道。

bradley 发表于 2010-8-14 22:17:50

1楼有些危言耸听了,如果FPGA只是读SD卡等标准介质中的文件,用纯逻辑来实现并不是件难事,用一个臭长的状态机就可以搞定

myhonour 发表于 2010-8-15 12:18:49

mark
页: [1]
查看完整版本: 在 vhdl 或 Verilog 中如何读取 二进制的数据文