【Python】用Python将图片转换成Vivado Rom初始化coe文件

1. 介绍

使用XIlinx开发平台Vivado玩FPGA时,需要将一种图片转换成.coe文件用于初始化Rom IP。本文用Python编写一个脚本实现图片转换成Vivado Rom初始化coe文件。如下图分别生成RGB三个coe文件。
在这里插入图片描述

2. 程序介绍

2.1 读取图片并调整图片大小

有时图片大小不合适需要调整到指定像素比。通过设置set_size、img_w、img_h进行改变。

import numpy as np 
from PIL import Image 

# 图片文件路径
img_path = 'Dataset/Lena.png'

# 调整原图像大小可设置set_size=1,反之为=0
set_size = 0
img_w = 300 
img_h = 200 

# 读取图片并做大小调整
def gen_img(): 
    img = Image.open(img_path)  
    if set_size == 1: 
        img = img.resize((img_w, img_h), Image.ANTIALIAS)
        img.save('re_picture.jpg')
    img = np.array(img)

    return img

2.2 生成coe文件

# 分别生成R G B的coe文件
def gen_coe(img):
    img_R = []
    img_G = []
    img_B = []
    for i in range(img.shape[0]): 
        for j in range(img.shape[1]): 
            img_R.append(img[i][j][0])
            img_G.append(img[i][j][1])
            img_B.append(img[i][j][2])

    with open('Picture_R_Rom.coe', 'w') as f:
        f.writelines('memory_initialization_radix = 10;\nmemory_initialization_vector = ')
        for i in range(len(img_R)): 
            if i % img.shape[1] == 0: 
                f.write('\n')
            f.write(str(img_R[i]).rjust(4) + ',')
    f.close()

    with open('Picture_G_Rom.coe', 'w') as f:
        f.writelines('memory_initialization_radix = 10;\nmemory_initialization_vector = ')
        for i in range(len(img_G)): 
            if i % img.shape[1] == 0: 
                f.write('\n')
            f.write(str(img_G[i]).rjust(4) + ',')
    f.close()

    with open('Picture_B_Rom.coe', 'w') as f:
        f.writelines('memory_initialization_radix = 10;\nmemory_initialization_vector = ')
        for i in range(len(img_B)): 
            if i % img.shape[1] == 0: 
                f.write('\n')
            f.write(str(img_B[i]).rjust(4) + ',')
    f.close()

2.3 coe文件数据转换成图片

将coe文件反向转换成图片

# coe文件转换成图片
def coe2picture(): 
    infos_R = []
    with open('Picture_R_Rom.coe', 'r') as f:
        info = f.read().splitlines()
        for i in range(2, len(info)): 
            info1 = [int(a) for a in info[i].split(',')[:-1]]
            infos_R.append(info1)
    f.close()

    infos_G = []
    with open('Picture_G_Rom.coe', 'r') as f:
        info = f.read().splitlines()
        for i in range(2, len(info)): 
            info1 = [int(a) for a in info[i].split(',')[:-1]]
            infos_G.append(info1)
    f.close()

    infos_B = []
    with open('Picture_B_Rom.coe', 'r') as f:
        info = f.read().splitlines()
        for i in range(2, len(info)): 
            info1 = [int(a) for a in info[i].split(',')[:-1]]
            infos_B.append(info1)
    f.close()

    img_array = np.empty((np.array(infos_B).shape[0],np.array(infos_B).shape[1],3), dtype=int)
    if set_size == 1: 
        img_array = np.empty((img_h,img_w,3), dtype=int)

    for i in range(np.array(infos_B).shape[0]): 
        for j in range(np.array(infos_B).shape[1]):
            img_array[i][j][0] = infos_R[i][j]
            img_array[i][j][1] = infos_G[i][j]
            img_array[i][j][2] = infos_B[i][j]


    img_pil = Image.fromarray(np.uint8(img_array))
    img_pil.save('coe2picture.jpg')

3. 案例实践

完整程序:

import numpy as np 
from PIL import Image 

# 图片文件路径
img_path = 'Dataset/Lena.png'

# 调整原图像大小可设置set_size=1,反之为=0
set_size = 0
img_w = 300 
img_h = 200 

# 读取图片并做大小调整
def gen_img(): 
    img = Image.open(img_path)  
    if set_size == 1: 
        img = img.resize((img_w, img_h), Image.ANTIALIAS)
        img.save('re_picture.jpg')
    img = np.array(img)

    return img

# 分别生成R G B的coe文件
def gen_coe(img):
    img_R = []
    img_G = []
    img_B = []
    for i in range(img.shape[0]): 
        for j in range(img.shape[1]): 
            img_R.append(img[i][j][0])
            img_G.append(img[i][j][1])
            img_B.append(img[i][j][2])

    with open('Picture_R_Rom.coe', 'w') as f:
        f.writelines('memory_initialization_radix = 10;\nmemory_initialization_vector = ')
        for i in range(len(img_R)): 
            if i % img.shape[1] == 0: 
                f.write('\n')
            f.write(str(img_R[i]).rjust(4) + ',')
    f.close()

    with open('Picture_G_Rom.coe', 'w') as f:
        f.writelines('memory_initialization_radix = 10;\nmemory_initialization_vector = ')
        for i in range(len(img_G)): 
            if i % img.shape[1] == 0: 
                f.write('\n')
            f.write(str(img_G[i]).rjust(4) + ',')
    f.close()

    with open('Picture_B_Rom.coe', 'w') as f:
        f.writelines('memory_initialization_radix = 10;\nmemory_initialization_vector = ')
        for i in range(len(img_B)): 
            if i % img.shape[1] == 0: 
                f.write('\n')
            f.write(str(img_B[i]).rjust(4) + ',')
    f.close()

# coe文件转换成图片
def coe2picture(): 
    infos_R = []
    with open('Picture_R_Rom.coe', 'r') as f:
        info = f.read().splitlines()
        for i in range(2, len(info)): 
            info1 = [int(a) for a in info[i].split(',')[:-1]]
            infos_R.append(info1)
    f.close()

    infos_G = []
    with open('Picture_G_Rom.coe', 'r') as f:
        info = f.read().splitlines()
        for i in range(2, len(info)): 
            info1 = [int(a) for a in info[i].split(',')[:-1]]
            infos_G.append(info1)
    f.close()

    infos_B = []
    with open('Picture_B_Rom.coe', 'r') as f:
        info = f.read().splitlines()
        for i in range(2, len(info)): 
            info1 = [int(a) for a in info[i].split(',')[:-1]]
            infos_B.append(info1)
    f.close()

    img_array = np.empty((np.array(infos_B).shape[0],np.array(infos_B).shape[1],3), dtype=int)
    if set_size == 1: 
        img_array = np.empty((img_h,img_w,3), dtype=int)

    for i in range(np.array(infos_B).shape[0]): 
        for j in range(np.array(infos_B).shape[1]):
            img_array[i][j][0] = infos_R[i][j]
            img_array[i][j][1] = infos_G[i][j]
            img_array[i][j][2] = infos_B[i][j]


    img_pil = Image.fromarray(np.uint8(img_array))
    img_pil.save('coe2picture.jpg')

if __name__ == '__main__': 
    img = gen_img()
    gen_coe(img)
    coe2picture()

运行之后可分别得到RGB三个coe文件和一张coe转图片反向生成的新图片。如果设置了调整图片大小还会生成一个调整图片大小后的图片。
在这里插入图片描述

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Vivado ROM IP核是用于实现只读存储器(ROM)的IP核,其中包含了初始化存储器的COE文件COE文件是一种文本文件格式,用于描述初始化存储器中的数据。在使用Vivado ROM IP核时,可以将COE文件导入到IP核中,以初始化ROM中的数据。 ### 回答2: Vivado_ROM_IP核是专门用于FPGA和SoC设计的可编程只读存储器。它被设计用于存储跨多个设计的常量,例如字体、配置、驱动程序等。ROM IP核是Vivado的一部分,因此它易于集成和使用。 在使用Vivado_ROM_IP核之前,需要先准备coe格式的文件coe文件是一种通用的文件格式,用于存储数字逻辑电路的初始化数据。它可以用于初始化ROM、RAM、FIFO等网络。coe文件本质上是一个文本文件,其中包含数字逻辑电路的二进制信息。 首先,需要在Vivado中创建一个新的IP核项目。在创建项目时,需要选择“ROM”作为IP类型。然后,需要将coe文件添加到该项目中。在“Sources”选项卡中,点击“Add Sources”按钮,然后选择“Add or create simulation sources”。 接下来,需要选择“Create File”的选项。在弹出窗口中,选择“coe”作为文件类型,并为coe文件命名,并在文件编辑器中输入地址、数据等初始化信息。此时生成所需coe文件coe文件的内容需要与ROM IP核的输入类型相匹配。在IP核属性中选择配合coe文件的输入端口类型和参数。 最后,需要将ROM IP核添加到电路设计中,并将coe文件作为ROM IP核的初始化数据源。在生成位流时,Vivado会将coe文件的内容写入设计的ROM中。 在总体设计完成后,coe文件可以更新,以修改ROM初始化数据。更新coe文件后,只需要刷新ROM IP核,新的数据就可以更新到ROM中。 总之,Vivado_ROM_IP核和coe文件是数字逻辑电路设计中不可缺少的工具。它们提供了一种简便的方法来存储和管理数字逻辑电路的初始化数据。无论是初学者还是有经验的数字电路设计师都应该掌握和使用它们。 ### 回答3: Vivado ROM IP核是一个用于设计FPGA和SoC系统的IP核,可用于存储常量或启动代码。它允许设计人员将ROM数据配置到FPGA中,从而减少了外部芯片的数量并简化了系统设计。 COE文件是一种用于指定ROM IP核内容的文件格式。它使用ASCII文本格式,并具有一组指令来定义ROM中存储的数据。COE文件可以包含二进制、十六进制或十进制数据,并可用于存储任何常量数据,如图像数据、音频数据和程序。 在使用Vivado ROM IP核时,首先需要创建COE文件。可以使用任何文本编辑器创建COE文件,并确保它符合ROM IP要求。一旦COE文件创建完成,就可以将其导入Vivado中,然后添加ROM IP核并将文件链接到IP核。 在设计中,将ROM输出与其他模块相连接,就可以使用存储在ROM中的数据。在设计完成后,可以进行验证和仿真。如果发现需要更改数据,可以重新编辑COE文件并重新链接ROM IP核。 总之,使用Vivado ROM IP核和COE文件可以简化FPGA和SoC系统的设计,并减少外部芯片的数量。它可以存储任何常量数据,并且在设计完成后可以对其进行修改和验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值