这位高手Piazzo的sina微博上用modelsim显示了“花好月圆,中秋快乐”一幅字,我很感兴趣,便也试了一下,但是写的很烂,没有怎么弄成,本来以为我对verilog已经很熟了,但现在才发现,不会的有这么多。我把问题贴出来,希望老师们能够帮我解答。
先贴Piazzo这位老师的图:
再说一下我的想法:
首先是提取字库,从这一点上我便想错了,我想从word里用超大号字抓图,经过图像处理提取字库,但这是比较复杂的。后来经张老师提醒,我才想起来,原来这东西,我以前玩过,见(原创)用友晶的VGA控制器TERASIC_Binary_VGA_Controller显示汉字和ASCII码字符
接下来用pli,把字库里的内容传递过verilog,这一步好做到。
在接下来,在verilog中,根据字库的内容显示波形,这也好说,只不过是有点的地方震荡几下,没点的地方把线拉直就行了。
但是遇到了很多问题没有解决或者不能令我满意:
1. Verilog里怎样把汉字传送给C语言进行处理?
2. 我本想用generate产生16根线的时序,如果这样的话,几十行的代码就可以搞定了,但发现generate不能这样用,例化一段描述时序代码时,每一次执行的时序都得叠加起来,而且里面的变量都弄混了。
最后我只能非常傻逼地用这种方法实现:
Perl语言生成重复代码
在verilog里重写16段这样的代码
效果图如下
Debussy
Modelsim
跟debussy中显示的位序不一样,不知道怎样调,谁能告诉我?
源码如下
Perl的代码
#!/usr/bin/perl
$len = 16; $wid = 32;
open $tmp, ">tmp.txt";
for( $i = 0 ; $i < $len ; $i = $i + 1){ printf $tmp " integer line_%d = 0; integer offset_%d = 0; initial begin ch_dis[%d] <= 1'b0; #10; for(offset_%d = 0; offset_%d < \`HZ_NUM ; offset_%d = offset_%d + 1)begin ch[%d] = \$hello_ma(offset_%d,(15-%d)); for( line_%d = 0 ; line_%d < 16 ; line_%d = line_%d+1)begin if(ch[%d][line_%d] != 0) repeat(10) #1 ch_dis[%d] <= ~ch_dis[%d]; else repeat(10) #1 ch_dis[%d] <= 1'b0; end end #10; end ", $i,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i; }
Verilog的代码
`timescale 1ns/1ps
`define HZ_NUM 9
module hello_ma(); reg [0:15] ch_dis; reg [0:15] ch [15:0];
integer k;
integer i, j;
initial begin ch[i] = 0; //for( i = 1 ; i < 16 ; i = i+1) //ch[15-i] = $hello_ma(0,i); end //genvar m; //generate for( m = 0 ; m < 16 ; m = m+1) fork integer line_0 = 0; integer offset_0 = 0; initial begin ch_dis[0] <= 1'b0; #10; for(offset_0 = 0; offset_0 < `HZ_NUM ; offset_0 = offset_0 + 1)begin ch[0] = $hello_ma(offset_0,(15-0)); for( line_0 = 0 ; line_0 < 16 ; line_0 = line_0+1)begin if(ch[0][line_0] != 0) repeat(10) #1 ch_dis[0] <= ~ch_dis[0]; else repeat(10) #1 ch_dis[0] <= 1'b0; end end #10; $finish; end integer line_1 = 0; integer offset_1 = 0; initial begin ch_dis[1] <= 1'b0; #10; for(offset_1 = 0
|
请发表评论