设为首页 收藏本站
查看: 1482|回复: 0

[经验分享] (原创)关于用modelsim显示字符的几个问题(Verilog)(perl)(pli)(generate)

[复制链接]

尚未签到

发表于 2015-12-25 14:46:21 | 显示全部楼层 |阅读模式
这位高手Piazzo的sina微博上用modelsim显示了“花好月圆,中秋快乐”一幅字,我很感兴趣,便也试了一下,但是写的很烂,没有怎么弄成,本来以为我对verilog已经很熟了,但现在才发现,不会的有这么多。我把问题贴出来,希望老师们能够帮我解答。
先贴Piazzo这位老师的图:
DSC0000.jpg

再说一下我的想法:
首先是提取字库,从这一点上我便想错了,我想从word里用超大号字抓图,经过图像处理提取字库,但这是比较复杂的。后来经张老师提醒,我才想起来,原来这东西,我以前玩过,见(原创)用友晶的VGA控制器TERASIC_Binary_VGA_Controller显示汉字和ASCII码字符
接下来用pli,把字库里的内容传递过verilog,这一步好做到。
在接下来,在verilog中,根据字库的内容显示波形,这也好说,只不过是有点的地方震荡几下,没点的地方把线拉直就行了。
但是遇到了很多问题没有解决或者不能令我满意:
1.       Verilog里怎样把汉字传送给C语言进行处理?
2.       我本想用generate产生16根线的时序,如果这样的话,几十行的代码就可以搞定了,但发现generate不能这样用,例化一段描述时序代码时,每一次执行的时序都得叠加起来,而且里面的变量都弄混了。

最后我只能非常傻逼地用这种方法实现:
Perl语言生成重复代码
在verilog里重写16段这样的代码
效果图如下
Debussy


DSC0001.png


Modelsim



DSC0002.png


跟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; offset_1 < `HZ_NUM ; offset_1 = offset_1 + 1)begin
        ch[1] = $hello_ma(offset_1,(15-1));
        for( line_1 = 0 ; line_1 < 16 ; line_1 = line_1+1)begin
          if(ch[1][line_1] != 0)
            repeat(10) #1 ch_dis[1] <= ~ch_dis[1];
          else
            repeat(10) #1 ch_dis[1] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_2 = 0;
  integer offset_2 = 0;
  initial begin
    ch_dis[2] <= 1'b0;
    #10;
      for(offset_2 = 0; offset_2 < `HZ_NUM ; offset_2 = offset_2 + 1)begin
        ch[2] = $hello_ma(offset_2,(15-2));
        for( line_2 = 0 ; line_2 < 16 ; line_2 = line_2+1)begin
          if(ch[2][line_2] != 0)
            repeat(10) #1 ch_dis[2] <= ~ch_dis[2];
          else
            repeat(10) #1 ch_dis[2] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_3 = 0;
  integer offset_3 = 0;
  initial begin
    ch_dis[3] <= 1'b0;
    #10;
      for(offset_3 = 0; offset_3 < `HZ_NUM ; offset_3 = offset_3 + 1)begin
        ch[3] = $hello_ma(offset_3,(15-3));
        for( line_3 = 0 ; line_3 < 16 ; line_3 = line_3+1)begin
          if(ch[3][line_3] != 0)
            repeat(10) #1 ch_dis[3] <= ~ch_dis[3];
          else
            repeat(10) #1 ch_dis[3] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_4 = 0;
  integer offset_4 = 0;
  initial begin
    ch_dis[4] <= 1'b0;
    #10;
      for(offset_4 = 0; offset_4 < `HZ_NUM ; offset_4 = offset_4 + 1)begin
        ch[4] = $hello_ma(offset_4,(15-4));
        for( line_4 = 0 ; line_4 < 16 ; line_4 = line_4+1)begin
          if(ch[4][line_4] != 0)
            repeat(10) #1 ch_dis[4] <= ~ch_dis[4];
          else
            repeat(10) #1 ch_dis[4] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_5 = 0;
  integer offset_5 = 0;
  initial begin
    ch_dis[5] <= 1'b0;
    #10;
      for(offset_5 = 0; offset_5 < `HZ_NUM ; offset_5 = offset_5 + 1)begin
        ch[5] = $hello_ma(offset_5,(15-5));
        for( line_5 = 0 ; line_5 < 16 ; line_5 = line_5+1)begin
          if(ch[5][line_5] != 0)
            repeat(10) #1 ch_dis[5] <= ~ch_dis[5];
          else
            repeat(10) #1 ch_dis[5] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_6 = 0;
  integer offset_6 = 0;
  initial begin
    ch_dis[6] <= 1'b0;
    #10;
      for(offset_6 = 0; offset_6 < `HZ_NUM ; offset_6 = offset_6 + 1)begin
        ch[6] = $hello_ma(offset_6,(15-6));
        for( line_6 = 0 ; line_6 < 16 ; line_6 = line_6+1)begin
          if(ch[6][line_6] != 0)
            repeat(10) #1 ch_dis[6] <= ~ch_dis[6];
          else
            repeat(10) #1 ch_dis[6] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_7 = 0;
  integer offset_7 = 0;
  initial begin
    ch_dis[7] <= 1'b0;
    #10;
      for(offset_7 = 0; offset_7 < `HZ_NUM ; offset_7 = offset_7 + 1)begin
        ch[7] = $hello_ma(offset_7,(15-7));
        for( line_7 = 0 ; line_7 < 16 ; line_7 = line_7+1)begin
          if(ch[7][line_7] != 0)
            repeat(10) #1 ch_dis[7] <= ~ch_dis[7];
          else
            repeat(10) #1 ch_dis[7] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_8 = 0;
  integer offset_8 = 0;
  initial begin
    ch_dis[8] <= 1'b0;
    #10;
      for(offset_8 = 0; offset_8 < `HZ_NUM ; offset_8 = offset_8 + 1)begin
        ch[8] = $hello_ma(offset_8,(15-8));
        for( line_8 = 0 ; line_8 < 16 ; line_8 = line_8+1)begin
          if(ch[8][line_8] != 0)
            repeat(10) #1 ch_dis[8] <= ~ch_dis[8];
          else
            repeat(10) #1 ch_dis[8] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_9 = 0;
  integer offset_9 = 0;
  initial begin
    ch_dis[9] <= 1'b0;
    #10;
      for(offset_9 = 0; offset_9 < `HZ_NUM ; offset_9 = offset_9 + 1)begin
        ch[9] = $hello_ma(offset_9,(15-9));
        for( line_9 = 0 ; line_9 < 16 ; line_9 = line_9+1)begin
          if(ch[9][line_9] != 0)
            repeat(10) #1 ch_dis[9] <= ~ch_dis[9];
          else
            repeat(10) #1 ch_dis[9] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_10 = 0;
  integer offset_10 = 0;
  initial begin
    ch_dis[10] <= 1'b0;
    #10;
      for(offset_10 = 0; offset_10 < `HZ_NUM ; offset_10 = offset_10 + 1)begin
        ch[10] = $hello_ma(offset_10,(15-10));
        for( line_10 = 0 ; line_10 < 16 ; line_10 = line_10+1)begin
          if(ch[10][line_10] != 0)
            repeat(10) #1 ch_dis[10] <= ~ch_dis[10];
          else
            repeat(10) #1 ch_dis[10] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_11 = 0;
  integer offset_11 = 0;
  initial begin
    ch_dis[11] <= 1'b0;
    #10;
      for(offset_11 = 0; offset_11 < `HZ_NUM ; offset_11 = offset_11 + 1)begin
        ch[11] = $hello_ma(offset_11,(15-11));
        for( line_11 = 0 ; line_11 < 16 ; line_11 = line_11+1)begin
          if(ch[11][line_11] != 0)
            repeat(10) #1 ch_dis[11] <= ~ch_dis[11];
          else
            repeat(10) #1 ch_dis[11] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_12 = 0;
  integer offset_12 = 0;
  initial begin
    ch_dis[12] <= 1'b0;
    #10;
      for(offset_12 = 0; offset_12 < `HZ_NUM ; offset_12 = offset_12 + 1)begin
        ch[12] = $hello_ma(offset_12,(15-12));
        for( line_12 = 0 ; line_12 < 16 ; line_12 = line_12+1)begin
          if(ch[12][line_12] != 0)
            repeat(10) #1 ch_dis[12] <= ~ch_dis[12];
          else
            repeat(10) #1 ch_dis[12] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_13 = 0;
  integer offset_13 = 0;
  initial begin
    ch_dis[13] <= 1'b0;
    #10;
      for(offset_13 = 0; offset_13 < `HZ_NUM ; offset_13 = offset_13 + 1)begin
        ch[13] = $hello_ma(offset_13,(15-13));
        for( line_13 = 0 ; line_13 < 16 ; line_13 = line_13+1)begin
          if(ch[13][line_13] != 0)
            repeat(10) #1 ch_dis[13] <= ~ch_dis[13];
          else
            repeat(10) #1 ch_dis[13] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_14 = 0;
  integer offset_14 = 0;
  initial begin
    ch_dis[14] <= 1'b0;
    #10;
      for(offset_14 = 0; offset_14 < `HZ_NUM ; offset_14 = offset_14 + 1)begin
        ch[14] = $hello_ma(offset_14,(15-14));
        for( line_14 = 0 ; line_14 < 16 ; line_14 = line_14+1)begin
          if(ch[14][line_14] != 0)
            repeat(10) #1 ch_dis[14] <= ~ch_dis[14];
          else
            repeat(10) #1 ch_dis[14] <= 1'b0;
        end
      end
    #10;
  end
  
  integer line_15 = 0;
  integer offset_15 = 0;
  initial begin
    ch_dis[15] <= 1'b0;
    #10;
      for(offset_15 = 0; offset_15 < `HZ_NUM ; offset_15 = offset_15 + 1)begin
        ch[15] = $hello_ma(offset_15,(15-15));
        for( line_15 = 0 ; line_15 < 16 ; line_15 = line_15+1)begin
          if(ch[15][line_15] != 0)
            repeat(10) #1 ch_dis[15] <= ~ch_dis[15];
          else
            repeat(10) #1 ch_dis[15] <= 1'b0;
        end
      end
    #10;
  end
  
  
  
  initial
  begin
    $fsdbDumpfile("tb_hello_ma.fsdb");
    $fsdbDumpvars;
  end
endmodule


源码和脚本在这里下载
hello_ma.7z

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156260-1-1.html 上篇帖子: perl C/C++ 扩展(三) 下篇帖子: 【原创】Perl判断操作系统类型
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表