---
# System prepended metadata

title: 'TechReport: Code review about HoughMappingGenerator'
tags: [2D, TechReport, DeWei]

---

# TechReport: Code review about HoughMappingGenerator

## 1. Dimension

### 1.1 Full
![full-dim](https://i.imgur.com/cWIuGvK.png)

### 1.2 xy-plane(polar location)
![xy-dim](https://i.imgur.com/1PDRuLT.png)


## 2. Constant

### 2.1 Mechanical parameter

| L | Lr |  r_SL  | N_TS_SL |
|---|----|--------|---------|
| 0 | 0  | 19.80  |   160   |
| 1 | 2  | 40.16  |   192   |
| 2 | 4  | 62.00  |   256   |
| 3 | 6  | 83.84  |   320   |
| 4 | 8  | 105.68 |   384   |

* L: Index in code
* Lr: Real index No. of vaild super layers in 2D-Trigger
* r_SL: Radius from center of circle to specific SL, fixed (radius of machine)
    * for instance: r_SL[2] = 83.84 (see [above pictrure: r-SL4](###1.2-xy-plane(polar-location)))

* N_TS_SL: Max count of *trigger segment* 
    * for instance: N_TS_SL[4] = 384 (see [above pictrure: N_TS_SL-8](###1.2-xy-plane(polar-location)))
    
### 2.2 HoughPlane

![HoughPlane](https://i.imgur.com/MOHzDLR.png)

* HoughPlane_nx = 160: The count of x scale(phi) in Hough Plane

* HoughPlane_ny = 16: The count of y scale\(r\) in Hough Plane

## 3. Space transform (pole to xy)

See [above pictrure: N_TS_SL-8](###1.2-xy-plane(polar-location)), 
our 2D trigger plane is cricle plane.

We easily describe the location of TS with polar location, that's $(r,$ $\phi$$)$ .

But the [Hough Line/Curve Transform](https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html) work on the xy-plane.

So we need to convert spcace from ploar space to xy-plane for each TS-location in the first step:

```python
for i in 0 to L
  x = r_SL[i] * cos( i * ( (2*pi) / (N_TS_SL[i]) ) )
  y = r_SL[i] * sin( i * ( (2*pi) / (N_TS_SL[i]) ) )
```
note: Regarding the `L`, see the [table of Mechanical parameter](###2.1-Mechanical-parameter)

## 4. Hough curve Transform

Old version:

``` python
for i in 0 to n_TS_SL
    r[i] = 
    ( (x[i])^2 + (y[i])^2 ) / 
    2 * ( x[i]*cos(phi[i]) + y[i]*sin(phi[i]) )
```

New version:

``` python
for i in 0 to n_TS_SL
    r[i] = 
    (2 / r_SL) *
    sin( phi[i] - ( (2*pi) / n_TS_SL )*i )
```


## Files generated

### TSIM Files

### HDL Files

* MapLoop
    * i -> {0,2,4,6,8}
    * j -> 0~79(minus), 80~159(plus)
    * k -> 0~15

#### Original

* <SL[0],SL[2],SL[4],SL[6],SL[8]> * <Plus,Minus>, total 12 files
* Output
    * SL[n]_Plus -> [39:0]
    * SL[n]_Minus ->[79:40]
* Input 
    * SL[0]_TS -> [80:0]
        *  80*2 = 160 = N_TS_SL[0]
    * SL[2]_TS -> [96:0]
        *  96*2 = 192 = N_TS_SL[2]
    * SL[4]_TS -> [128:0] 
        *  128*2 = 256 = N_TS_SL[4]
    * SL[6]_TS -> [160:0] 
        *  160*2 = 320 = N_TS_SL[6]
    * SL[8]_TS -> [192:0] 
        *  192*2 = 384 = N_TS_SL[8]
    * **problem:** Why is the range **[80:0]** instead of **[79:0]**?

#### Objective of optimize 

* Using **array**, **index**, **struct** manage data -> **only 2 HDL files in total** 

* File 1: Golbal parameter file (UT4_HoughMapping_param)
  ``` vhdl
  library ieee;
  use ieee.std_logic_1164.all;
  use ieee.std_logic_unsigned.all;
  use ieee.std_logic_misc.all;

  package UT4_HoughMapping_param is 
    constant MAX_SL_COUNT_2D : integer := 5;
    constant MAX_ROW_COUNT_2D : integer := 16;
    ----count of Hough cell at log-r

    constant N_TS_SL_0 : integer := 160;
    constant N_TS_SL_2 : integer := 192;
    constant N_TS_SL_4 : integer := 256;
    constant N_TS_SL_6 : integer := 320;
    constant N_TS_SL_8 : integer := 384;

    constant I_dont_know : integer := 40;

    type TS_Data_t is record 
      SL0 : std_logic_vector( ( N_TS_SL_0 -1) downto 0 );
      SL2 : std_logic_vector( ( N_TS_SL_2 -1) downto 0 );
      SL4 : std_logic_vector( ( N_TS_SL_4 -1) downto 0 );
      SL6 : std_logic_vector( ( N_TS_SL_6 -1) downto 0 );
      SL8 : std_logic_vector( ( N_TS_SL_8 -1) downto 0 );
    end record TS_Data_t;

    type row_data is array ( 0 to (MAX_ROW_COUNT_2D-1) ) of 
      std_logic_vector( (I_dont_know -1) downto 0 );

    type HoughMapping_Result_t is record 
      SL0 : row_data;
      SL2 : row_data;
      SL4 : row_data;
      SL6 : row_data;
      SL8 : row_data;
    end record HoughMapping_Result_t;        

  end package UT4_HoughMapping_param;
  ```

* File 2: The main HDL File (HoughMapping Munus/Plus)
  ``` VHDL
  library ieee;
  use ieee.std_logic_1164.all;
  use ieee.std_logic_unsigned.all;
  use ieee.std_logic_misc.all;

  library work;
  use work.UT4_HoughMapping_param.all;
  --invoke our defined type and parameter

  entity UT4_HoughMapping is
  port (
    reset_n : std_logic;
    clk : std_logic;
    TS_input : TS_Data_t;
    minus_Result : HoughMapping_Result_t;
    plus_Result : HoughMapping_Result_t);
  end entity UT4_HoughMapping;
  ...
  ...
  ...
  ```

* Add reset_n/clock for timing stable

* [Modified formula of Hough curve transformation](https://hackmd.io/@BelleII-CDC-Trig-NTU-DeWei/H1SM44b2U#Modified-formula-of-Hough-curve-transformation)



#### [All of code here](https://github.com/curly-wei/HoughTrigMapping_dev)

###### tags: `TechReport` `DeWei` `2D`