Advertisement
Holey_yan

[Verilog] 104 Cell-based 初賽競賽題目

Jul 19th, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns/10ps
  2. module LBP ( clk, reset, gray_addr, gray_req, gray_ready, gray_data, lbp_addr, lbp_valid, lbp_data, finish);
  3. input         clk;          // 時脈訊號
  4. input         reset;        // 重置訊號
  5. input         gray_ready;   // 當為 HIGH 才可對 HOST 索取資料
  6. input  [ 7:0] gray_data;    // 灰階圖像資料
  7. output [13:0] gray_addr;    // 灰階圖像位址
  8. output        gray_req;     // 當為 HIGH 表示向 HOST 索取資料
  9. output [13:0] lbp_addr;     // 二值圖像位址
  10. output [ 7:0] lbp_data;     // 二值圖像資料
  11. output        lbp_valid;    // 完成運算後為 HIGH
  12. output        finish;       // 完成整張圖像後為 HIGH
  13.  
  14. // define to register
  15. reg [13:0] gray_addr = 128;
  16. reg        gray_req  = 0;
  17. reg [13:0] lbp_addr  = 128;
  18. reg [ 7:0] lbp_data  = 0;
  19. reg        lbp_valid = 0;
  20. reg        finish    = 0;
  21.  
  22. integer width   = 0;        // 寬度計算器
  23. integer i       = 0;        // 計數器
  24. integer j       = 0;        // 計數器
  25. reg [ 8:0] block[ 8:0];     // 3*3 區塊
  26. reg [14:0] addr = 128;      // 目前記憶體位址
  27. reg [ 7:0] lbp  = 0;        // 計算的 LBP 值
  28. reg [ 7:0] pow  = 1;        // 計算的 LBP 2^x 值
  29. //====================================================================
  30. // if (addr % 128 == 0 || (addr + 1) % 128 ==0) { continue; }
  31. always @(posedge clk, posedge reset) begin
  32.     if (reset) begin
  33.         gray_addr = 0;
  34.         gray_req  = 0;
  35.         lbp_addr  = 129;
  36.         lbp_data  = 0;
  37.         lbp_valid = 0;
  38.         finish    = 0;
  39.  
  40.         i         = 0;
  41.         addr      = 129;
  42.         width     = 1;
  43.         lbp       = 0;
  44.         pow       = 0;
  45.     end else begin
  46.         lbp_valid = 0;
  47.         gray_req = 1;
  48.  
  49.         if (width == 0) begin
  50.             lbp_data = 0;
  51.             lbp_addr = addr;
  52.             lbp_valid = 1;
  53.             addr = addr + 1;
  54.             width = width + 1;
  55.             i = 0;
  56.         end else if (width == 127) begin
  57.             lbp_data = 0;
  58.             lbp_addr = addr;
  59.             lbp_valid = 1;
  60.             addr = addr + 1;
  61.             width = 0;
  62.             i = 0;
  63.         end else begin
  64.             if (i > 0 && i <= 9) begin
  65.                 block[i - 1] = gray_data;
  66.             end
  67.  
  68.             if (i == 0) begin
  69.                 gray_addr = addr - 129;
  70.             end else if (i == 1) begin
  71.                 gray_addr = addr - 128;
  72.             end else if (i == 2) begin
  73.                 gray_addr = addr - 127;
  74.             end else if (i == 3) begin
  75.                 gray_addr = addr - 1;
  76.             end else if (i == 4) begin
  77.                 gray_addr = addr;
  78.             end else if (i == 5) begin
  79.                 gray_addr = addr + 1;
  80.             end else if (i == 6) begin
  81.                 gray_addr = addr + 127;
  82.             end else if (i == 7) begin
  83.                 gray_addr = addr + 128;
  84.             end else if (i == 8) begin
  85.                 gray_addr = addr + 129;
  86.             end else if (i == 9) begin
  87.                 lbp = 0;
  88.                 pow = 1;
  89.                 for (j = 0; j < 9; j = j + 1) begin
  90.                     if (j != 4 && block[j] >= block[4]) begin
  91.                         lbp = lbp + pow;
  92.                     end
  93.  
  94.                     if (j != 4) begin
  95.                         pow = pow * 2;
  96.                     end
  97.                 end
  98.                 lbp_data = lbp;
  99.                 lbp_addr = addr;
  100.                 lbp_valid = 1;
  101.                
  102.                 addr = addr + 1;
  103.                 width = width + 1;
  104.  
  105.                 i = 0;
  106.                 gray_addr = addr - 129;
  107.             end
  108.  
  109.             if (i < 9) begin
  110.                 i = i + 1;
  111.             end
  112.         end
  113.  
  114.         if (addr > 16255) begin
  115.             gray_req  = 0;
  116.             finish = 1;
  117.         end
  118.     end
  119. end
  120. //====================================================================
  121. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement