大家好,我是数字小熊饼干。前些天我看到了某一清华土木博士用混凝土戒指求婚成功,虽然网上有一些非议,但是我作为一个纯正的工科男还是为这位土木博士的创意点了一个大大的赞,毕竟用自己学到的知识来向自己的女朋友表达爱意,实在是一项充满心意和创意的告白方式~
既然土木行业可以用混凝土打造求婚戒指,那么我们ic行业打工人能用什么向自己的对象表达爱意呢,我们的脑子里第一时间可能会想到:当然是做块芯片啦~不过这个方案的可行性可能不太高,毕竟流片的费用是很贵的,而且万一流片失败…
在这里,我向各位介绍一个方法,那就是使用我们的波形仿真软件,向你的那个它展示你对ta的感情~具体如何做,就让我们按照下面一步一步来实现吧!
一、python脚本
首先,我们要做的是将我们想表达的文字转化为由一个一个像素点组成的点阵字,所谓的点阵字是把每一个字符都分成NxN个像素点,然后用每个点的虚实来表示字符的轮廓。点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示。我们可以使用python的PIL库实现从输入字符到输出点阵图的转换,具体如下面的代码所示:
import PIL
import PIL.Image
import PIL.ImageDraw
import PIL.ImageFont
import numpy as np
def generate_bitmap(char, length, width):
font=PIL.ImageFont.truetype("C:/Windows/Fonts/msyhl.ttc", 20) #加载字体
image = PIL.Image.new("L",(length,width),255) #创建灰度图像
draw=PIL.ImageDraw.Draw(image)
draw.text((0,0),char, font=font) #绘制字符
bitmap_temp=np.array(image) #将图片转换为数组
bitmap_temp=np.transpose(bitmap_temp) #为了后续读取激励,先转置图片
bitmap=[]
file=open("bitmap.txt","w+")
for i in range (0,length): #归一化到0或1
for j in range (0,width):
if(bitmap_temp[i,j]>240):
bitmap.append(0)
else:
bitmap.append(1)
bitmap.append("\n")
for wr in bitmap:
file.write(str(wr)) #保存文件
file.close()
print(bitmap)
image.show()
if __name__ == '__main__':
bitmap_length=350 #图像长度
bitmap_width=30 #图像高度
char = input('请输入需要点阵的汉字:') #输入字符
generate_bitmap(char,bitmap_length,bitmap_width)
```
上面的代码重要的步骤都有备注,我再简单总结一下主要的流程:
1. 配置好我们输出灰度图的参数,图片的长度和宽度,以及字体和字号,这里的字号我是直接使用Windows自带的微软雅黑,各位读者也可以通过更改代码第7行中的xx.ttc,替换成自己喜欢的字体;
2. 输入文字,并将文字转化为对应的灰度图;
3. 将灰度图转置,我们可以将图片一列像素看作一个多bit的信号,那么图片的每行就可以当做是信号随时间增长而产生的变化,因此需要将灰度图转置,以此得到波形仿真时使用的激励;
4. 像素归一化,我们只需要每个像素点是0或1即可。
在执行了以上的程序后,我们会得到这样的输出结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0e0693ebb662464a917ed88b19913ca1.png#pic_center)
观察右侧小图,可见我们已经得到了需要的激励~
# 二、仿真文件
我们每拍输出一个仿真数据即可得到波形,具体代码如下:
```python
module test_tb();
`ifdef FSDB
initial begin
$fsdbDumpfile("test_tb.fsdb");
$fsdbDumpvars;
$fsdbDumpMDA();
end
`endif
reg clk;
reg [29:0] dout;
bit [29:0] stimus [0:349];
bit [9:0] cnt;
initial begin
clk <= 0;
forever begin
#1
clk = ~clk;
end
end
task bitmap(); begin
cnt = 0;
dout = 0;
repeat(50) @(posedge clk);
while (cnt<350) begin
dout = stimus[cnt] & 30'bx; //输出波形
@(posedge clk);
cnt=cnt+1;
end
end
endtask
initial begin
$readmemb("bitmap.txt", stimus); //读取激励
bitmap();
$finish;
end
endmodule
上述代码的主要步骤就是读出激励,然后每拍输出激励,输出的信号dout之所以“线与”了x态,是因为在verdi中的x态看起来的效果类似于一个像素点高亮时的样子,所以当激励为1时,显示为x态,最终输出的波形效果比较好,最终输出的波形图如下所示:
因为原本的x态信号是大红色,显示效果不太好,所以这里我还给信号换了个粉红色~
三、总结
这篇文章的内容就是以上这些了,最后祝各位读者端午节快乐!
如果你喜欢这篇文章的话,请关注我的公众号-熊熊的ic车间,里面还有ic设计和ic验证的学习资料和书籍等着你呢~欢迎您的关注!