之前用Xilinx的板子做波形發生器,涉及到用.coe文件初始化BROM的內容。網上的波形生成軟件大都是生成.mif文件以供Quartus使用,因此自己用Python寫了一個腳本。
代碼如下:
from math import *
from matplotlib import pyplot as plt # 用於預覽生成的波形
# FILENAME = "512_square.coe" # 方波
# FILENAME = "512_sine.coe" # 正弦波
# FILENAME = "512_ramp.coe" # 鋸齒波
FILENAME = "512_triangle.coe" # 三角波
WIDTH = 8
DEPTH = 512
hex_table = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
points = []
out = []
file = open("E:/" + FILENAME, "w+")
file.write("memory_initialization_radix=16;\n") # 數據以16進制格式存儲
file.write("memory_initialization_vector=")
base = 2**(WIDTH - 1) - 1
for i in range(DEPTH):
# var = int(base + (-1 if i >= DEPTH // 2 else 1) * base) # 方波
# var = int(base + sin(i / DEPTH * 2 * pi) * base) # 正弦波
# var = int(i / DEPTH * (2 ** WIDTH - 1)) # 鋸齒波
var = int((1 - abs((i * 2 / (DEPTH - 1)) - 1)) * (2**WIDTH - 1)) # 三角波
if var >= 2**WIDTH: # 抹平超出范圍的數據
var = 2**WIDTH - 1
points.append(var)
var_hex = ""
while (var > 0):
var_hex += hex_table[var & 0xf] # 取低4位並轉換為16進制存入var_hex中
var >>= 4 # 右移去掉已處理的4位
var_hex += '0' * ((WIDTH - 1) // 4 - len(var_hex) + 1) # 根據WIDTH補零
out.append(var_hex[::-1]) # 將var_hex中的內容翻轉
for i in range(DEPTH): # 逆序存入文件
print(out[DEPTH - i - 1], end=" ")
file.write(out[DEPTH - i - 1] + " ")
file.close()
plt.plot(points) # 用於預覽生成的波形
plt.show() # 用於預覽生成的波形
當中的WIDTH對應DAC和ROM中單個數據點的位寬,DEPTH對應一個周期內數據點的個數
使用時只需按照自己的配置來修改WIDTH和DEPTH,然后在方波、正弦波、鋸齒波、三角波四種波形當中選擇一種取消注釋,並將剩下的三種波形注釋掉就好
如果不需要預覽波形生成結果可以把所有對應的行直接刪掉
最終生成結果如下: