sobel算子的verilog实现,采用了流水线操作

  1. module sobel_computer (
  2. clock ,
  3. reset,
  4. OrigDataEn,
  5. //SobelAluEn,
  6. OrigData,
  7. SobelData
  8. );
  9. input clock ,reset;
  10. input OrigDataEn ;
  11. //input SobelAluEn ;
  12. input [:] OrigData ;
  13. output reg [:] SobelData ;
  14.  
  15. reg [:] prev_row, curr_row, next_row ;
  16. reg [:] data_state ;
  17. reg [:]abs_D ;
  18. //*****************OrigDataEn 维持三个周期,将数据保存到三个reg 中****************
  19. always @ (posedge clock or negedge reset )
  20. if(!reset)
  21. begin
  22. data_state <= 'b00 ;
  23. prev_row <= 'd0 ;
  24. curr_row <= 'd0 ;
  25. next_row <= 'd0 ;
  26. end
  27. else if(OrigDataEn)
  28. begin
  29. case (data_state)
  30. 'b00 :
  31. begin
  32. prev_row <= OrigData ;
  33. data_state <= 'b01 ;
  34. end
  35. 'b01 :
  36. begin
  37. curr_row <= OrigData ;
  38. data_state <= 'b10 ;
  39. end
  40. 'b10 :
  41. begin
  42. next_row <= OrigData ;
  43. //data_state <= 2'b01 ;
  44. end
  45. endcase
  46. end
  47. else
  48. begin
  49. data_state <= 'b00 ;
  50. prev_row <= prev_row << ;
  51. curr_row <= curr_row << ;
  52. next_row <= next_row << ;
  53. end
  54. //----------------------------------------------------------------
  55. //function : 函数名= 内部reg,并返回。不包含 # @ wait,至少一个输入参数
  56. function [:] abs (input signed[:] data);
  57. abs = data[]? (~data[:]+): data[:];
  58. endfunction
  59.  
  60. reg signed [:] Dx,Dy ; //8'b1111_1111 * 6 = 11'd1530 所以采用11bit的Dx 和Dy
  61. reg [:]Orig [-:][-:];
  62.  
  63. /*
  64. 分段方式:[63:56] [55:48] [47:40] [39:32] [31:24] [23:16] [15:8] [7:0]
  65. sobel Dx -1 0 +1
  66. -2 0 +2
  67. -1 0 +1
  68.  
  69. Dy +1 +2 +1
  70. 0 0 0
  71. -1 -2 -1
  72. */
  73. //**************************************************************
  74. always @ (posedge clock or negedge reset)
  75. if(!reset)
  76. begin
  77. abs_D <= 'd0 ;
  78. Dx <= 'd0 ;
  79. Dy <= 'd0 ;
  80. SobelData <= 'd0 ;
  81. end
  82. else if(!OrigDataEn) //if(SobelAluEn )
  83. begin
  84. Dx <= $signed (~{'b000,Orig[-1][-1]}+1) // * -1
  85. + $signed(~({'b00,Orig[0][-1]}<<1)+1) // * -2
  86. + $signed(~{'b000,Orig[1][-1]}+1) // * -1
  87.  
  88. + $signed({'b000,Orig[-1][1]}) // * 1
  89. + $signed({'b00,Orig[0][1]}<<1) // * 2
  90. + $signed ({'b000,Orig[1][1]}) ; // * 1
  91.  
  92. Dy <= $signed ({'b000,Orig[-1][-1]}) // * 1
  93. + $signed ({'b00,Orig[-1][0]}<<1) // * 2
  94. + $signed({'b000,Orig[-1][1]}) // * 1
  95.  
  96. + $signed(~{'b000,Orig[1][-1]}+1) // * -1
  97. + $signed(~({'b00,Orig[1][0]}<<1)+1) // * -2
  98. + $signed(~{'b000,Orig[1][1]}+1) ; // * -1
  99.  
  100. abs_D <= (abs(Dx) + abs(Dy))>> ;
  101. SobelData <= {SobelData[:],abs_D};
  102.  
  103. Orig[-][-] <= Orig[-][]; Orig[-][] <= Orig[-][]; Orig[-][] <= prev_row[:];
  104. Orig[][-] <= Orig[][]; Orig[][] <= Orig[][]; Orig[][] <= curr_row[:];
  105. Orig[][-] <= Orig[][]; Orig[][] <= Orig[][]; Orig[][] <= next_row[:];
  106. end
  107.  
  108. endmodule

sobel流水线操作Verilog程序的更多相关文章

  1. C#----操作应用程序配置文件App.config

    对配置文件的一些疑问: 在应用程序的目录下,有两处值得注意的地方,一个是应用程序根目录下的App.config文件,和bin\debug\name.exe.config 或者 bin\Release\ ...

  2. 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)

    堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树.最小堆便是每个节点的值都<=其左右孩子值的完全二叉树. 设有n个元素的序列{k1,k2,..., ...

  3. IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架

    每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...

  4. python之商品操作小程序

    要求:写一个添加商品的程序,商品信息写入txt文件中,以二维字典形式比如:{‘小米’:{‘价格’:‘1999元’,‘数量’:10}} 1.添加商品 #商品名称 #价格 #数量 2.查看商品 3.删除商 ...

  5. 超大数据量操作 java程序优化[转载]

        一个表中有1000万以上的数据,要对其进行10万次以上的增删查改的操作,请问如何优化java程序对数据库的操作? 通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化. ...

  6. 流水线cpu —Verilog HDL

    一.准备工作 先看看书(<计算机原理与设计 Verilog HDL版>),搞懂一点原理.然后照着书上的代码写一写(用8.4的就可以了,不用8.6的). 注意mux2x32,mux4,cla ...

  7. 阅读verilog程序总结

    1.写程序先直接写出时钟信号 //-----------------产生串行时钟scl,为输入时钟的二分频--------- always@(negedge clk)//二分频表示频率小了,周期大了 ...

  8. C# 通过进程名/进程Id 操作窗口/程序

    1. 判断窗口是否存在 private bool IsWindowExist(IntPtr handle) { ) != IntPtr.Zero) && IsWindowVisible ...

  9. 第一个Verilog程序:通用加法器

    Verilog作为一门硬件描述语言,快速掌握它的方法就是不断的练习,反复动手实践,通过例子掌握隐藏在语句背后的硬件电路.下面是第一个需要学习的Verilog例子: )( :] a, :] b, inp ...

随机推荐

  1. AMD模块化JS

    参考http://ourjs.com/detail/52ad26ff127c76320300001f Offcial Site http://requirejs.org/ 下载http://requi ...

  2. jquery ajax方法和其他api回顾

    >> $ele.load(url, data, callback); //带data参数时为POST请求,否则为GET请求 // $('#testload').load('data.htm ...

  3. PHP查看在线服务器与本地服务器支持函数差别

    在本地开发好的程序.代码,当传到服务器后,经常会出现罢工的事情.这时候就要考虑开发环境和在线的环境是否完全一致了.这里所说的一致性,包括了容器的配置.php的配置等等.下面所要解决的只是其中一项,你的 ...

  4. 笔试题引出float数据的存储方式的深究

    笔试题: #include <iostream>#include <stdio.h>#include <string.h>#include <conio.h& ...

  5. 搜狗2015校园招聘javaproject师面经

    面试时看到了我的笔试题.真是慘不忍睹啊. . 1. 问回去有没有研究一下笔试题 木有,果断后面悲剧了 2. 解释一下笔试的一道选择题: 下列哪种操作可能带来死锁? A: lock(m1) lock(m ...

  6. 集合ArrayList案例

    1.添加元素,读取 ArrayList n = new ArrayList(); n.Add();//集合中添加元素用Add,分别添加了1,2 n.Add(); foreach (int a in n ...

  7. Task线程 同时执行多个任务

    Task taskTest = Task.Factory.StartNew(() => { Console.WriteLine("); },TaskCreationOptions.No ...

  8. jQuery的fancybox插件

  9. eclipse打war包

    链接地址:http://jingyan.baidu.com/article/c910274be14164cd361d2ddc.html 一个程序要想放到服务器容器中很多人想到了打一个war包放到tom ...

  10. NSNumber与NSInteger的区别

    Objective-C 支持的类型有两种:基本类型 和  类. 基本类型,如同C 语言中的 int 类型一样,拿来就可以直接用. 而类在使用时,必须先创建一个对象,再为对象分配空间,接着做初始化和赋值 ...