视觉信息处理与FPGA实现第八次作业——verilog实现对比度调节

news2024/11/22 15:43:47

一、查看灰度图的数据格式

1.1 安装HxD

HxD下载链接:https://download.csdn.net/download/weixin_44357071/89045331

解压直接打开exe就能使用。

将需要查看二进制数据的图片拖到软件框里就能读取

1.2 找到bmp图像的图片点阵数据起始地址,原理和例子

从000Eh(h是16进制的意思)到0035是真的有40byte.横坐标是零到16,竖坐标是像十进制一样,把个位数空出来,然后是10,20,30.....

图中框框里是一个byte(字节),等于8个bit,A是4位bit的16进制表示,0也是。

如下图例子:

0000h到000Dh是位图文件头

000Eh到0035h是位图信息头,其中的001Ch是调色板颜色种类的位宽,这里是1,两种颜色,一种颜色需要4个字节,所以调色板需要2*4=8字节

所以0036h到003Dh是调色板所占的字节

003Eh及之后都是图片的点阵数据

1.3 生成200*200的灰度图

右键点击图片——属性,进入如图界面

修改尺寸为宽200,高200,即可将原来的800*800灰度图变为200*200.

1.4 选择图片的点阵数据

0000h到000Dh是位图文件头

000Eh到0035h是位图信息头,其中的001Ch是调色板颜色种类的位宽,这里是8,256种颜色,一种颜色需要4个字节,所以调色板需要256*4=1024字节

所以0036h到003Dh是调色板所占的字节

003Eh及之后都是图片的点阵数据

二、 代码和注释

需要注意$fopen等函数的使用,要打开的文件应该放在vivado的哪个目录下。链接:

verilog中的testbench语句——display,fopen,fread,fwrite——更新中-CSDN博客

2.1 设计代码

module contrast_adjust
(
    input                   clk,
    input                   rst_n,
    input                   image_process_start,
    input       [7:0]       point_data_in,
    input       [2:0]       mul_value, //range 0~7

    output  reg [7:0]       point_data_out
);
//----------------signal------------------
//线网型,用来传递值给下一个寄存器??
    wire        [10:0]      point_data_temp0;
    wire        [8:0]       point_data_temp1;
    wire        [7:0]       point_data_out_processed;

/*******************image point process**********************/
//-----------multiple------------
    //因为乘以的数是在 0到7,所以乘以 2的3次方,temp0就需要在8位的基础上拓展到10
    assign point_data_temp0 = point_data_in * mul_value;
    //divide 4,这个应该是通过直接取高8位的方法,实现右移两位,除以4
    //point_data_temp0[10:2] 是9位,然后通过第九位进行下一步的判断
    assign point_data_temp1 = point_data_temp0[10:2]; 

//----------overflow process-----
    //如果取高八位的数最高位依旧是1,即值大于等于100,那么直接给赋值到255,因为除以4了都还大于100
    //否则就截取的9位再取低8位,相当于再除以2,因为判断最高位是0了,所以这个右移是无损的
    assign point_data_out_processed = point_data_temp1[8]?8'b1111_1111: point_data_temp1[7:0];


always @ (posedge clk or negedge rst_n)
    if(!rst_n) 
        point_data_out <= 0;
    else if(image_process_start)
        point_data_out <= point_data_out_processed;
    else
        point_data_out <= point_data_in;






endmodule

2.2 tb代码

`timescale 1ns / 1ns

`define Clock 20
module constrast_adjust_tb();

/**************************port*************************/
reg                     clk;
reg                     rst_n;
reg     [7:0]           point_data_in;
reg     [2:0]           mul_value;
//reg     [7:0]           add_value;
reg                     image_process_start;
reg     [7:0]           bmp_data[0:50000];

wire    [7:0]           point_data_out;
wire    [7:0]           bmp_data_out;

/**************************clock and reset*************************/
//初始化时钟,设置时钟周期为20
initial begin
    clk= 1;
    forever 
        #(`Clock/2) clk = ~clk;
end

initial begin
    rst_n= 0;
    #(`Clock*20+ 1);
    rst_n =1;
end

/**************************读取位图数据*************************/
integer bmp_file_read;
integer file_read;
integer data_start_index;
integer bmp_size;


initial begin
    //返回值bmp_file_read像是一个fd,文件标识符,在verilog里边习惯叫做句柄
    //rb表示read only+ binary,只读+二进制模式
    bmp_file_read= $fopen("../pic/picture.bmp","rb");
    //这行代码的作用是从之前打开的名为 bmp_file_read 的文件中读取数据,
    //并将读取的数据存储到 bmp_data 变量中。
    file_read= $fread(bmp_data, bmp_file_read);
    //找到位图数据开始的索引
    data_start_index= { bmp_data[13], bmp_data[12],bmp_data[11],bmp_data[10]};
    //得到bmp图像的大小
    bmp_size= { bmp_data[5], bmp_data[4], bmp_data[3], bmp_data[2] };
end


/**************************输入 信号*************************/
initial begin
    mul_value= 3'd2;
end

integer index;
always @ (posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        index <= 0;
        image_process_start <= 0;
        point_data_in <= 0;
    end
    else if(index == data_start_index)begin
        image_process_start <= 1;
        index <= index + 1;
        point_data_in <= bmp_data[index];
    end
    else begin
        index <= index + 1;
        point_data_in <= bmp_data[index];
    end
end

assign bmp_data_out = point_data_out;

//--------------------图像写回文件------------------
integer bmp_file_write;
integer file_write;
initial begin
    //创建文件,然后得到句柄bmp_file_write
    bmp_file_write = $fopen("../pic/picture_contrast.bmp","wb");
end
//每一次时钟上升沿把数据写回
always @ (posedge clk or negedge rst_n)begin
    //好像意思是,不复位的情况下,传输正常进行,不知道对不对????????????????
    if(rst_n)begin
        if(index == 0 || index == 1)
            $display("start to write bmp file");
        //一直保持写数据,直到写到bmp文件大小+2,因为0和1不写数据
        else if(index < bmp_size + 2)
            //不理解这个为什么是%c,为什么不是%b呢???????????????????????????????????????????
            //将bmp_data_out的数据写到bmp_file_write这个fd中
            $fwrite(bmp_file_write,"%c",bmp_data_out);
        else begin
            $fclose(bmp_file_write);
            $fclose(bmp_file_read);
            $display("Write bmp file complete, close the file");
            $finish;
        end
    end
end

contrast_adjust u_contrast_adjust(
    .clk                 ( clk                 ),
    .rst_n               ( rst_n               ),
    .image_process_start ( image_process_start ),
    .point_data_in       ( point_data_in       ),
    .mul_value           ( mul_value           ),
    .point_data_out      ( point_data_out      )
);




endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1562346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】非线性结构---二叉树

1、树 1.1 树的相关概念 节点的度&#xff1a;一个节点含有的子树的个数称为该节点的度&#xff1b; 如上图&#xff1a;A的为6 叶节点或终端节点&#xff1a;度为0的节点称为叶节点&#xff1b; 如上图&#xff1a;B、C、H、I...等节点为叶节点 非终端节点或分支节点&#…

中断服务程序模板

通常定时器初始化过程如下: ①对 TMOD赋值,以确定TO和T1的工作方式。 ②计算初值,并将初值写入THO、TLO或TH1、TL1。 ③中断方式时&#xff0c;则对IE赋值&#xff0c;开放中断。 ④使TRO或TR1置位&#xff0c;启动定时器/计数器定时或计数。 代码 利用定时器0工作方式1&…

数据结构(六)——图的应用

6.4 图的应用 6.4.1 最小生成树 对于⼀个带权连通⽆向图G (V, E)&#xff0c;⽣成树不同&#xff0c;每棵树的权&#xff08;即树中所有边上的权值之和&#xff09;也可能不同。设R为G的所有⽣成树的集合&#xff0c;若T为R中边的权值之和最小的生成树&#xff0c;则T称为G的…

算法打卡day23

今日任务&#xff1a; 1&#xff09;39. 组合总和 2&#xff09;40.组合总和II 3&#xff09;131.分割回文串 39. 组合总和 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;…

人工智能之深度学习笔记——每天五分钟快速掌握深度学习理论

本专栏会对深度学习以及深度学习搭建技巧做一个详尽的介绍&#xff0c;相信大家阅读完本专栏之后&#xff0c;深度学习已经不是一个遥不可及的名词&#xff0c;我们会知道它究竟是什么&#xff0c;本专栏尽可能地简单详细地介绍每一个深度学习知识&#xff0c;帮助每天只用很少…

Day78:服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE漏洞

目录 前置知识 数据库应用-Redis-未授权访问&CVE漏洞 未授权访问&#xff1a;CNVD-2015-07557 未授权访问-CNVD-2019-21763 未授权访问-沙箱绕过RCE-CVE-2022-0543 数据库应用-Couchdb-未授权越权&CVE漏洞 Couchdb 垂直权限绕过&#xff08;CVE-2017-12635&…

数据结构-链表的基本操作

前言&#xff1a; 在dotcpp上碰到了一道题&#xff0c;链接放这了&#xff0c;这道题就是让你自己构建一遍链表的创建&#xff0c;插入节点&#xff0c;删除节点&#xff0c;获取节点&#xff0c;输出链表&#xff0c;题目给了几张代码图&#xff0c;不过不用管那些图&#xf…

k8s 经常操作指令

发现有个技巧&#xff1a;get、describe、edit ...操作指令后&#xff0c;都对应的相应的资源类型/资源 编辑deployment&#xff0c;查看其中部署的容器 kubectl edit deploy -n namespace pod名前缀&#xff08;不带hash&#xff09; 注&#xff1a; 带hash的具体pod&…

如何让光猫4个网口都有网络

一般情况光猫只有LAN1口有网络&#xff0c;LAN2、LAN3和LAN4口都是预留给电视用的&#xff0c;那么如何让这3个网口也有网络呢&#xff1f; 使用场景&#xff1a; 光猫在弱电箱内&#xff0c;弱电箱中有三根网线&#xff08;网线1、网线2和网线3&#xff09;分别接入到了三个房…

IP地址与子网掩码

1 IP地址 1.1 IPv4与IPv6 1.2 IPv4地址详解 IPv4地址分4段&#xff0c;每段8位&#xff0c;共32位二进制数组成。 1.2.1 地址分类 这32位又被分为网络号和主机号两部分&#xff0c;根据网络号占用位数的不同&#xff0c;又可分为以下几类&#xff1a; A类地址&#xff1a;…

蓝桥杯(更新中)

递归与递推 递归 1.指数型枚举 解析&#xff1a;从 1 ∼ n 这 n 个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。 思路&#xff1a;枚举每一位对应的数字选与不选&#xff0c;例如&#xff1a;第一位对应的数字为1&#xff0c;有一种方案是选1&#xff0c;另…

解决报错——使用sqlite的扩展Spatialite

正文 笔者想使用sqlite3的扩展Spatiate 代码如下。 import sqlite3 conn sqlite3.connect(database.db) conn.enable_load_extension(True) conn.load_extension("mod_spatialite") 结果如下。 找不到指定模块。 笔者在网上到处搜索&#xff0c;终于解决了。&a…

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(一)

目录 1 .导言 2.适用产品范围 3.标准目的 4.试验等级 4.1 空气放电的最高电压为何定在15kV 1 .导言 电磁兼容设计的知识储备之一便是EMC相关标准&#xff0c;标准中的测试系统标准更是基础中的基础&#xff0c;深度理解&#xff0c;对产品的EMC设计有很好的帮助。以下对最…

算法题->盛最多水的容器C语言和JAVA双指针解法

盛最多水的容器C语言和JAVA双指针解法 题目描述: 力扣链接:https://leetcode.cn/problems/container-with-most-water/description/ 题意: 根据数组中的值(高)和下标差值(宽),求能容纳最多的体积V. 例子: 输出49的求解过程,根据木桶效应,存储水的高度由短木板决定,故 V 短…

EfficientVMamba实战:使用EfficientVMamba实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装Vim环境环境安装过程安装库文件 计算mean和std生成数据集 摘要 论文&#xff1a;https://arxiv.org/pdf/2401.09417v1.pdf 作者研究了轻量级模型设计的新方法&#xff0c;通过引入视觉状态空间模型&…

Linux中JMeter的使用

Linux中JMeter的使用 Linux版本JMeter安装 # 1、下载、安装JMeter 如果有安装包直接上传即可 wget -c https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.4.1.tgz # 解压 tar -zxvf apache-jmeter-5.4.1.tgz -C /usr/local/sjdwz_test cd /usr/local/sjdwz_t…

书生·浦语大模型全链路开源体系-第2课

书生浦语大模型全链路开源体系-第2课 书生浦语大模型全链路开源体系-第2课相关资源实战部署InternLM2-Chat-1.8B模型准备环境下载模型运行案例 实战部署InternLM2-Chat-7B模型准备环境下载模型及案例代码运行cli案例代码运行web案例代码配置SSH公钥信息配置SHH隧道连接 熟悉 Hu…

前端之CSS——网页的皮肤!!

目录 一、CSS简单介绍 二、css内容 2.1 css的编写方式 2.2 css选择器 2.3 样式属性 2.4 css包围盒 2.5 css中的display 2.6 css中的定位 2.7 css中的浮动与清除 2.7 弹性容器 2.8 字体图标 2.9 …

R语言,数据类型转换

原文链接&#xff1a;R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天&#xff0c;再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢&#xff1f; 我们在使用R语言做数据分析时&#xff0c;会一直对数据进行不同类型的转换&#xff0c;有时候…

Linux安装nginx保姆级教程

文章目录 前言一、nginx安装&#xff08;保姆级教程&#xff09;1.安装nginx依赖2.安装wget3.创建nginx安装目录4.下载nginx5.查看下载好的nginx6.解压缩7.查看当前目录下的文件→进入nginx-1.8.0目录→查看当前目录下的文件8.安装nginx9.查看nginx安装目录并启动nginx10.网络请…