Advertisement
Guest User

Untitled

a guest
May 20th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 10.03 KB | None | 0 0
  1.  
  2. module CONTROL_MASKING(
  3.     // Глобальная тактовая частота и ресет
  4.     clk,
  5.     reset_n,
  6.    
  7.     // линии шины avalone-mm slave
  8.     mm_chipselect,
  9.     mm_read,
  10.     mm_write,
  11.     mm_readdata,
  12.     mm_writedata,
  13.     mm_address,
  14.  
  15.     // сигналы линии синхронизации потока данных маскирования
  16.     sink_data_mask,
  17.     sink_valid,
  18.     sink_ready,
  19.     sink_sop,
  20.     sink_eop,
  21.    
  22.     // выходной поток сигналов синхронизации и данных маскирования
  23.     source_data_masking,
  24.     source_valid,
  25.     source_ready,
  26.     source_sop,
  27.     source_eop,
  28.    
  29.     // канал связи с контроллером i2c master
  30.     clk50,
  31.     vcm_i2c_scl,
  32.     vcm_i2c_sda
  33.    
  34. );
  35.  
  36.  
  37. // global clock & reset
  38. input   clk;
  39. input   reset_n;
  40.  
  41. // mm slave
  42. input                           mm_chipselect;
  43. input                           mm_read;
  44. input                           mm_write;
  45. output  reg [31:0]              mm_readdata;
  46. input   [31:0]                  mm_writedata;
  47. input   [3:0]                   mm_address;
  48.  
  49.  
  50. // streaming sink
  51. input   [23:0]                 sink_data_mask;
  52. input                          sink_valid;
  53. output                         sink_ready;
  54. input                          sink_sop;
  55. input                          sink_eop;
  56.  
  57. // streaming  data masking
  58. output  [23:0]                 source_data_masking;
  59. output                         source_valid;
  60. input                          source_ready;
  61. output                         source_sop;
  62. output                         source_eop;
  63.  
  64. // conduit export
  65. input                         clk50;
  66. inout                         vcm_i2c_scl;
  67. inout                         vcm_i2c_sda;
  68.  
  69. //////////////////////////////////////////////
  70. parameter    VIDEO_W   = 1920, // masking area
  71.              VIDEO_H   = 1080;  
  72.                  
  73. localparam   MASKING_MODE     = 1'b0,
  74.              DEMASKING__MODE   = 1'b1;
  75.  
  76. localparam  st1 = 3'b01,
  77.             st2 = 3'b10;
  78. localparam base = 4'b1111;
  79. initial begin
  80.     state = st1;
  81. end
  82.  
  83.              
  84. reg process_start ;
  85. reg masking_mode;
  86.                  
  87. reg  [11:0]  masking_active_w ;
  88. reg  [11:0]  masking_active_h ;
  89. reg  [11:0]  masking_active_x_start ;
  90. reg  [11:0]  masking_active_y_start ;
  91.  
  92. reg  [11:0]  x_cnt ;
  93. reg  [11:0]  y_cnt ;
  94. reg  [7:0]   smsk;
  95. reg  [7:0]   smsk_f;
  96. reg  [7:0]   th;
  97.  
  98. ////////////////////////////////////////////////////////////////////////
  99. ////////////////////////////////////////////////////////////////////////
  100. wire [23:0] poly =  24'h800a23;
  101. reg [23:0] myreg;
  102. wire [23:0] feedback;
  103. wire [23:0] out;
  104. wire [23:0] demask;
  105. assign feedback = {23{myreg[23]}} & poly;
  106. assign  out = {sink_data_mask[23:16]^myreg[23:16], sink_data_mask[15:8]^myreg[15:8], sink_data_mask[7:0]^myreg[7:0]};
  107. assign  demask = (masking_mode)? res^(~myreg[23:0]):24'hFF_FF_FF;
  108. reg run_musk;
  109. reg run_nmusk;
  110. reg run_musk_and_real;
  111. wire [23:0] musk_data;
  112.  
  113. reg [23:0]  da      [0:16];
  114. reg [23:0]  d       [0:16];
  115. reg [1:0]   state;
  116. reg [23:0]  res;
  117. ////////////////////////////////////////////////////////////////////////
  118. ////////////////////////////////////////////////////////////////////////
  119.  
  120. assign source_data_masking  =  ((run_musk & masking_window_area)|(run_musk_and_real & masking_window_area_musk)|(run_nmusk & masking_window_area_nmusk))?
  121.                                                                                                                 (run_nmusk& masking_window_area_nmusk)?
  122.                                                                                                                             demask
  123.                                                                                                                             :res
  124.                                                                                                                 :sink_data_mask;
  125.  
  126. assign source_valid =  sink_valid;
  127. assign sink_ready   =  source_ready;
  128. assign source_sop   =  sink_sop;
  129. assign source_eop   =  sink_eop;
  130.  
  131.  
  132.  
  133. ///////////////////////////////////////////////////////
  134. /// команды управления от шины avalone-mm master  /////
  135. ///////////////////////////////////////////////////////
  136.  
  137. // write
  138. `define REG_GO              0
  139. `define REG_CTRL            1
  140. `define REG_MASKING_W       2
  141. `define REG_MASKING_H       3
  142. `define REG_MASKING_X_START 4
  143. `define REG_MASKING_Y_START 5
  144. `define REG_SMSK            6  
  145.                              
  146. `define REG_TH              7
  147. `define MASK                8
  148. `define nMASK               9  
  149.  
  150. // read
  151. `define REG_STATUS         0
  152. //`define REG_SUM            1
  153.  
  154.  
  155. // mm mater write
  156. always @ (posedge clk)
  157. begin
  158.     if (~reset_n)
  159.     begin
  160.         process_start <= 1'b0;
  161.         masking_mode    <=  MASKING_MODE;
  162.        
  163.         masking_active_w       <= 12'd200;
  164.         masking_active_h       <= 12'd120;
  165.         masking_active_x_start <= 12'd300;
  166.         masking_active_y_start <= 12'd180;
  167.        
  168.         smsk                 <= 8'd10;
  169.         smsk_f               <= 8'd1;
  170.        
  171.         th                   <= 8'd5;
  172.     end
  173.     else begin
  174.       if(mm_chipselect & mm_write) begin
  175.            if      (mm_address == `REG_GO)  process_start <= mm_writedata[0];
  176.           else if (mm_address == `REG_CTRL) run_musk      <= mm_writedata[0];// DEMASKING__MODE
  177.           else if (mm_address == `REG_MASKING_W)       masking_active_w       <= mm_writedata[11:0];   
  178.           else if (mm_address == `REG_MASKING_H)       masking_active_h       <= mm_writedata[11:0];
  179.           else if (mm_address == `REG_MASKING_X_START) masking_active_x_start <= mm_writedata[11:0];   
  180.           else if (mm_address == `REG_MASKING_Y_START) masking_active_y_start <= mm_writedata[11:0];
  181.           else if (mm_address == `REG_SMSK)    begin smsk                 <= mm_writedata[15:8];
  182.                                                    smsk_f               <= mm_writedata[7:0];
  183.                                                             end
  184.            else if (mm_address == `REG_TH)            th                   <= mm_writedata[7:0];
  185.            else if (mm_address == `MASK)  run_musk_and_real <= mm_writedata[0];
  186.            else if (mm_address == `nMASK)  run_nmusk <= mm_writedata[0];
  187.         end
  188.     end
  189. end
  190.  
  191.  
  192.  
  193. // Чтение avalone-mm mater
  194. always @ (posedge clk)
  195. begin
  196.    if (~reset_n)
  197.        mm_readdata <= {16'b0,1'b1,15'b0};
  198.     else if (mm_chipselect & mm_read)
  199.     begin
  200.         if   (mm_address == `REG_STATUS) mm_readdata <= {16'b0,status};
  201.     end
  202. end
  203.  
  204. /////////////////////////////////
  205. // Храниение предыдущего статуса процесса
  206. reg pre_process_start;
  207. always @ (posedge clk or negedge reset_n)
  208.   if (~reset_n) pre_process_start <= 1'b1;
  209.   else pre_process_start <= process_start;
  210.  
  211.  
  212. wire process_start_tiggle;
  213. assign process_start_tiggle = (~pre_process_start & process_start)?1'b1:1'b0;
  214.  
  215. //Область маскирования/демаскирования
  216. wire masking_window_area ;
  217. wire masking_window_area_musk ;
  218. wire masking_window_area_nmusk ;
  219. wire masking_window_border;
  220.  
  221.  
  222. always @ (posedge clk or negedge reset_n)
  223. begin
  224.     if (~reset_n) begin
  225.         x_cnt <= 12'd0;
  226.         y_cnt <= 12'd0;
  227.    end
  228.     else if(sink_sop) begin
  229.             x_cnt <= 12'd0;
  230.            y_cnt <= 12'd0;
  231.     end
  232.     else if(sink_valid) begin
  233.        if(x_cnt == VIDEO_W - 1'b1) begin
  234.                  x_cnt <= 12'd0;
  235.                   y_cnt <= y_cnt + 1'b1;
  236.        end else begin
  237.        x_cnt <= x_cnt + 1'b1;  
  238.        end
  239.        myreg <= ((myreg ^ feedback) << 1) | !myreg[23];
  240.     end
  241. end
  242.  
  243. always @(posedge clk or negedge reset_n) begin
  244.     if (~reset_n) begin
  245.         // reset
  246.         state = st1;
  247.     end
  248.     else begin
  249.         case(state)
  250.             st1:begin
  251.                 if (x_cnt[3:0] != base ) begin
  252.                     da[x_cnt[3:0]] = out;
  253.                     state = st1;   
  254.                 end
  255.                 else begin
  256.                     state = st2;
  257.                     da[x_cnt[3:0]] = out;
  258.                 end
  259.             end
  260.             st2:begin
  261.                 if (x_cnt[3:0] != base ) begin
  262.                     d[x_cnt[3:0]] = out;
  263.                    
  264.                     state = st2;
  265.                 end
  266.                 else begin
  267.                     state = st1;
  268.             end
  269.             end
  270.         endcase
  271.     end
  272. end
  273.  
  274.  
  275.  
  276. assign masking_window_area = (    x_cnt >= masking_active_x_start
  277.                              && x_cnt <= (masking_active_x_start + masking_active_w)
  278.                                       && y_cnt >= masking_active_y_start
  279.                              && y_cnt <= (masking_active_y_start + masking_active_h)
  280.                                       )?1'b1:1'b0;
  281.  
  282. assign masking_window_area_musk = (    x_cnt >= masking_active_x_start
  283.                              && x_cnt <= (masking_active_x_start + masking_active_w/2)
  284.                                       && y_cnt >= masking_active_y_start
  285.                              && y_cnt <= (masking_active_y_start + masking_active_h)
  286.                                       )?1'b1:1'b0;
  287.  
  288. assign masking_window_area_nmusk = (    x_cnt >= (masking_active_x_start  + masking_active_w/2)
  289.                              && x_cnt <= (masking_active_x_start + masking_active_w)
  290.                                       && y_cnt >= masking_active_y_start
  291.                              && y_cnt <= (masking_active_y_start + masking_active_h)
  292.                                       )?1'b1:1'b0;
  293.                                      
  294. assign masking_window_border = (( x_cnt == masking_active_x_start
  295.                              || x_cnt == (masking_active_x_start + masking_active_w)
  296.                                       || y_cnt == masking_active_y_start
  297.                              || y_cnt == (masking_active_y_start + masking_active_h)
  298.                                       ) && masking_window_area) ?1'b1:1'b0;    
  299.        
  300. /////////////////////////////////////////////////
  301. // AREA enable
  302. reg       area_en;
  303. reg [1:0] area_en_delay_cnt;
  304. always @ (posedge clk or negedge reset_n)
  305. begin
  306.     if (~reset_n) begin
  307.     area_en           <= 1'b0;
  308.         area_en_delay_cnt <= 2'd0;
  309.     end
  310.     else if(process_start_tiggle) begin
  311.     area_en           <= 1'b1;
  312.         area_en_delay_cnt <= 2'd0;
  313.     end
  314.     else if(AREA_END & sink_eop )  begin
  315.       if(area_en_delay_cnt == 2'd3) area_en <= 1'b0;// or delay x frame?
  316.       else               area_en_delay_cnt <= area_en_delay_cnt + 1'b1;
  317.     end
  318. end
  319.        
  320. MASKING area_mask_demak(
  321. .iR (sink_data_mask[23:16]),
  322. .iG (sink_data_mask[15: 8]),
  323. .iB (sink_data_mask[ 7: 0]),
  324. .VS (sink_sop & sink_valid),
  325.  
  326. .SMSK(smsk),
  327. .SMSK_F(smsk_f),
  328. .TH(th),
  329. .ACTIV_C (masking_window_area & sink_valid) ,// masking-window area
  330. .ACTIV_V (sink_valid) , // full-screen
  331.  
  332. .VIDEO_CLK  ( clk   ),
  333. .MASK_DEMASK   ( res  ),  // masking data
  334. .SW_FUC_ALL_CEN( masking_mode) ,//
  335. .AREA_END ( AREA_END) ,
  336. .Y   ( Y ),
  337. .S   (S ),
  338. .END_STEP  (END_STEP ),
  339. .AREA_DATA (AREA_DATA ),
  340. .SUM(sum)
  341.  
  342. );//
  343. wire  [15:0] AREA_DATA ;
  344. wire  [9:0]  END_STEP ;
  345. wire         AREA_END  ;
  346. wire  [7:0]     S  ;
  347. wire  [17:0]    Y  ;
  348. //-----
  349. wire [15:0] status;
  350. wire [31:0]  sum;
  351. assign status  = { ~area_en,5'b0,END_STEP} ;
  352.        
  353.  
  354.                        
  355. I2C_AREA_Config vcm_i2c(   
  356.                 .iCLK(clk50),//clk_50
  357.                 .ENABLE(vcm_en),    // enable  
  358.                 .iRST_N(~sink_eop), // trigger
  359.                 .AREA_DATA(AREA_DATA),
  360.                 .END(),//vcm_i2c_end
  361.                
  362.                 .I2C_SCLK(vcm_i2c_scl),
  363.                 .I2C_SDAT(vcm_i2c_sda)
  364.                 );
  365.                        
  366.  
  367.  
  368. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement