• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

(原创)关于用modelsim显示字符的几个问题(Verilog)(perl)(pli)(generate) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

这位高手Piazzosina微博上用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

该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
安装perl-DBD-mysql发布时间:2022-07-22
下一篇:
perl的pack与unpack的使用发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap