verilog图像算法实现与仿真(流程和实现)

news2024/11/15 11:04:50

 【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        前面我们谈到了fpga,谈到了用python+cv2实现图像算法,直到现在才算是慢慢进入了正题。毕竟用verilog实现图像算法,才是我们真正想要做的事情。而对图像的加速和实时处理,也只有verilog+fpga才能帮助我们完成。

        目前网上能找到的verilog图像算法仿真的内容不多,要么就是需要安装matlab、modelsim这些商用软件,要么就是没有细节实现,不能完全复制作者的思路和操作过程。鉴于此,作者提出了全部利用开源软件来实现verilog图像算法仿真的思路。所以,直接利用开源软件iverilog+python+opencv来实现图像算法仿真,本文可能是目前全网唯一的一篇文章。希望这篇blog能给大家带来一些思索和帮助。

        要做好verilog图像算法的处理和仿真,一般需要四个步骤。第一步,把图像变成数据文件;第二步,编写verilog算法代码;第三步,编写testbench文件,利用刚才的图像数据文件,并且生成新的图像数据文件;第四步,利用最新的图像数据文件,保存为图片,查看效果。

1、图像反转

        为了说明如果采用这一流程是实现图像算法的仿真,我们不妨挑选一个简单的算法来做个演示。图像反转就是不错的一个例子。所谓图像反转,就是之前白色的地方变成黑的地方,黑的地方变成了白色的地方。大家如果对胶卷还有印象的话,胶卷本身就是图像反转一个很好的例子。因为在胶卷上面,人的面部是黑的,而头发却是白的。此外,这个流程如果需要写成算法的,也很简单,

def reverse_image(picture):
    for i in range(picture.shape[0]):
        for j in range(picture.shape[1]):
            picture[i,j] = 255 - picture[i,j]
    return picture

2、生成数据

        之前网上很多的资料生成数据都是用matlab来实现的。殊不知,其实用python来做这一件事情也很简单。本身cv2库用起来也方便,还没有版权的烦恼。

import cv2
import numpy as np

'''
main entry
'''

def main():
    picture = cv2.imread('./lena.bmp')
    print(picture.shape[0])
    print(picture.shape[1])
    print(picture.shape[2])
    
    color_img = np.copy(picture)
    picture = cv2.cvtColor(picture, cv2.COLOR_BGR2GRAY)
    
    f = open("data.txt", 'w')
    for i in range(picture.shape[0]):
        for j in range(picture.shape[1]):
            f.write(hex(picture[i,j]) + "\n")
    f.close()
 
    cv2.imshow('lena', picture)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

        这段python+cv2的代码不复杂。首先把图片读取到picture变量,接着用cvtColor实现灰化。下面的几行语句就是我们需要关心的了,那就是生成data.txt。注意,data.txt当中是每一个像素一行数据,格式是16进制。等到所有像素的数据都输出来之后,主要的功能也就讲完了。

3、编写verilog代码

        编写图像反转的verilog代码不复杂,主要就是对数据进行减操作就可以了,

module reverse_image(clk, rst, input_data, output_data);

input clk;
input rst;
input[7:0] input_data;
output[7:0] output_data;

wire clk;
wire rst;
wire[7:0] input_data;
wire[7:0] output_data;

assign output_data = 255 - input_data ;

endmodule

4、准备testbench文件

        testbench是verilog测试的重要环节。它的主要工作有这么几块,第一,将之前的data.txt文件插入到image中;第二,调用reverse_image这个模块;第三,生成新的文件,即new_data.txt,同时还需要保证在testbench结束之前,所有的像素点都处理完毕。

`timescale 1ns/1ps
module tb;
 
reg clock;
reg rst;
reg [7:0] image [(512*512-1):0];

reg[18:0] cnt;
integer file_id;
wire[7:0] input_data;
wire[7:0] output_data;
 
initial begin
 clock = 1'b0;
 forever #10 clock = ~clock;
end

initial begin
 cnt = 19'b0;
 $readmemh("./data.txt", image);
 file_id = $fopen("./new_data.txt", "w");
end
 
initial begin
 rst = 1'b1;
 #195 rst = 1'b0;
 #20000000 $stop;
 $fclose(file_id);
end

assign input_data = image[cnt[17:0]];

always @(posedge clock or posedge rst)
	if (rst) begin
		cnt <= 19'b0;
	end
	else if(cnt[18] == 1'b0)
	begin
		$fwrite(file_id, "0x%x\n", output_data);
		cnt <= cnt + 1'b1;
	end
		
initial
begin
    $dumpfile("hello.vcd");
    $dumpvars(0, tb);
end
 
reverse_image reverse_image0(
		.clk(clock),
		.rst(rst),
		.input_data(input_data),
		.output_data(output_data)
	);
 
endmodule
 

        代码中有几个内容需要注意下。比如读取图像数据的指令是readmemh,写入图像数据的指令是fwrite,为了确保数据处理完,等待2000万个clock之后,仿真才结束。

        因为没有使用modelsim,这部分可以使用开源软件iverilog+vvp代替,使用方法也非常简单,

C:\iverilog\bin\iverilog.exe -o tb *.v
C:\iverilog\bin\vvp -n tb -lxt2

        执行完这两步,如果没有什么问题的话,就可以看到new_data.txt,这为我们后续的进一步处理打下了基础。

5、恢复bmp文件

        前面我们获得了像素文件,下面就可以利用它转变为bmp文件,这一步也同样是使用python+cv2来实现的,

import cv2
import numpy as np

'''
main entry
'''

def main():
    picture = cv2.imread('./lena.bmp')
    picture = cv2.cvtColor(picture, cv2.COLOR_BGR2GRAY)
    for i in range(512):
        for j in range(512):
            picture[i,j] = 255
    
    f = open("./new_data.txt", 'r')
    for i in range(512*512):
        line = f.readline()
        picture[int(i/512), int(i%512)] = int(line, 16)
    f.close()
 
    cv2.imwrite('./new_lena.bmp', picture)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

         读取new_data.txt之后,经过python脚本转换,没有问题的话,就可以生成new_lena.bmp文件。打开后,可以检测一下效果,

         图片效果虽然有点吓人,但是至少说明我们的操作是成功,这个方法是可行的。

6、总结

        目前网上对verilog图像仿真讲的不多,细节部分就更少,希望今天讲的iverilog+python+opencv的方法能够为大家带来新的思考、新的启迪。如果能够切实将这个方法用到平时的开发中,那就最好不过了。

        

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

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

相关文章

HalfEdge半边数据结构详解

我们可以将离散表面表示为多边形网格。 多边形网格可以被认为是图&#xff08;具有顶点和顶点之间的边&#xff09;加上面列表&#xff0c;其中面是边的环。 推荐&#xff1a; 使用 NSDT场景设计器 快速搭建 3D场景。 下面&#xff0c;我们将网格指定为顶点列表和面列表&#…

【博学谷学习记录】大数据课程-学习第四周总结

分布式技术 为什么需要分布式 计算问题 无论是我们在学校刚开始学编程&#xff0c;还是在刚参加工作开始处理实际问题&#xff0c;写出来的程序都是很简单的。因为面对的问题很简单。以处理数据为例&#xff0c;可能只是把一个几十K的文件解析下&#xff0c;然后生成一个词频…

Python正则表达式所有函数详解

文章目录1 fullmatch2 match3 search4 findall5 finditer6 split7 sub8 compile本篇博客主要讲解正则表达式相关的函数&#xff0c;均不涉及复杂的正则表达式语法。如需了解正则表达式语法&#xff0c;请参考下面的文章&#xff1a;Python正则表达式语法详解1 fullmatch Pytho…

96. BERT预训练代码

利用实现的BERT模型和从WikiText-2数据集生成的预训练样本&#xff0c;我们将在本节中在WikiText-2数据集上对BERT进行预训练。 import torch from torch import nn from d2l import torch as d2l首先&#xff0c;我们加载WikiText-2数据集作为小批量的预训练样本&#xff0c;…

Logstash:如何使用 Logstash 解析并摄入 JSON 数据到 Elasticsearch

在我之前的文章 “Logstash&#xff1a;Data 转换&#xff0c;分析&#xff0c;提取&#xff0c;丰富及核心操作” 有涉及到这个话题。今天我想使用一个具体的例子来更深入地展示。 准备数据 我们先来把如下的数据拷贝下来&#xff0c;并保存到一个叫做 sample.json 的文件中。…

OS 学习笔记(5) 操作系统的体系结构

OS 学习笔记(5) 操作系统的体系结构 王道OS 1.4 操作系统的体系结构 文章目录OS 学习笔记(5) 操作系统的体系结构知识总览分层结构模块化操作系统的内核大内核 vs 微内核知识回顾与重要考点外核王道chap1 回顾英文表达、术语积累&#xff08;《操作系统概念》第九版、ostep 《O…

电子模块|心率血氧传感器模块MAX30102及其驱动代码

电子模块|心率血氧传感器模块MAX30102及其驱动代码实物照片模块简介工作原理原理图及引脚说明STM32软件驱动IIC通信代码数值转换代码main函数结果实物照片 模块简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。 它集成了一个红光LED和一个红外光LED、光电…

【经济学】MIT 微观经济学 Microeconomoics

MIT 微观经济学P1 Introduction and Supply & Demand约束优化和机会成本供给和需求P1 Introduction and Supply & Demand 约束优化和机会成本 微观经济学是研究如何个人和公司做决定在一个稀缺的世界。稀缺性是微观经济的驱动力。 微观经济学是一系列约束优化练习&a…

Hadoop安全之Kerberos

简介 安全无小事&#xff0c;我们常常要为了预防安全问题而付出大量的代价。虽然小区楼道里面的灭火器、消防栓常年没人用&#xff0c;但是我们还是要准备着。我们之所以愿意为了这些小概率事件而付出巨大的成本&#xff0c;是因为安全问题一旦发生&#xff0c;很多时候我们将…

自学数据分析——数据分析方法和模型

一、数据分析方法 数据分析的思维需要培养&#xff0c;先模仿别人&#xff0c;从模仿者到创造者。首先需要建立数据的敏感性&#xff0c;能快速了解数据在说什么&#xff0c;下面我们以抖音教育直播为例&#xff0c;首先来了解核心指标&#xff0c;以及各个指标所表示的含义。…

17.Stream流

目录 一.Stream流 1.1 什么是Stream流 1.2 Stream流思想 1.3 Stream流的三类方法 1.4 获取Stream流 1.4.1 集合获取Stream流的方式 1.4.2 数组获取Stream流的方式 1.5 中间方法 1.6 终结方法 1.7 收集Stream流 1.7.1 什么是收集Stream流 1.7.2 收集方法 一.Stream流…

Ant Design Vue 之a-tree-select

Ant Design Vue 是比较流行的vue框架之一&#xff0c;主要是展示a-tree-select 的简单用法&#xff0c;a-tree-select组件主要用于展示树结构的选择。 <template><a-spin :spinning"confirmLoading"><a-form :form"form"><a-form-ite…

CnOpenDataA股上市公司社会责任报告数据

一、数据简介 A股上市公司社会责任报告数据由和讯网自2013年开始独家策划的产品&#xff0c;也是国内首家上市公司社会责任专业测评产品。上市公司社会责任报告专业测评体系从股东责任、员工责任、供应商、客户和消费者权益责任、环境责任和社会责任五项考察&#xff0c;各项分…

Linux Workqueue

Linux Workqueue 1、前言 Workqueue 是内核里面很重要的一个机制&#xff0c;特别是内核驱动&#xff0c;一般的小型任务 (work) 都不会自己起一个线程来处理&#xff0c;而是扔到 Workqueue 中处理。Workqueue 的主要工作就是用进程上下文来处理内核中大量的小任务。 所以 …

基于php的旅游管理系统

摘要随着计算机技术&#xff0c;网络技术的迅猛发展&#xff0c;Internet 的不断普及&#xff0c;网络在各个领域里发挥了越来越重要的作用。特别是随着近年人民生活水平不断提高&#xff0c;在线旅游给人们的旅游业带来了更大的发展机遇。在经济快速发展的带动下&#xff0c;旅…

【Linux】tar命令打包 | 查看压缩文件 | 打包时忽略文件

tar命令打包 | 查看压缩文件 | 打包时忽略文件 等操作 1.起因 今天下午写阿狸bot的代码的时候&#xff0c;写错了aiofiles的保存操作 # 正确写法 async def write_file_aio(path:str, value):async with aiofiles.open(path, w, encodingutf-8) as f:await f.write(json.dump…

MyBatis持久层框架详细解读:核心配置文件

文章目录1. 前言2. 多环境配置3. 类型别名4. 对象工厂5. 总结1. 前言 前面我们在使用 MyBatis 开发时&#xff0c;编写核心配置文件替换 JDBC 中的连接信息&#xff0c;解决了 JDBC 硬编码的问题。其实&#xff0c;MyBatis 核心配置文件中还可以配置很多的内容。 MyBatis 的配…

mongodb分片

分片是MongoDB的扩展方式,通过分片能够增加更多的机器来用对不断增加的负载和数据,还不影响应用.1.分片简介分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机器上,不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载.使用几乎…

屏幕录制下载推荐(可以无水印录制视频)

您有没有遇到过这种情况&#xff0c;在使用录屏工具录制电脑屏幕时&#xff0c;录制出来的视频是带有明显水印的。那有没有可以无水印录制的屏幕录制推荐呢&#xff1f;当然有。最近小编发现了一款可以无水印&#xff08;自定义图文水印&#xff09;录制的视频&#xff0c;快来…

Pycharm误触ignore的解决方法--有图

步骤1&#xff1a;进入pycharm编辑器之后&#xff0c;找到菜单栏中的file选项&#xff0c;点击之后会有一个下拉列表&#xff0c;直接选择settings&#xff0c;进入到设置的窗口。步骤2&#xff1a;在设置界面的左侧&#xff0c;找到Inspections选项&#xff0c;点击之后&#…