MyFPGA Forum

 找回密码
 注册
搜索
查看: 6937|回复: 11
打印 上一主题 下一主题

降低算法开发时间的programming code(Verilog分享)

[复制链接]
跳转到指定楼层
1#
发表于 2010-4-1 10:35:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在验证或调整算法的参数时, 最好的方法就是可以直接利用接口来操作, 而不需要每次去修改参数, 一再重复耗时的 compile 动作, 这边分享一个 programming code, 可以大大的降低算法开发的时间…

简单的介绍
module tvpat_reg (
                  resetn_i, //system reset
                  tvclk_i, //system clock
                  vsynclast_i, //the programming is better to act at the vsync-time for video
                  data_i, //high 8-bit for address, low 8-bit for programming data
                  set_i, //trigger (ex. push button ..)
                  
                  tvpaten_o, //below is programming(register setting)
                  tvtype_o,
                  tvpatsel_o,
                  tvmixen_o,
                  tvmixsel_o,
                  tvamp75p_o,
                  hueadjust_o,
                  saturate_o,
                  lrmpincr_o,
                  lrmpstep_o,
                  crmpincr_o,
                  crmpstep_o,
                  crmpsel_o,
                  graysel_o,
                  purisel_o,
                  lumagain_o,
                  chromagain_o,
                  dischroma_o
                 );
//========================================================
  input         resetn_i;
  input         tvclk_i;
  input         vsynclast_i;
  input  [15:0] data_i;
  input         set_i;

  output [ 1:0] tvtype_o;
  output        tvpaten_o;
  output [ 3:0] tvpatsel_o;
  output        tvmixen_o;
  output [ 3:0] tvmixsel_o;
  output        tvamp75p_o;
  output [ 7:0] hueadjust_o;
  output [ 7:0] saturate_o;
  output [ 7:0] lrmpincr_o;
  output [ 7:0] lrmpstep_o;
  output [ 7:0] crmpincr_o;
  output [ 7:0] crmpstep_o;
  output [ 1:0] crmpsel_o;
  output        graysel_o;
  output [ 2:0] purisel_o;
  output [ 1:0] lumagain_o;
  output [ 1:0] chromagain_o;
  output        dischroma_o;
//===========================================
  reg        reg_tvpaten;
  reg  [1:0] reg_tvtype;
  reg  [3:0] reg_tvpatsel;
  reg        reg_tvmixen;
  reg  [3:0] reg_tvmixsel;
  reg        reg_tvamp75p;
  reg  [7:0] reg_hueadjust;
  reg  [7:0] reg_saturate;
  reg  [7:0] reg_lrmpincr;
  reg  [7:0] reg_lrmpstep;
  reg  [7:0] reg_crmpincr;
  reg  [7:0] reg_crmpstep;
  reg  [1:0] reg_crmpsel;
  reg        reg_graysel;
  reg  [2:0] reg_purisel;
  reg  [1:0] reg_lumagain;
  reg  [1:0] reg_chromagain;
  reg        reg_dischroma;

  reg         tvpaten_o;
  reg  [ 1:0] tvtype_o;
  reg  [ 3:0] tvpatsel_o;
  reg         tvmixen_o;
  reg  [ 3:0] tvmixsel_o;
  reg         tvamp75p_o;
  reg  [ 7:0] hueadjust_o;
  reg  [ 7:0] saturate_o;
  reg  [ 7:0] lrmpincr_o;
  reg  [ 7:0] lrmpstep_o;
  reg  [ 7:0] crmpincr_o;
  reg  [ 7:0] crmpstep_o;
  reg  [ 1:0] crmpsel_o;
  reg         graysel_o;
  reg  [ 2:0] purisel_o;
  reg  [ 1:0] lumagain_o;
  reg  [ 1:0] chromagain_o;
  reg         dischroma_o;

//latch the programming data
always@(posedge tvclk_i or negedge resetn_i)         
begin                                                
    if(!resetn_i) begin                              
       reg_tvpaten         <= 1'b1;                    
       reg_tvtype[1:0]     <= 2'h0;                    
       reg_tvpatsel[3:0]   <= 4'h0;                    
       reg_tvmixen         <= 1'b0;                    
       reg_tvmixsel[3:0]   <= 4'h0;                    
       reg_tvamp75p        <= 1'b1;                    
       reg_hueadjust[7:0]  <= 8'h0;                    
       reg_saturate[7:0]   <= 8'h70;                  
       reg_lrmpincr[7:0]   <= 8'h1;                    
       reg_lrmpstep[7:0]   <= 8'h5;                    
       reg_crmpincr[7:0]   <= 8'h1;                    
       reg_crmpstep[7:0]   <= 8'h5;                    
       reg_crmpsel[1:0]    <= 2'h0;                    
       reg_graysel         <= 1'b0;                    
       reg_purisel[2:0]    <= 3'h0;                    
       reg_lumagain[1:0]   <= 2'h0;                    
       reg_chromagain[1:0] <= 2'h0;                    
       reg_dischroma       <= 1'b0;                    
    end                                             
    else if(set_i) begin
            if(data_i[15:8] == 8'h00)                  
               reg_tvpaten         <= data_i[0];
            if(data_i[15:8] == 8'h01)        
               reg_tvtype[1:0]     <= data_i[1:0];
            if(data_i[15:8] == 8'h02)   
               reg_tvpatsel[3:0]   <= data_i[3:0];
            if(data_i[15:8] == 8'h03)
               reg_tvmixen         <= data_i[0];
            if(data_i[15:8] == 8'h04)      
               reg_tvmixsel[3:0]   <= data_i[3:0];
            if(data_i[15:8] == 8'h05)  
               reg_tvamp75p        <= data_i[0];
            if(data_i[15:8] == 8'h06)      
               reg_hueadjust[7:0]  <= data_i[7:0];
            if(data_i[15:8] == 8'h07)
               reg_saturate[7:0]   <= data_i[7:0];
            if(data_i[15:8] == 8'h08)
               reg_lrmpincr[7:0]   <= data_i[7:0];
            if(data_i[15:8] == 8'h09)
               reg_lrmpstep[7:0]   <= data_i[7:0];
            if(data_i[15:8] == 8'h0A)
               reg_crmpincr[7:0]   <= data_i[7:0];
            if(data_i[15:8] == 8'h0B)  
               reg_crmpstep[7:0]   <= data_i[7:0];
            if(data_i[15:8] == 8'h0C)
               reg_crmpsel[1:0]    <= data_i[1:0];
            if(data_i[15:8] == 8'h0D)   
               reg_graysel         <= data_i[0];
            if(data_i[15:8] == 8'h0E)      
               reg_purisel[2:0]    <= data_i[2:0];
            if(data_i[15:8] == 8'h0F)   
               reg_lumagain[1:0]   <= data_i[1:0];  
            if(data_i[15:8] == 8'h10)
               reg_chromagain[1:0] <= data_i[1:0];
            if(data_i[15:8] == 8'h11)
               reg_dischroma       <= data_i[0];      
    end                                                    
end     
                                             
//really act during the vsync duration
//it will not make the wrong picture
  always@(posedge tvclk_i or negedge resetn_i)
  begin
      if(!resetn_i) begin
         tvpaten_o         <= 1'b1;
         tvtype_o[1:0]     <= 2'h0;
         tvpatsel_o[3:0]   <= 4'h0;
         tvmixen_o         <= 1'b0;
         tvmixsel_o[3:0]   <= 4'h0;
         tvamp75p_o        <= 1'b1;
         hueadjust_o[7:0]  <= 8'h0;
         saturate_o[7:0]   <= 8'h70;
         lrmpincr_o[7:0]   <= 8'h1;
         lrmpstep_o[7:0]   <= 8'h5;
         crmpincr_o[7:0]   <= 8'h1;
         crmpstep_o[7:0]   <= 8'h5;
         crmpsel_o[1:0]    <= 2'h0;
         graysel_o         <= 1'b0;
         purisel_o[2:0]    <= 3'h0;
         lumagain_o[1:0]   <= 2'h0;
         chromagain_o[1:0] <= 2'h0;
         dischroma_o       <= 1'b0;
      end
      else if(vsynclast_i) begin
              tvpaten_o         <= reg_tvpaten;
              tvtype_o[1:0]     <= reg_tvtype[1:0];
              tvpatsel_o[3:0]   <= reg_tvpatsel[3:0];
              tvmixen_o         <= reg_tvmixen;
              tvmixsel_o[3:0]   <= reg_tvmixsel[3:0];
              tvamp75p_o        <= reg_tvamp75p;
              hueadjust_o[7:0]  <= reg_hueadjust[7:0];
              saturate_o[7:0]   <= reg_saturate[7:0];
              lrmpincr_o[7:0]   <= reg_lrmpincr[7:0];
              lrmpstep_o[7:0]   <= reg_lrmpstep[7:0];
              crmpincr_o[7:0]   <= reg_crmpincr[7:0];
              crmpstep_o[7:0]   <= reg_crmpstep[7:0];
              crmpsel_o[1:0]    <= reg_crmpsel[1:0];
              graysel_o         <= reg_graysel;
              purisel_o[2:0]    <= reg_purisel[2:0];
              lumagain_o[1:0]   <= reg_lumagain[1:0];
              chromagain_o[1:0] <= reg_chromagain[1:0];
              dischroma_o       <= reg_dischroma;
      end             
  end
endmodule

希望对大家在算法的开发上有很大的帮助
2#
发表于 2010-4-1 15:33:35 | 只看该作者
回复 1# Pocahontas


    谢谢您 :)

   我看到这个代码以及data_i后,

  突然就想明白为什么DE系列的开发板上都有那么多的拨码开关了。。

  ok。。。说一个冷笑话而已。。。

  如果系统不在乎多一个核心的话,我习惯用nios去调试参数,当然接口和这一回事啦
3#
发表于 2010-4-2 08:53:06 | 只看该作者
,谢谢,学习了。
4#
 楼主| 发表于 2010-4-6 10:41:42 | 只看该作者
如果 FPGA 是终端产品的话, 系统并不会在乎多个核心, 但若 ASIC是终端产品的话, 这是很常见用来 programming 的 register file.. 在 ASIC 这边的系统端也是写 C, 不会用 switch, 因为太占空间喔~
5#
发表于 2010-4-6 13:14:00 | 只看该作者
回复 4# Pocahontas


    嗯,ASIC都很在乎,测试和调试逻辑的插入,而且希望对系统的影响最小
弱弱地问一下,您也做IC后端么?
6#
 楼主| 发表于 2010-4-6 23:32:22 | 只看该作者
您说的是 APR 吗? 这部分我没有做过喔~
还是说 chip 回来之后, 跟系统端一起发展应用程序呢??
若是后者的话, 这部份的 C 我也帮忙写过…
因为 IC designer 会最了解自己设计的程序该如何使用..
7#
发表于 2010-4-7 09:44:25 | 只看该作者
回复 6# Pocahontas


   嗯,我对IC后端的理解是
  RTL属于IC设计前端,将RTL用指定工艺库综合到网表,再版图布局布线,算IC后端

  如果从系统的前端后端来说
  好像按信号采集和初步处理算前端,上层程式算后端

  我们院系偏重IC后端,但是我自己都在学IC前端,或者说系统级的东西。
  现在是大四,不过还是开始准备研究生毕业设计的东西,想做一个简单的GPU
  打算从应用软件到底层驱动,到硬件。不过比较担心2年做不做得完····
   因为自己是基础0了,而且这个不属于实验室项目,整个过程要自学并且独立完成

  您真的很晚还在发帖也·····
8#
 楼主| 发表于 2010-4-8 09:54:18 | 只看该作者
嗯,我对IC后端的理解是
  RTL属于IC设计前端,将RTL用指定工艺库综合到网表,再版图布局布线,算IC后端
 是的, 就是 P&R or 我们说的 APR, 我家爸爸在 job rotate 时也曾做过这部份约两年喔~ 他是念资讯工程的, 基本上是在负责 design flow, 也写过 delay calculation 等后段的应用程序… 其实在读书时, 不要管院系偏重的为何, 都努力学习, 自己有兴趣的东西也继续多做, 等真正工作时, 不管做哪方面, 都会很有帮助喔~ 想做的就着手去做, 不要先想结果如何, 至少过程都努力过, 从这边也一定有收获, 虽然我相信您一定可以做的很好的, 因为你很努力~ 我们一起加油喔~
9#
发表于 2010-5-18 21:25:48 | 只看该作者
用C语言的算法,从相片中读出数字,大小合适的几个数字,难度应该很大吧?数字图像识别  是不是基础要学通啊?
10#
 楼主| 发表于 2010-5-19 18:00:44 | 只看该作者
看不大懂你的意思耶~
11#
发表于 2010-5-21 16:04:48 | 只看该作者
回复 9# yongyooh


    模式识别的基础

不过要看是什么样的数字了。如果是为了能识别出来而做的数字,那倒好说
如果是把那种验证码的数字识别出来。。。。就不知道了。。。。


这些 类别的东西,我个人觉得,全部的内容是博大精深的,即使是基础部分也非常多。
如果赶进度的话,就先学相关的吧,同类的算法,了解其中一部分,不用全部掌握
12#
发表于 2010-5-21 20:23:06 | 只看该作者
回复 10# Pocahontas
就是一张照片中,有一部分有一串数字,把这些离散的数字,读取出来,传送出去
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-6 22:07 , Processed in 0.039296 second(s), 14 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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