仿真实例2——BMP图片文件读写

欲观原文,请君移步微信

BMP文件结构

BMP文件格式,又称为Bitmap(位图)它是一种图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此我们经常使用它来保存RAW数据。BMP文件总体上由4部分组成,分别是位图文件头、位图信息头、调色板和图像数据,如下图所示
在这里插入图片描述
BMP文件格式

名称描述
位图文件头(bitmap-file header)包含BMP图像文件的类型、显示内容等信息
位图信息头(bitmap-information header)包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息
彩色表/调色板(color table)这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板
位图数据(bitmap-data)这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值

读写BMP文件

下面先给出一个图片,鼠标右键查看图片的属性,看到图片分辨率为334x254,位深度为24bit
在这里插入图片描述
接下来进行文件的读写操作。

`timescale 1ns / 1ps
module bmp_file();

    integer fileID      ;//读BMP图片文件的指针
    integer cc          ;
    integer out_image   ;//写BMP图片文件的指针
    integer out_file    ;
    integer i           ;//计数器
    integer j           ;

    reg [7:0]   rd_bmp_data [0:2100000]    ;//读图片数据
    reg [7:0]   wr_bmp_data [0:2100000]    ;//写图片数据
    reg         clk                     ;
    reg [7:0]   rd_data                 ;//用于波形显示
    reg [7:0]   wr_data                 ;//用于波形显示

    integer R_bmp_width   ;//读出图片的宽度
    integer R_bmp_hight   ;//读出图片的高度
    integer R_data_start_index   ;//读出图片的宽度
    integer R_bmp_size   ;/读出BMP文件的大小

    reg rd_en;
    reg wr_en;
    reg rst ;

    parameter   CLK_PERIOD      =5                                                      ;
    parameter   W_BMP_WIDTH     =32'h014e                                               ;
    // parameter   W_BMP_WIDTH     =32'd1920                                               ;
    parameter   W_BMP_HIGHT     =32'h00fe                                               ;
    // parameter   W_BMP_HIGHT     =32'd1080                                               ;
    parameter   PIXEL_BITS      =16'h0018                                               ;   //24bits
    parameter   PIXEL_BYTES     =PIXEL_BITS/8                                           ;   //3bytes
    parameter   IMAGE_SIZE      =((((W_BMP_WIDTH*PIXEL_BYTES)>>2)+1)<<2)*W_BMP_HIGHT    ;
    parameter   BMP_FILE_HEAD   = 32'd54                                                ; 
    parameter   BM_WINDOWS      = 16'h4d42                                              ;
    parameter   FILE_SIZE       =IMAGE_SIZE+BMP_FILE_HEAD                               ;

    initial begin
        clk =1'b0;
        #(CLK_PERIOD/2);
        forever
            #(CLK_PERIOD/2) clk = ~clk;
    end

    initial begin
        rst =   1'b1;
        #2000
        rst=1'b0;
    end

    initial begin
    //BMP文件地址,选择自己所需要的文件地址
    fileID                  =   $fopen("F:\\file\\simulation_platform\\ImageSencorPipeline\\picture\\whiteandblack1.bmp","rb");
    out_image               =   $fopen("F:\\file\\simulation_platform\\ImageSencorPipeline\\picture\\output_file.bmp","wb");
    out_file                =   $fopen("F:\\file\\simulation_platform\\ImageSencorPipeline\\picture\\output_file.txt","w+");
    cc                      =   $fread(rd_bmp_data,fileID);
    R_bmp_width             =   {rd_bmp_data[21],rd_bmp_data[20],rd_bmp_data[19],rd_bmp_data[18]};
    R_bmp_hight             =   {rd_bmp_data[25],rd_bmp_data[24],rd_bmp_data[23],rd_bmp_data[22]};
    R_data_start_index      =   {rd_bmp_data[13],rd_bmp_data[12],rd_bmp_data[11],rd_bmp_data[10]};
    R_bmp_size              =   {rd_bmp_data[5],rd_bmp_data[4],rd_bmp_data[3],rd_bmp_data[2]};


    wait(rst==1'b0);
    for(i=R_data_start_index;i<R_bmp_size;i=i+1)
    begin
        @(posedge clk)
        rd_en   =   1'b1;
        wr_data =   rd_bmp_data[i];
    end
    @(posedge clk)
    rd_en = 1'b0;

    //BM
    wr_bmp_data[0 ]  =   BM_WINDOWS[0+:8]   ;
    wr_bmp_data[1 ]  =   BM_WINDOWS[8+:8]   ;
    //bmp file size
    wr_bmp_data[2 ]  =   FILE_SIZE[0 +:8]   ;
    wr_bmp_data[3 ]  =   FILE_SIZE[8 +:8]   ;
    wr_bmp_data[4 ]  =   FILE_SIZE[16+:8]   ;
    wr_bmp_data[5 ]  =   FILE_SIZE[24+:8]   ;
    //reserved
    wr_bmp_data[6 ]  =   8'h00   ;
    wr_bmp_data[7 ]  =   8'h00   ;
    wr_bmp_data[8 ]  =   8'h00   ;
    wr_bmp_data[9 ]  =   8'h00   ;

    //offset
    wr_bmp_data[10]  =   BMP_FILE_HEAD[0 +:8]   ;    
    wr_bmp_data[11]  =   BMP_FILE_HEAD[8 +:8]   ;
    wr_bmp_data[12]  =   BMP_FILE_HEAD[16+:8]   ;
    wr_bmp_data[13]  =   BMP_FILE_HEAD[24+:8]   ;

    //bmp information struct
    wr_bmp_data[14]  =   8'h28   ;
    wr_bmp_data[15]  =   8'h00   ;

    wr_bmp_data[16]  =   8'h00   ;
    wr_bmp_data[17]  =   8'h00   ;

    //write bmp width
    wr_bmp_data[18]  =   W_BMP_WIDTH[0+:8]   ;
    wr_bmp_data[19]  =   W_BMP_WIDTH[8+:8]   ;
    wr_bmp_data[20]  =   W_BMP_WIDTH[16+:8]   ;
    wr_bmp_data[21]  =   W_BMP_WIDTH[24+:8]   ;
    //write bmp hight
    wr_bmp_data[22]  =   W_BMP_HIGHT[0+:8]    ;
    wr_bmp_data[23]  =   W_BMP_HIGHT[8+:8]    ;
    wr_bmp_data[24]  =   W_BMP_HIGHT[16+:8]   ;
    wr_bmp_data[25]  =   W_BMP_HIGHT[24+:8]   ;

    //bit planes
    wr_bmp_data[26]  =   8'h01   ;
    wr_bmp_data[27]  =   8'h00   ;

    //one pixel use bits
    wr_bmp_data[28]  =   PIXEL_BITS[0+:8]   ;
    wr_bmp_data[29]  =   PIXEL_BITS[8+:8]   ;

    //compress
    wr_bmp_data[30]  =   8'h00   ;
    wr_bmp_data[31]  =   8'h00   ;
    wr_bmp_data[32]  =   8'h00   ;
    wr_bmp_data[33]  =   8'h00   ;

    //bmp image size
    wr_bmp_data[34]  =   IMAGE_SIZE[0 +:8]   ;
    wr_bmp_data[35]  =   IMAGE_SIZE[8 +:8]   ;
    wr_bmp_data[36]  =   IMAGE_SIZE[16+:8]   ;
    wr_bmp_data[37]  =   IMAGE_SIZE[24+:8]   ;

    wr_bmp_data[38]  =   8'hC4   ;    
    wr_bmp_data[39]  =   8'h0e   ;
    wr_bmp_data[40]  =   8'h00   ;
    wr_bmp_data[41]  =   8'h00   ;

    wr_bmp_data[42]  =   8'hC4   ;
    wr_bmp_data[43]  =   8'h0e   ;
    wr_bmp_data[44]  =   8'h00   ;
    wr_bmp_data[45]  =   8'h00   ;
    //use color board
    wr_bmp_data[46]  =   8'h00   ;
    wr_bmp_data[47]  =   8'h00   ;
    //important color 
    wr_bmp_data[48]  =   8'h00   ;
    wr_bmp_data[49]  =   8'h00   ;
    wr_bmp_data[50]  =   8'h00   ;
    wr_bmp_data[51]  =   8'h00   ;
    wr_bmp_data[52]  =   8'h00   ;
    wr_bmp_data[53]  =   8'h00   ;

    j=0;
    for(i=0;i<FILE_SIZE;i=i+1)
    begin
        if(j%(W_BMP_WIDTH*3)==0)begin //RGB888=24bit
        j=0;
        end


        rd_data[7:0]=wr_bmp_data[i];
        wr_en=1;

        if(i>=54)   begin
        rd_data[7:0]=j/3;
        j=j+1;

        rd_data[7:0]=8'hff-rd_bmp_data[i];
        end     


        @(posedge clk)
        // write image file
        $fwrite(out_image,"%c",rd_data[7:0]);

        //write data txt file
        $fwrite(out_file,"%d ",wr_bmp_data[i]);
        if(j%(W_BMP_WIDTH*3)==0)begin
        $fwrite(out_file,"\n");end            
    end

    wr_en=0;
    $fclose(fileID);
    $fclose(out_image);
    $fclose(out_file);

    end
endmodule   

现在已经完成BMP文件的读写操作,并且对图片进行了像素取反rd_data[7:0]=8’hff-rd_bmp_data[i];

图像结果

处理后的图片结果存放output_file.bmp,显示如下图
在这里插入图片描述
处理前和处理后结果对比
在这里插入图片描述
读写BMP文件显示波形如下图
在这里插入图片描述

获取工程

小编已经将读写BMP文件的工程放在了网盘上,话不多说来干货,下面给出链接。

工程链接
百度网盘链接:https://pan.baidu.com/s/1uzDckGoEUk7NGwWm7jhXLw提取码:zpiq

在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ADS2008(Advanced Design System)是一款由美国Keysight Technologies公司开发的专业电路设计与仿真软件。它广泛应用于各种射频电路设计、调试和优化的工程项目。 在射频电路设计方面,ADS2008提供了丰富的功能模块和工具,使工程师能够进行各种射频系统、射频天线和射频前后端电路的设计和仿真。 工程文件是ADS2008中的一种项目文件,用于保存射频电路设计的各种相关数据和设置。它可以包括电路原理图、元器件的参数和模型、仿真设置、仿真结果等信息。通过保存为工程文件,工程师可以方便地保存、共享和管理电路设计的各个阶段。 对于射频电路设计的仿真实例,ADS2008提供了强大的仿真工具和优化算法。工程师可以根据设计需求选择不同的仿真模块,如线性分析、非线性分析、频谱分析、时间域分析等。通过仿真实例,工程师可以验证和调试电路设计的性能,优化参数,从而得到理想的电路性能。 除了仿真实例,ADS2008还提供了丰富的本地和在线文档、视频教程和技术资料,帮助工程师更深入、更高效地掌握射频电路设计和仿真技术。 总的来说,ADS2008射频电路设计与仿真软件及其工程文件在射频电路的设计、调试和优化中具有重要作用。它提供了强大的工具和功能,帮助工程师实现电路设计的目标,节省开发时间和成本。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值