Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
x393
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
x393
Commits
f35c087d
Commit
f35c087d
authored
Apr 18, 2019
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
simulating/debugging LWIR sensor FPGA code
parent
654584f3
Changes
17
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
4322 additions
and
375 deletions
+4322
-375
x393_cocotb_lwir_04.sav
cocotb/x393_cocotb_lwir_04.sav
+4025
-231
x393_dut.v
cocotb/x393_dut.v
+4
-6
cmprs_cmd_decode.v
compressor_jp/cmprs_cmd_decode.v
+1
-1
jp_channel.v
compressor_jp/jp_channel.v
+1
-1
x393_parameters.vh
includes/x393_parameters.vh
+23
-4
x393_cmprs.py
py393/x393_cmprs.py
+6
-4
x393_sens_cmprs.py
py393/x393_sens_cmprs.py
+109
-47
x393_sensor.py
py393/x393_sensor.py
+2
-1
sens_lepton3.v
sensor/sens_lepton3.v
+13
-9
sensor_channel.v
sensor/sensor_channel.v
+7
-7
sensors393.v
sensor/sensors393.v
+2
-2
vospi_packet_80.v
sensor/vospi_packet_80.v
+17
-7
vospi_segment_61.v
sensor/vospi_segment_61.v
+19
-9
simul_lwir160x120_vospi.v
simulation_modules/simul_lwir160x120_vospi.v
+82
-35
gpio393.v
util_modules/gpio393.v
+1
-1
gpio393_bit.v
util_modules/gpio393_bit.v
+2
-2
x393.v
x393.v
+8
-8
No files found.
cocotb/x393_cocotb_lwir_04.sav
View file @
f35c087d
This source diff could not be displayed because it is too large. You can
view the blob
instead.
cocotb/x393_dut.v
View file @
f35c087d
...
...
@@ -1746,8 +1746,7 @@ simul_axi_hp_wr #(
)
;
/* Instance template for module simul_lwir160x120_vospi */
/*
wire lwir1_miso;
simul_lwir160x120_vospi #(
.DATA_FILE ("/data_ssd/nc393/elphel393/fpga-elphel/x393/input_data/pattern_160_120_14.dat"),
...
...
@@ -1791,7 +1790,7 @@ simul_axi_hp_wr #(
.telemetry_agc_low ( 16'd200), // input[15:0]
.telemetry_video_format (32'haaaa5555) // input[31:0]
);
*/
`ifdef
LWIR
simul_lwir160x120_vospi
#(
.
DATA_FILE
(
LWIR_DATA_FILE1
)
,
...
...
@@ -1967,9 +1966,7 @@ simul_axi_hp_wr #(
`endif
`else
simul_sensor12bits
#(
...
...
@@ -2133,6 +2130,7 @@ simul_axi_hp_wr #(
.
VACT
(
PX4_VACT
)
,
// output
.
VACT1
()
// output
)
;
`endif
/*
sim_soc_interrupts #(
.NUM_INTERRUPTS (NUM_INTERRUPTS)
...
...
compressor_jp/cmprs_cmd_decode.v
View file @
f35c087d
...
...
@@ -318,7 +318,7 @@ module cmprs_cmd_decode#(
if
(
mrst
)
cmprs_fmode_mclk
<=
0
;
else
if
(
ctrl_we_r
&&
di_r
[
CMPRS_CBIT_FOCUS
])
cmprs_fmode_mclk
<=
di_r
[
CMPRS_CBIT_FOCUS
-
1
-:
CMPRS_CBIT_FOCUS_BITS
]
;
if
(
mrst
)
rows_lsb_mclk
<=
4'h
0
f
;
if
(
mrst
)
rows_lsb_mclk
<=
4'hf
;
else
if
(
ctrl_we_r
&&
di_r
[
CMPRS_CBIT_ROWS_LSB
])
rows_lsb_mclk
<=
di_r
[
CMPRS_CBIT_ROWS_LSB
-
1
-:
CMPRS_CBIT_ROWS_LSB_BITS
]
;
if
(
mrst
)
bayer_shift_mclk
<=
0
;
...
...
compressor_jp/jp_channel.v
View file @
f35c087d
...
...
@@ -247,7 +247,7 @@ module jp_channel#(
wire
jp4_dc_improved
;
// in JP4 mode, compare DC coefficients to the same color ones
// wire [ 1:0] tile_margin; // margins around 16x16 tiles (0/1/2)
// wire [ 2:0] tile_shift; // tile shift from top left corner
wire
[
2
:
0
]
converter_type
;
// 0 - color18, 1 - color20, 2 - mono, 3 - jp4, 4 - jp4-diff, 7 - mono8 (not yet implemented)
wire
[
2
:
0
]
converter_type
;
// 0 - color18, 1 - color20, 2 - mono, 3 - jp4, 4 - jp4-diff,
6 - raw,
7 - mono8 (not yet implemented)
wire
scale_diff
;
// divide differences by 2 (to fit in 8-bit range)
wire
hdr
;
// second green absolute, not difference
wire
subtract_dc
;
// subtract/restore DC components
...
...
includes/x393_parameters.vh
View file @
f35c087d
...
...
@@ -305,8 +305,16 @@
parameter MCONTR_LINTILE_ABORT_LATE = 14, // abort frame if not finished by the new frame sync (wait pending memory)
parameter MCNTRL_SCANLINE_DLY_WIDTH = 12, // delay start pulse by 1..64 mclk
parameter MCNTRL_SCANLINE_DLY_DEFAULT = 1024, // initial delay value for start pulse
`ifdef SIMULATION
`ifdef LWIR
parameter MCNTRL_SCANLINE_DLY_DEFAULT = 100, // initial delay value for start pulse
`else
parameter MCNTRL_SCANLINE_DLY_DEFAULT = 1024, // initial delay value for start pulse
`endif
`else
parameter MCNTRL_SCANLINE_DLY_DEFAULT = 1024, // initial delay value for start pulse
`endif
// Channel test module parameters
parameter MCNTRL_TEST01_ADDR= 'h0f0,
parameter MCNTRL_TEST01_MASK= 'h7f0,
...
...
@@ -566,8 +574,13 @@
parameter VOSPI_PACKET_FIRST = 0,
parameter VOSPI_PACKET_LAST = 60,
parameter VOSPI_PACKET_TTT = 20, // line number where segment number is provided
parameter VOSPI_SOF_TO_HACT = 2, // clock cycles from SOF to HACT
`ifdef SIMULATION
parameter VOSPI_SOF_TO_HACT = 1000, // clock cycles from SOF to HACT
parameter VOSPI_HACT_TO_HACT_EOF = 1000, // pixel clock is 480 MHz, need to slow down for memory
`else
parameter VOSPI_SOF_TO_HACT = 10, // clock cycles from SOF to HACT
parameter VOSPI_HACT_TO_HACT_EOF = 2, // minimal clock cycles from HACT to HACT or to EOF
`endif
parameter VOSPI_MCLK_HALFDIV = 4, // divide mclk (200Hhz) to get 50 MHz, then divide by 2 and use for sensor 25MHz clock
//`else
//sensor_fifo parameters (for parallel12)
...
...
@@ -1000,8 +1013,14 @@
parameter CLKIN_PERIOD_PCLK = 42, // 24MHz
parameter DIVCLK_DIVIDE_PCLK = 1,
parameter CLKFBOUT_MULT_PCLK = 40, // 960 MHz
`ifdef SIMULATION
parameter CLKOUT_DIV_PCLK = 2, //480 MHz // 4, // 240 MHz
parameter CLKOUT_DIV_PCLK2X = 1, //9060 MHz // 2, // 480 MHz
`else
parameter CLKOUT_DIV_PCLK = 48, // 20 MHz
parameter CLKOUT_DIV_PCLK2X = 24, // 40 MHz
`endif
`else
parameter CLKIN_PERIOD_PCLK = 42, // 24MHz
parameter DIVCLK_DIVIDE_PCLK = 1,
...
...
py393/x393_cmprs.py
View file @
f35c087d
...
...
@@ -528,7 +528,7 @@ class X393Cmprs(object):
qbank
,
dc_sub
,
cmode
,
bit16
,
bit
s
16
,
multi_frame
,
bayer
,
focus_mode
,
...
...
@@ -559,7 +559,7 @@ class X393Cmprs(object):
CMPRS_CBIT_CMODE_MONO1 = 11 - mono JPEG (not yet implemented)
CMPRS_CBIT_CMODE_MONO4 = 14 - mono 4 blocks
CMPRS_CBIT_CMODE_RAW = 15 - raw (uncompressed) mode
@param bit16 - 16-bit (2 bytes per pixel) mode
@param bit
s
16 - 16-bit (2 bytes per pixel) mode
@param multi_frame - False - single-frame buffer, True - multi-frame video memory buffer,
@param bayer - Bayer shift (0..3)
@param focus_mode - focus mode - how to combine image with "focus quality" in the result image
...
...
@@ -584,12 +584,14 @@ class X393Cmprs(object):
print
(
"row_lsb_raw = "
,
row_lsb_raw
)
self
.
compressor_control
(
chn
=
chn
,
# compressor channel number (0..3)
run_mode
=
None
,
# no change
qbank
=
qbank
,
# [6:3] quantization table page
dc_sub
=
dc_sub
,
# [8:7] subtract DC
cmode
=
cmode
,
# [13:9] color mode:
multi_frame
=
multi_frame
,
# [15:14] 0 - single-frame buffer, 1 - multiframe video memory buffer
bayer
=
bayer
,
# [20:18] # Bayer shift
focus_mode
=
focus_mode
)
# [23:21] Set focus mode
focus_mode
=
focus_mode
,
# [23:21] Set focus mode
row_lsb_raw
=
row_lsb_raw
)
# [3:0] LSBs of the window height that do not fit into compressor format
self
.
compressor_format
(
chn
=
chn
,
# compressor channel number (0..3)
...
...
py393/x393_sens_cmprs.py
View file @
f35c087d
...
...
@@ -176,10 +176,11 @@ class X393SensCmprs(object):
SENSOR_DEFAULTS
[
x393_sensor
.
SENSOR_INTERFACE_HISPI
][
"height"
]
=
vrlg
.
WOI_HEIGHT
+
4
SENSOR_DEFAULTS
[
x393_sensor
.
SENSOR_INTERFACE_HISPI
][
"top"
]
=
0
SENSOR_DEFAULTS
[
x393_sensor
.
SENSOR_INTERFACE_HISPI
][
"left"
]
=
0
SENSOR_DEFAULTS
[
x393_sensor
.
SENSOR_INTERFACE_LWIR
][
"width"
]
=
vrlg
.
WOI_WIDTH
#4
SENSOR_DEFAULTS
[
x393_sensor
.
SENSOR_INTERFACE_LWIR
][
"height"
]
=
vrlg
.
WOI_HEIGHT
SENSOR_DEFAULTS
[
x393_sensor
.
SENSOR_INTERFACE_LWIR
][
"top"
]
=
0
SENSOR_DEFAULTS
[
x393_sensor
.
SENSOR_INTERFACE_LWIR
][
"left"
]
=
0
# keep settings from Python program
#SENSOR_DEFAULTS[x393_sensor.SENSOR_INTERFACE_LWIR]["width"]= vrlg.WOI_WIDTH #4
#SENSOR_DEFAULTS[x393_sensor.SENSOR_INTERFACE_LWIR]["height"]= vrlg.WOI_HEIGHT
#SENSOR_DEFAULTS[x393_sensor.SENSOR_INTERFACE_LWIR]["top"]= 0
#SENSOR_DEFAULTS[x393_sensor.SENSOR_INTERFACE_LWIR]["left"]= 0
# do not update LWIR defaults !!!
if
nomargins
:
SENSOR_DEFAULTS
[
x393_sensor
.
SENSOR_INTERFACE_PARALLEL
][
"width"
]
=
vrlg
.
WOI_WIDTH
+
0
# 4
...
...
@@ -526,6 +527,8 @@ class X393SensCmprs(object):
sensorType
=
self
.
x393Sensor
.
getSensorInterfaceType
()
if
verbose
>
0
:
print
(
"Sensor port
%
d interface type:
%
s"
%
(
num_sensor
,
sensorType
))
# print ("setup_sensor_channel(): window_width['width']=",window_width)
window
=
self
.
specify_window
(
window_width
=
window_width
,
window_height
=
window_height
,
window_left
=
window_left
,
...
...
@@ -604,7 +607,7 @@ class X393SensCmprs(object):
histogram_start_phys_page
=
self
.
get_histogram_byte_start
()
//
4096
if
verbose
>
0
:
print
(
"setup_sensor_channel
:"
)
print
(
"setup_sensor_channel
, type="
,
sensorType
)
print
(
"num_sensor = "
,
num_sensor
)
print
(
"frame_full_width = "
,
frame_full_width
)
print
(
"window_width = "
,
window_width
)
...
...
@@ -623,6 +626,7 @@ class X393SensCmprs(object):
print
(
"num_macro_cols_m1 = "
,
num_macro_cols_m1
)
print
(
"num_macro_rows_m1 = "
,
num_macro_rows_m1
)
print
(
"cmode = "
,
cmode
)
print
(
"bits16 = "
,
bits16
)
print
(
"verbose = "
,
verbose
)
if
exit_step
==
10
:
return
False
...
...
@@ -655,6 +659,10 @@ class X393SensCmprs(object):
else
:
# print ("===================== Mode is neither JP4 nor raw =========================")
print
(
"===================== Mode is not JP4 ========================="
)
if
(
bits16
):
num_burst_in_line
*=
2
if
verbose
>
0
:
print
(
"Doubling line width for 16-bit mode"
)
self
.
x393Sensor
.
setup_sensor_memory
(
num_sensor
=
num_sensor
,
# input [1:0] num_sensor;
...
...
@@ -679,7 +687,7 @@ class X393SensCmprs(object):
# replacing with setup compressor:
self
.
setup_compressor
(
chn
=
num_sensor
,
cmode
=
cmode
,
bit
16
=
bit
16
,
bit
s16
=
bits
16
,
qbank
=
0
,
dc_sub
=
True
,
multi_frame
=
True
,
...
...
@@ -720,7 +728,8 @@ class X393SensCmprs(object):
"""
if
verbose
>
0
:
print
(
"===================== IO_SETUP ========================="
)
print
(
"===================== IO_SETUP, sensorType="
,
sensorType
,
" ========================="
)
if
sensorType
==
x393_sensor
.
SENSOR_INTERFACE_PARALLEL
:
self
.
x393Sensor
.
set_sensor_io_width
(
num_sensor
=
num_sensor
,
# input [1:0] num_sensor;
width
=
0
)
# Or use 0 for sensor-generated HACT input [15:0] width; # 0 - use HACT, >0 - generate HACT from start to specified width
...
...
@@ -733,7 +742,7 @@ class X393SensCmprs(object):
clk_sel
=
None
,
#Dealing with Unisims bug: "Error: [Unisim MMCME2_ADV-4] Input clock can only be switched when..."
set_delays
=
False
,
quadrants
=
None
)
#Wait 200 us in real system
self
.
x393Sensor
.
set_sensor_io_ctl
(
num_sensor
=
num_sensor
,
mrst
=
False
,
...
...
@@ -751,6 +760,41 @@ class X393SensCmprs(object):
set_delays
=
False
,
quadrants
=
None
)
elif
sensorType
==
x393_sensor
.
SENSOR_INTERFACE_LWIR
:
self
.
x393Sensor
.
set_sensor_io_ctl_lwir
(
num_sensor
=
num_sensor
,
mrst
=
True
,
pwdn
=
False
,
mclk
=
True
,
# None,
spi_en
=
1
,
#None, # 1 - reset+disable, 2 - noreset, disable, 3 - noreset, enable
segm_zero
=
True
,
#None,
out_en
=
None
,
out_single
=
False
,
reset_crc
=
True
,
spi_clk
=
False
)
#None)
print
(
"self.DRY_MODE="
,
self
.
DRY_MODE
,
" resetting LWIR sensor"
)
if
self
.
DRY_MODE
:
self
.
x393Sensor
.
set_sensor_io_ctl_lwir
(
num_sensor
=
num_sensor
,
mrst
=
False
)
self
.
x393Sensor
.
set_sensor_io_ctl_lwir
(
num_sensor
=
num_sensor
,
spi_en
=
2
)
#None, # 1 - reset+disable, 2 - noreset, disable, 3 - noreset, enable
# self.x393Sensor.set_sensor_io_ctl_lwir (
# num_sensor = num_sensor,
# spi_en = 2) #None, # 1 - reset+disable, 2 - noreset, disable, 3 - noreset, enable
self
.
x393Sensor
.
set_sensor_io_ctl_lwir
(
num_sensor
=
num_sensor
,
spi_en
=
3
,
#None, # 1 - reset+disable, 2 - noreset, disable, 3 - noreset, enable
out_en
=
True
)
else
:
self
.
sleep_ms
(
0.2
)
# 1 ms. TODO: For real camera turn off all channels simultaneously ***
self
.
x393Sensor
.
set_sensor_io_ctl_lwir
(
num_sensor
=
num_sensor
,
mrst
=
False
,
spi_en
=
3
,
#None, # 1 - reset+disable, 2 - noreset, disable, 3 - noreset, enable
out_en
=
True
)
if
exit_step
==
17
:
return
False
"""
...
...
@@ -859,6 +903,8 @@ class X393SensCmprs(object):
verbose
=
1
):
global
GLBL_WINDOW
if
GLBL_WINDOW
is
None
:
GLBL_WINDOW
=
{}
...
...
@@ -870,6 +916,7 @@ class X393SensCmprs(object):
window_width
=
GLBL_WINDOW
[
"width"
]
except
:
window_width
=
SENSOR_DEFAULTS
[
sensorType
][
"width"
]
# print ("specify_window()1.: window_width['width']=",window_width) #256
if
window_height
is
None
:
try
:
window_height
=
GLBL_WINDOW
[
"height"
]
...
...
@@ -1110,7 +1157,7 @@ class X393SensCmprs(object):
def
setup_compressor
(
self
,
chn
,
cmode
=
0
,
# vrlg.CMPRS_CBIT_CMODE_JPEG18,
bit
16
=
bit16
,
bit
s16
=
0
,
bayer
=
0
,
qbank
=
0
,
dc_sub
=
1
,
...
...
@@ -1142,7 +1189,7 @@ class X393SensCmprs(object):
CMPRS_CBIT_CMODE_MONO1 = 11 - mono JPEG (not yet implemented)
CMPRS_CBIT_CMODE_MONO4 = 14 - mono 4 blocks
CMPRS_CBIT_CMODE_RAW = 15 - raw (uncompressed) mode
@param bit16 - 16-bit (2 bytes per pixel) mode
@param bit
s
16 - 16-bit (2 bytes per pixel) mode
@param qbank - quantization table page (0..15)
@param dc_sub - True - subtract DC before running DCT, False - no subtraction, convert as is,
@param multi_frame - False - single-frame buffer, True - multi-frame video memory buffer,
...
...
@@ -1167,7 +1214,7 @@ class X393SensCmprs(object):
self
.
setup_compressor
(
#self,
chn
=
chn
,
cmode
=
cmode
,
bit
16
=
bit
16
,
bit
s16
=
bits
16
,
qbank
=
qbank
,
dc_sub
=
dc_sub
,
multi_frame
=
multi_frame
,
...
...
@@ -1227,17 +1274,22 @@ class X393SensCmprs(object):
num_macro_cols_m1
=
(
window_width
>>
4
)
-
1
if
(
cmode
==
vrlg
.
CMPRS_CBIT_CMODE_RAW
)
and
(
bit16
):
if
(
cmode
==
vrlg
.
CMPRS_CBIT_CMODE_RAW
)
and
(
bit
s
16
):
num_macro_cols_m1
=
((
window_width
>>
4
)
<<
1
)
-
1
else
:
num_macro_cols_m1
=
(
window_width
>>
4
)
-
1
if
(
cmode
==
vrlg
.
CMPRS_CBIT_CMODE_RAW
):
num_macro_rows_m1
=
(
window_height
>>
4
)
-
1
num_macro_rows_m1
=
(
window_height
-
1
)
>>
4
cmprs_mem_height
=
window_height
if
(
verbose
>
0
)
:
print
(
"num_macro_rows_m1 = "
,
num_macro_rows_m1
,
" (raw mode, cmode="
,
cmode
,
")"
)
else
:
num_macro_rows_m1
=
(
window_height
-
1
)
>>
4
num_macro_rows_m1
=
(
window_height
>>
4
)
-
1
cmprs_mem_height
=
window_height
&
0xfff0
if
(
verbose
>
0
)
:
print
(
"num_macro_rows_m1 = "
,
num_macro_rows_m1
,
" (not raw mode, cmode="
,
cmode
,
")"
)
frame_start_address
=
(
last_buf_frame
+
1
)
*
frame_start_address_inc
*
num_sensor
...
...
@@ -1246,7 +1298,7 @@ class X393SensCmprs(object):
qbank
=
qbank
,
dc_sub
=
dc_sub
,
cmode
=
cmode
,
# vrlg.CMPRS_CBIT_CMODE_JPEG18,
bit
16
=
bit
16
,
bit
s16
=
bits
16
,
multi_frame
=
True
,
bayer
=
bayer
,
focus_mode
=
focus_mode
,
...
...
@@ -1275,6 +1327,11 @@ class X393SensCmprs(object):
left_tiles32
=
window_left
//
32
last_tile32
=
(
window_left
+
((
num_macro_cols_m1
+
1
)
*
16
)
+
tile_margin
-
1
)
//
32
width32
=
last_tile32
-
left_tiles32
+
1
# number of 32-wide tiles needed in each row
# Already done
# if (bits16):
# width32 *= 2
# if verbose >0 :
# print ("Doubling line width for 16-bit mode")
if
(
verbose
>
0
)
:
print
(
"setup_compressor_memory:"
)
...
...
@@ -1452,6 +1509,8 @@ class X393SensCmprs(object):
sensorType
=
self
.
x393Sensor
.
getSensorInterfaceType
()
if
verbose
>
0
:
print
(
"Sensor interface type:
%
s"
%
(
sensorType
))
# print ("setup_all_sensors(): window_width['width']=",window_width) # None here
window
=
self
.
specify_window
(
window_width
=
window_width
,
window_height
=
window_height
,
window_left
=
window_left
,
...
...
@@ -1482,8 +1541,10 @@ class X393SensCmprs(object):
histogram_width_m1
=
window_width
-
1
# 33
if
histogram_height_m1
is
None
:
histogram_height_m1
=
window_height
-
1
# 1145
# print ("setup_all_sensors().2: window_width['width']=",window_width) #256 here
self
.
specify_phys_memory
(
circbuf_chn_size
=
circbuf_chn_size
)
# print ("setup_all_sensors().3: window_width['width']=",window_width)
"""
self.specify_window (window_width = window_width,
window_height = window_height,
...
...
@@ -1528,6 +1589,7 @@ class X393SensCmprs(object):
print
(
"membridge d2h size =
%
d bytes"
%
(
GLBL_MEMBRIDGE_D2H_END
-
GLBL_MEMBRIDGE_D2H_START
))
print
(
"memory buffer end = 0x
%
x"
%
(
GLBL_BUFFER_END
))
self
.
program_status_debug
(
3
,
0
)
if
setup_membridge
:
self
.
setup_membridge_sensor
(
...
...
@@ -2502,7 +2564,7 @@ jpeg_write "img.jpeg" 0 100 None False 0 "/www/pages/" 3
y_quality
=
None
,
c_quality
=
None
,
# use "same" to save None
cmode
=
0
,
# vrlg.CMPRS_CBIT_CMODE_JPEG18,
bit16
=
0
,
bit
s
16
=
0
,
bayer
=
3
,
#0, as in simulator
window_width
=
66
,
window_height
=
36
,
...
...
@@ -2534,7 +2596,7 @@ jpeg_write "img.jpeg" 0 100 None False 0 "/www/pages/" 3
CMPRS_CBIT_CMODE_MONO1 = 11 - mono JPEG (not yet implemented)
CMPRS_CBIT_CMODE_MONO4 = 14 - mono 4 blocks
CMPRS_CBIT_CMODE_RAW = 15 - raw (unclmpressed) mode
@param bit16 - 16 bit (2-byte per pixel) mode
@param bit
s
16 - 16 bit (2-byte per pixel) mode
@param bayer - Bayer shift (0..3)
@param window_width - window width in pixels (bytes) (TODO: add 16-bit mode)
@param window_height - window height in lines
...
...
@@ -2633,7 +2695,7 @@ jpeg_write "img.jpeg" 0 100 None False 0 "/www/pages/" 3
# setup compressor memory and mode
self
.
setup_compressor
(
chn
=
chn
,
cmode
=
cmode
,
bit
16
=
bit
16
,
bit
s16
=
bits
16
,
qbank
=
qbank
,
dc_sub
=
True
,
multi_frame
=
False
,
...
...
py393/x393_sensor.py
View file @
f35c087d
...
...
@@ -505,7 +505,7 @@ class X393Sensor(object):
rslt
|=
1
<<
vrlg
.
VOSPI_OUT_EN_SINGL
if
reset_crc
:
rslt
|=
1
<<
vrlg
.
VOSPI_RESET_CRC
if
not
out_en
is
None
:
if
not
spi_clk
is
None
:
rslt
|=
(
2
,
3
)[
spi_clk
]
<<
vrlg
.
VOSPI_SPI_CLK
if
not
gpio0
is
None
:
rslt
|=
(
gpio0
&
3
)
<<
(
vrlg
.
VOSPI_GPIO
+
0
)
...
...
@@ -1042,6 +1042,7 @@ class X393Sensor(object):
# TODO: Make one for HiSPi (it is different)
def
set_sensor_io_ctl_lwir
(
self
,
num_sensor
,
mrst
=
None
,
pwdn
=
None
,
mclk
=
None
,
...
...
sensor/sens_lepton3.v
View file @
f35c087d
...
...
@@ -259,7 +259,7 @@ module sens_lepton3 #(
assign
fake_out
=
set_ctrl_r
&&
data_r
[
VOSPI_FAKE_OUT
]
;
assign
spi_mosi_int
=
set_ctrl_r
&&
data_r
[
VOSPI_MOSI
]
;
// not used
assign
prsts
=
prst
|
lwir_mrst_pclk
[
1
]
;
assign
prsts
=
prst
|
!
lwir_mrst_pclk
[
1
]
;
always
@
(
posedge
mclk
)
begin
if
(
mrst
)
data_r
<=
0
;
...
...
@@ -346,6 +346,10 @@ module sens_lepton3 #(
// implement I/O ports, including fake ones, to be able to assign them I/O pads
// generate clocka to sesnor output, controlled by control word bits
// SPI clock (10..20MHz)
reg
prst_r
;
always
@
(
posedge
pclk
)
begin
prst_r
<=
prst
;
end
oddr_ss
#(
// spi_clk
.
IOSTANDARD
(
PXD_IOSTANDARD
)
,
.
SLEW
(
PXD_SLEW
)
,
...
...
@@ -354,7 +358,7 @@ module sens_lepton3 #(
.
SRTYPE
(
"SYNC"
)
)
spi_clk_i
(
.
clk
(
pclk
)
,
// input
.
ce
(
spi_clk_en_pclk
[
1
]
|
spi_clken
)
,
// input
.
ce
(
spi_clk_en_pclk
[
1
]
|
spi_clken
|
prst_r
)
,
// input
.
rst
(
prst
)
,
// input
.
set
(
1'b0
)
,
// input
.
din
(
2'b01
)
,
// input[1:0]
...
...
@@ -430,7 +434,7 @@ module sens_lepton3 #(
generate
// gpio[3:0]
genvar
i
;
for
(
i
=
0
;
i
<
(
VOSPI_GPIO_BITS
/
2
)
;
i
=
i
+
1
)
begin
:
gpio_block
gpio_bit
gpio_bit_i
(
gpio
393
_bit
gpio_bit_i
(
.
clk
(
mclk
)
,
// input
.
srst
(
mrst
)
,
// input
.
we
(
set_ctrl_r
)
,
// input
...
...
sensor/sensor_channel.v
View file @
f35c087d
...
...
@@ -362,8 +362,8 @@ module sensor_channel#(
input
sns_clkp
,
input
sns_clkn
,
`elsif
LWIR
in
p
ut
[
4
:
0
]
sns_dp40
,
in
p
ut
[
4
:
0
]
sns_dn40
,
in
o
ut
[
4
:
0
]
sns_dp40
,
in
o
ut
[
4
:
0
]
sns_dn40
,
inout
sns_dp5
,
// diff MIPI signals (not yet implemented)
inout
sns_dn5
,
// diff MIPI signals (not yet implemented)
inout
[
7
:
6
]
sns_dp76
,
...
...
@@ -1069,12 +1069,12 @@ module sensor_channel#(
// .sns_mclk(), // input
.
spi_miso
(
sns_dp40
[
0
])
,
// inout
.
spi_mosi
(
sns_dn40
[
0
])
,
// inout
.
spi_cs
(
sns_dp40
[
1
])
,
//
ino
ut
.
spi_clk
(
sns_dn40
[
1
])
,
//
ino
ut
.
spi_cs
(
sns_dp40
[
1
])
,
//
outp
ut
.
spi_clk
(
sns_dn40
[
1
])
,
//
outp
ut
.
gpio
(
{
sns_dp40
[
4
]
,
sns_dn40
[
4
]
,
sns_dp40
[
3
]
,
sns_dn40
[
3
]
}
)
,
// inout [3:0]
.
lwir_mclk
(
sns_dp76
[
6
])
,
//
ino
ut
.
lwir_mrst
(
sns_dp76
[
7
])
,
//
ino
ut
.
lwir_pwdn
(
sns_dn76
[
7
])
,
//
ino
ut
.
lwir_mclk
(
sns_dp76
[
6
])
,
//
outp
ut
.
lwir_mrst
(
sns_dp76
[
7
])
,
//
outp
ut
.
lwir_pwdn
(
sns_dn76
[
7
])
,
//
outp
ut
.
mipi_dp
(
sns_dp5
)
,
// inout
.
mipi_dn
(
sns_dn5
)
,
// inout
.
mipi_clkp
(
sns_clkp
)
,
// inout
...
...
sensor/sensors393.v
View file @
f35c087d
...
...
@@ -398,8 +398,8 @@ module sensors393 #(
input
[
3
:
0
]
sns_clkp
,
// SuppressThisWarning all - input-only in HiSPi mode
input
[
3
:
0
]
sns_clkn
,
// SuppressThisWarning all - input-only in HiSPi mode
`elsif
LWIR
in
p
ut
[
19
:
0
]
sns_dp40
,
in
p
ut
[
19
:
0
]
sns_dn40
,
in
o
ut
[
19
:
0
]
sns_dp40
,
in
o
ut
[
19
:
0
]
sns_dn40
,
inout
[
3
:
0
]
sns_dp5
,
// diff MIPI signals (not yet implemented)
inout
[
3
:
0
]
sns_dn5
,
// diff MIPI signals (not yet implemented)
inout
[
7
:
0
]
sns_dp76
,
...
...
sensor/vospi_packet_80.v
View file @
f35c087d
...
...
@@ -71,6 +71,7 @@ module vospi_packet_80#(
reg
set_crc_r
;
reg
set_d_r
;
reg
den_r
;
reg
[
1
:
0
]
packet_header
=
2'b11
;
reg
[
15
:
0
]
d_sr
;
reg
[
1
:
0
]
start_r
;
...
...
@@ -88,7 +89,9 @@ module vospi_packet_80#(
assign
pre_last_w
=
pre_lsb_w
&&
(
wcntr
==
(
VOSPI_PACKET_WORDS
+
1
))
;
assign
packet_done
=
packet_end
[
2
]
;
assign
id
=
id_r
;
assign
dmask
=
den_r
?
16'hffff
:
(
wcntr
[
0
]
?
16'h0
:
16'h0fff
)
;
// assign dmask = den_r ? 16'hffff: (wcntr[0]?16'h0: 16'h0fff);
assign
dmask
=
packet_header
[
1
]
?
(
packet_header
[
0
]
?
16'h0fff
:
16'h0
)
:
16'hffff
;
assign
crc_err
=
packet_end
[
2
]
&&
(
crc_r
!=
crc_w
)
;
assign
dv
=
dv_r
;
assign
dout
=
d_r
;
...
...
@@ -96,7 +99,7 @@ module vospi_packet_80#(
always
@
(
posedge
clk
)
begin
if
(
rst
||
packet_end
[
0
])
cs_r
[
0
]
<=
0
;
else
if
(
start
)
cs_r
[
1
]
<=
1
;
else
if
(
start
)
cs_r
[
0
]
<=
1
;
cs_r
[
1
]
<=
cs_r
[
0
]
;
...
...
@@ -111,8 +114,11 @@ module vospi_packet_80#(
if
(
rst
||
!
cs_r
[
0
]
||
packet_end
[
0
])
wcntr
<=
0
;
else
if
(
lsb_r
)
wcntr
<=
wcntr
+
1
;
if
(
rst
||
!
cs_r
[
0
]
)
packet_end
<=
0
;
else
packet_end
<=
{
packet_end
[
1
:
0
]
,
pre_last_w
};
if
(
rst
||
!
cs_r
[
0
]
)
packet_end
[
1
:
0
]
<=
0
;
else
packet_end
[
1
:
0
]
<=
{
packet_end
[
0
]
,
pre_last_w
};
if
(
rst
)
packet_end
[
2
]
<=
0
;
else
packet_end
[
2
]
<=
packet_end
[
1
]
;
if
(
rst
)
start_r
<=
0
;
else
start_r
<=
{
start_r
[
0
]
,
start
};
...
...
@@ -121,10 +127,11 @@ module vospi_packet_80#(
set_crc_r
<=
!
rst
&&
(
wcntr
==
1
)
&&
lsb_r
;
set_d_r
<=
!
rst
&&
den_r
&&
lsb_r
;
if
(
rst
||
!
cs_r
[
1
])
den_r
<=
0
;
if
(
rst
||
!
cs_r
[
1
]
||
packet_done
)
den_r
<=
0
;
else
if
(
set_crc_r
)
den_r
<=
1
;
if
(
cs_r
[
0
])
d_sr
<=
{
miso
,
d_sr
[
15
:
1
]
};
// if (cs_r[0]) d_sr <= {miso, d_sr[15:1]};
if
(
cs_r
[
0
])
d_sr
<=
{
d_sr
[
14
:
0
]
,
miso
};
if
(
set_id_r
)
id_r
<=
d_sr
;
if
(
set_crc_r
)
crc_r
<=
d_sr
;
if
(
set_d_r
)
d_r
<=
d_sr
;
...
...
@@ -135,6 +142,9 @@ module vospi_packet_80#(
else
if
(
set_id_r
)
packet_invalid_r
<=
(
d_sr
[
11
:
8
]
==
4'hf
)
;
id_stb
<=
set_id_r
;
if
(
rst
||
start
||
packet_done
)
packet_header
<=
2'b11
;
else
if
(
copy_word
)
packet_header
<=
{
packet_header
[
0
]
,
1'b0
};
end
crc16_x16x12x5x0
crc16_x16x12x5x0_i
(
...
...
sensor/vospi_segment_61.v
View file @
f35c087d
...
...
@@ -101,6 +101,8 @@ module vospi_segment_61#(
wire
packet_dv
;
// read full packet
wire
[
15
:
0
]
packet_dout
;
// read full packet
wire
[
15
:
0
]
packet_id
;
wire
[
3
:
0
]
segment_id
;
wire
packet_invalid
;
wire
id_stb
;
wire
is_first_segment_w
;
wire
is_last_segment_w
;
...
...
@@ -119,7 +121,9 @@ module vospi_segment_61#(
assign
is_first_segment_w
=
(
exp_segment
==
VOSPI_SEGMENT_FIRST
)
;
assign
is_last_segment_w
=
(
exp_segment
==
VOSPI_SEGMENT_LAST
)
;
assign
segment_good_w
=
(
packet_id
[
15
:
12
]
==
exp_segment
)
||
((
packet_id
[
15
:
12
]
==
0
)
&&
segm0_ok
)
;
assign
segment_id
=
packet_id
[
15
:
12
]
;
// assign segment_good_w = (packet_id[15:12] == exp_segment) || ((packet_id[15:12] == 0) && segm0_ok);
assign
segment_good_w
=
(
segment_id
==
exp_segment
)
||
((
packet_id
[
15
:
12
]
==
0
)
&&
segm0_ok
)
;
assign
segment_stb
=
id_stb
&&
(
packet_id
[
11
:
0
]
==
VOSPI_PACKET_TTT
)
;
assign
we
=
segment_running
&&
!
discard_segment_r
&&
packet_dv
;
assign
crc_err
=
packet_done
&&
packet_crc_err
;
// crc_err_r;
...
...
@@ -162,7 +166,7 @@ module vospi_segment_61#(
if
(
rst
||
(
start
&&
is_first_segment_w
))
full_packet
<=
0
;
else
if
(
discard_set
)
full_packet
<=
segment_start_packet
;
else
if
(
!
discard_segment_r
&&
packet_done
)
full_packet
<=
full_packet
+
1
;
else
if
(
!
discard_segment_r
&&
!
packet_invalid
&&
packet_done
)
full_packet
<=
full_packet
+
1
;
// if (rst || start) crc_err_r <= 0;
// else if (packet_done && packet_crc_err) crc_err_r <= 0;
...
...
@@ -176,7 +180,8 @@ module vospi_segment_61#(
if
(
!
segment_busy_r
||
start
)
segment_running
<=
0
;
else
if
(
id_stb
&&
(
packet_id
[
11
:
0
]
==
VOSPI_PACKET_FIRST
))
segment_running
<=
1
;
packet_start
<=
!
rst
&&
!
packet_busy
&&
segment_busy_r
;
// packet_start <= !rst && !packet_busy && segment_busy_r;
packet_start
<=
!
rst
&&
!
packet_busy
&&
segment_busy_r
&&
!
packet_start
;
if
(
rst
)
waddr
<=
0
;
else
if
(
discard_set
)
waddr
<=
segment_start_waddr
;
...
...
@@ -201,7 +206,11 @@ module vospi_segment_61#(
wire
frame_dav
;
wire
hact_start_w
;
// (hact will start next cycle
wire
hact_end_w
;
`ifdef
SIMULATION
reg
[
15
:
0
]
duration_cntr
;
`else
reg
[
7
:
0
]
duration_cntr
;
`endif
reg
[
2
:
0
]
hact_r
;
reg
pend_eof_r
;
reg
[
10
:
0
]
raddr
;
...
...
@@ -211,13 +220,13 @@ module vospi_segment_61#(
assign
start_out_frame_w
=
segment_good
&&
is_first_segment_w
&&
out_request
;
assign
packets_avail
=
{
1'b0
,
full_packet_verified
}
-
{
1'b0
,
full_packet_out
}
-
VOSPI_PACKETS_PER_LINE
;
// assign frame_out_done_w = packet_out_done && (full_packet_out == (VOSPI_PACKETS_FRAME - 1));
assign
frame_out_done_w
=
hact_end_w
&&
(
full_packet_out
==
(
VOSPI_PACKETS_FRAME
-
1
))
;
assign
frame_out_done_w
=
hact_end_w
&&
(
full_packet_out
==
(
VOSPI_PACKETS_FRAME
-
VOSPI_PACKETS_PER_LINE
))
;
assign
frame_dav
=
!
packets_avail
[
8
]
||
out_pending
;
assign
hact_start_w
=
out_frame
&&
(
duration_cntr
==
0
)
&&
!
hact_r
[
0
]
&&
frame_dav
;
assign
hact_end_w
=
(
duration_cntr
==
0
)
&&
hact_r
[
0
]
;
assign
eof_w
=
out_frame
&&
(
duration_cntr
==
0
)
&&
pend_eof_r
;
assign
sof_w
=
rst
&&
start_out_frame_w
;
assign
sof_w
=
!
rst
&&
start_out_frame_w
;
assign
hact
=
hact_r
[
2
]
;
assign
eof
=
eof_r
[
2
]
;
assign
sof
=
sof_r
;
...
...
@@ -249,7 +258,8 @@ module vospi_segment_61#(
if
(
rst
)
pend_eof_r
<=
0
;
// not needed?
else
if
(
frame_out_done_w
)
pend_eof_r
<=
1
;
else
if
(
eof_r
[
0
])
pend_eof_r
<=
0
;
// else if (eof_r[0]) pend_eof_r <= 0;
else
if
(
eof_w
)
pend_eof_r
<=
0
;
if
(
rst
)
duration_cntr
<=
0
;
else
if
(
start_out_frame_w
)
duration_cntr
<=
VOSPI_SOF_TO_HACT
;
...
...
@@ -278,7 +288,7 @@ module vospi_segment_61#(
.
packet_busy
(
packet_busy
)
,
// output
.
crc_err
(
packet_crc_err
)
,
// output
.
id
(
packet_id
)
,
// output[15:0]
.
packet_invalid
(
)
,
// output - not used, processed internally, no dv generated
.
packet_invalid
(
packet_invalid
)
,
// output - not used, processed internally, no dv generated
.
id_stb
(
id_stb
)
// output reg
)
;
...
...
simulation_modules/simul_lwir160x120_vospi.v
View file @
f35c087d
...
...
@@ -46,7 +46,7 @@ module simul_lwir160x120_vospi # (
parameter
TELEMETRY
=
1
,
// 0 - disabled, 1 - as header, 2 - as footer
parameter
FRAME_PERIOD
=
946969
,
// 26.4 fps @25 MHz
parameter
SEGMENT_PERIOD
=
10000
,
// 236742, // 26.4 fps @25 MHz
parameter
SEGMENT_PERIOD
=
5100
,
// min 05063? //
10000, // 236742, // 26.4 fps @25 MHz
parameter
SEGMENTS_SEQ
=
8
,
// 12 With ITAR
parameter
FRAME_DELAY
=
100
,
// mclk period to start first frame 1
...
...
@@ -115,7 +115,7 @@ module simul_lwir160x120_vospi # (
// registers for copiing data to packet array
//'0xe7319'
reg
[
19
:
0
]
frame_dly_cntr
;
// delay till next frame start
//
reg [19:0] frame_dly_cntr; // delay till next frame start
reg
[
19
:
0
]
segment_dly_cntr
;
// delay till next frame segment
reg
frame_start
;
reg
segment_start
;
...
...
@@ -123,8 +123,9 @@ module simul_lwir160x120_vospi # (
wire
[
3
:
0
]
segment_id
;
reg
copy_page
;
reg
copy_run
;
wire
copy_done
;
// reg copy_run;
// wire copy_done;
wire
frame_done
;
reg
segment_run
;
wire
segment_done
;
...
...
@@ -134,6 +135,7 @@ module simul_lwir160x120_vospi # (
reg
[
6
:
0
]
copy_word
;
// word number to copy in a packet (0..82), last one copies CRC to word 1
reg
copy_crc
;
wire
copy_crc_w
;
wire
[
7
:
0
]
copy_packet_full
;
wire
[
7
:
0
]
copy_telemetry_packet
;
// only 2 LSB
// wire [7:0] copy_packet_segment;
...
...
@@ -172,9 +174,11 @@ module simul_lwir160x120_vospi # (
reg
[
6
:
0
]
readout_word_indx
;
// number of word in a readout packet
reg
[
3
:
0
]
readout_bit
;
// 0 - msb, 15 - lsb
reg
[
15
:
0
]
readout_sr_good
;
reg
[
15
:
0
]
readout_sr_good_dbg
;
// no shift, just memory read
reg
[
15
:
0
]
readout_sr_bad
;
reg
[
3
:
0
]
segments_ready
;
reg
segment_av
;
// segments avalable for readout
reg
segment_av_mclk
;
// segments avalable for readout
// reg segment_av; // segments avalable for readout
reg
sync_lost
;
reg
packet_sent
;
// reg packet_skipped; // sent invalid packet
...
...
@@ -188,25 +192,29 @@ module simul_lwir160x120_vospi # (
reg
readout_last_bit
;
reg
readout_first_bit
=
1
;
wire
[
15
:
0
]
readout_address
;
// buffer readout address
wire
readout_good_w
;
// should be valid at first negative transition of the spi_clk
//
wire readout_good_w ; // should be valid at first negative transition of the spi_clk
reg
readout_good
;
// reading out/sending valid packet
wire
readout_segment_done_w
;
reg
readout_segment_done
;
assign
readout_last_segment
=
readout_segment
==
(
FRAME_SEGMENTS
-
1
)
;
assign
readout_last_packet
=
readout_packet
==
(
SEGMENT_PACKETS_TELEMETRY
-
1
)
;
assign
readout_last_word
=
readout_word_indx
==
(
PACKET_WORDS
-
1
)
;
assign
readout_pre_last_bit
=
readout_bit
[
3
:
0
]
==
14
;
assign
readout_pre_first_bit
=
readout_bit
[
3
:
0
]
==
15
;
// assign readout_segment_done_w = readout_last_packet && readout_last_word && readout_pre_last_bit;
assign
readout_segment_done_w
=
readout_last_packet
&&
readout_last_word
&&
readout_last_bit
;
assign
readout_address
=
readout_word_indx
+
(
PACKET_WORDS
*
readout_packet
)
+
(
SEGMENT_WORDS
*
readout_segment
)
+
(
FRAME_WORDS
*
readout_page
)
;
assign
readout_good_w
=
segment_av
;
// assign readout_good_w = segment_av_mclk
;
assign
spi_miso
=
readout_good
?
readout_sr_good
[
15
]
:
readout_sr_bad
[
15
]
;
assign
start_segm_rd
=
(
readout_word_indx
==
0
)
&&
readout_last_bit
&&
!
spi_cs
;
// assign start_segm_rd = (readout_word_indx == 0) && readout_last_bit && !spi_cs;
assign
start_segm_rd
=
readout_last_bit
&&
(
readout_word_indx
==
0
)
&&
readout_last_packet
&&
!
spi_cs
&&
readout_good
;
// wire [ 2:0] copy_segment;
...
...
@@ -223,14 +231,21 @@ module simul_lwir160x120_vospi # (
assign
i2c_sda
=
'bz
;
assign
copy_done
=
copy_run
&&
copy_crc
&&
(
copy_packet
==
(
FRAME_PACKETS_FULL
-
1
))
;
assign
segment_done
=
copy_run
&&
copy_crc
&&
(
segment_packet
==
(
SEGMENT_PACKETS_FULL
-
1
))
;
// assign copy_done = copy_run && copy_crc && (copy_packet== (FRAME_PACKETS_FULL -1));
// assign segment_done = copy_run && copy_crc && (segment_packet== (SEGMENT_PACKETS_FULL -1));
// assign copy_done = segment_run && copy_crc && (copy_packet== (FRAME_PACKETS_FULL -1));
assign
frame_done
=
segment_run
&&
copy_crc
&&
(
copy_packet
==
(
FRAME_PACKETS_FULL
-
1
))
;
assign
segment_done
=
segment_run
&&
copy_crc
&&
(
segment_packet
==
(
SEGMENT_PACKETS_FULL
-
1
))
;
assign
segment_id
=
(
segments_cntr
<
4
)
?
(
segments_cntr
+
1
)
:
4'b0
;
assign
copy_packet_full
=
(
copy_packet
<
FRAME_PACKETS
)
?
(
copy_packet
+
((
TELEMETRY
==
1
)
?
4
:
0
))
:
(
copy_packet
-
((
TELEMETRY
==
1
)
?
FRAME_PACKETS
:
0
))
;
assign
copy_telemetry_packet
=
copy_packet
-
FRAME_PACKETS
;
assign
copy_pix_or_tel
=
copy_run
&&
(
copy_word
<
PACKET_PIXELS
)
;
// && (copy_packet < FRAME_PACKETS);
// assign copy_pix_or_tel = copy_run && (copy_word < PACKET_PIXELS); // && (copy_packet < FRAME_PACKETS);
assign
copy_pix_or_tel
=
segment_run
&&
(
copy_word
<
PACKET_PIXELS
)
;
// && (copy_packet < FRAME_PACKETS);
assign
copy_pix_only
=
copy_pix_or_tel
&&
(
copy_packet
<
FRAME_PACKETS
)
;
assign
copy_tel_only
=
copy_pix_or_tel
&&
(
copy_packet
>=
FRAME_PACKETS
)
;
// assign copy_packet_segment = copy_packet_full / SEGMENT_PACKETS_TELEMETRY; ///
...
...
@@ -248,6 +263,8 @@ module simul_lwir160x120_vospi # (
assign
copy_wa_full
=
copy_wa
+
(
PACKET_WORDS
*
copy_packet_full
)
+
(
FRAME_WORDS
*
copy_page
)
;
assign
copy_crc_w
=
copy_word
==
(
PACKET_WORDS
-
1
)
;
assign
frame_average32
=
(
frame_sum
/
(
WINDOW_WIDTH
*
WINDOW_HEIGHT
))
;
assign
frame_average
=
frame_average32
[
15
:
0
]
;
...
...
@@ -262,11 +279,12 @@ initial begin
// $readmemh({`ROOTPATH,"/input_data/sensor_16.dat"},sensor_data);
$
readmemh
(
DATA_FILE
,
sensor_data
,
0
)
;
// reg [OUT_BITS-1:0] packet_bad [0: PACKET_WORDS-1];
packet_bad
[
0
]
<
=
'h0f00
;
packet_bad
[
1
]
<=
'h000
0
;
// calculate and put crc?
packet_bad
[
0
]
=
'h0f00
;
packet_bad
[
1
]
=
'h522
0
;
// calculate and put crc?
for
(
i
=
2
;
i
<
PACKET_WORDS
;
i
=
i
+
1
)
begin
packet_bad
[
i
]
<
=
0
;
packet_bad
[
i
]
=
0
;
end
packet_bad
[
1
]
=
'h5220
;
// calculate and put crc?
end
always
@
(
posedge
mclk
)
begin
if
(
rst
||
(
ms_cntr
==
0
))
ms_cntr
<=
MS_PERIOD
-
1
;
...
...
@@ -279,6 +297,7 @@ always @ (posedge mclk) begin
if
(
rst
)
segment_dly_cntr
<=
FRAME_DELAY
;
else
if
(
segment_start
)
segment_dly_cntr
<=
SEGMENT_PERIOD
;
else
segment_dly_cntr
<=
segment_dly_cntr
-
1
;
segment_start
<=
!
rst
&&
(
segment_dly_cntr
==
0
)
;
if
(
rst
||
segment_done
)
segment_run
<=
0
;
...
...
@@ -286,28 +305,40 @@ always @ (posedge mclk) begin
if
(
rst
)
frame_dly_cntr
<=
FRAME_DELAY
;
else
if
(
frame_start
)
frame_dly_cntr
<=
FRAME_PERIOD
;
else
frame_dly_cntr
<=
frame_dly_cntr
-
1
;
//
if (rst) frame_dly_cntr <= FRAME_DELAY;
//
else if (frame_start) frame_dly_cntr <= FRAME_PERIOD;
//
else frame_dly_cntr <= frame_dly_cntr - 1;
frame_start
<=
!
rst
&&
(
frame_dly_cntr
==
0
)
;
// frame_start <= !rst && (frame_dly_cntr == 0);
frame_start
<=
!
rst
&&
(
segment_dly_cntr
==
0
)
&&
(
segments_cntr
[
1
:
0
]
==
0
)
;
if
(
rst
)
frame_num
<=
0
;
else
if
(
frame_start
)
frame_num
<=
frame_num
+
1
;
if
(
rst
)
copy_page
<=
0
;
else
if
(
frame_start
)
copy_page
<=
!
copy_page
;
// else if (frame_start) copy_page <= !copy_page;
else
if
(
frame_done
)
copy_page
<=
!
copy_page
;
if
(
rst
||
copy_done
)
copy_run
<=
0
;
else
if
(
frame_start
)
copy_run
<=
1
;
// remove copy_run completely?
// if (rst || copy_done) copy_run <= 0;
// if (rst || frame_done) copy_run <= 0;
// else if (frame_start) copy_run <= 1;
copy_crc
<=
copy_word
==
(
PACKET_WORDS
-
1
)
;
if
(
!
copy_run
||
copy_crc
)
copy_word
<=
0
;
// if (!copy_run || copy_crc) copy_word <= 0;
if
(
!
segment_run
||
copy_crc
)
copy_word
<=
0
;
else
copy_word
<=
copy_word
+
1
;
if
(
!
copy_run
)
copy_packet
<=
0
;
else
if
(
copy_crc
)
copy_packet
<=
copy_packet
+
1
;
// if (!copy_run) copy_packet <= 0;
// else if (copy_crc) copy_packet <= copy_packet + 1;
// else if (copy_crc && segment_run) copy_packet <= copy_packet + 1;
if
(
rst
||
frame_done
)
copy_packet
<=
0
;
else
if
(
copy_crc
&&
segment_run
)
copy_packet
<=
copy_packet
+
1
;
// if (rst || frame_start) segment_packet <= 0;
// else if (copy_run && copy_crc) segment_packet <= (copy_packet== (FRAME_PACKETS_FULL -1))? 0: (segment_packet + 1);
...
...
@@ -315,6 +346,9 @@ always @ (posedge mclk) begin
if
(
rst
||
segment_start
)
segment_packet
<=
0
;
else
if
(
segment_run
&&
copy_crc
)
segment_packet
<=
segment_packet
+
1
;
// if (copy_run) packed_data[copy_wa_full] <= copy_din; // copy_d;
if
(
segment_run
)
packed_data
[
copy_wa_full
]
<=
copy_din
;
// copy_d;
if
(
rst
)
segments_cntr
<=
0
;
else
if
(
segment_done
)
segments_cntr
<=
(
segments_cntr
==
(
SEGMENTS_SEQ
-
1
))
?
0
:
(
segments_cntr
+
1
)
;
...
...
@@ -333,11 +367,12 @@ always @ (posedge mclk) begin
copy_pixels_pix
<=
copy_pix_or_tel
&&
(
copy_packet
<
FRAME_PACKETS
)
;
if
(
frame_start
)
frame_sum
<=
0
;
else
if
(
copy_pixels_pix
)
frame_sum
<=
frame_sum
+
copy_pxd
;
if
(
copy_run
)
packed_data
[
copy_wa_full
]
<=
copy_din
;
// copy_d;
en_avg
<=
copy_crc
&&
(
copy_packet
==
(
FRAME_PACKETS
-
1
))
;
// 1 cycle after last pixel written
// en_avg <= copy_crc && (copy_packet == (FRAME_PACKETS - 1)); // 1 cycle after last pixel written
en_avg
<=
copy_crc_w
&&
(
copy_packet
==
(
FRAME_PACKETS
-
1
))
;
// 1 cycle after last pixel written
end
// readout, mclk part
...
...
@@ -346,7 +381,9 @@ always @ (posedge mclk) begin
else
if
(
segment_done
&&
!
start_segm_rd_mclk
)
segments_ready
<=
segments_ready
+
1
;
else
if
(
!
segment_done
&&
start_segm_rd_mclk
)
segments_ready
<=
segments_ready
-
1
;
segment_av
<=
!
rst
&&
!
sync_lost
&&
(
segments_ready
>=
SEGMENTS_MIN
)
;
segment_av_mclk
<=
!
rst
&&
!
sync_lost
&&
(
segments_ready
>=
SEGMENTS_MIN
)
;
if
(
rst
)
sync_lost
<=
0
;
else
if
(
segments_ready
>=
SEGMENTS_MAX
)
sync_lost
<=
1
;
end
...
...
@@ -363,8 +400,6 @@ always @ (posedge rst or negedge spi_clk) begin
if
(
rst
)
readout_first_bit
<=
1
;
else
if
(
!
spi_cs
)
readout_first_bit
<=
readout_pre_first_bit
;
if
(
rst
)
readout_good
<=
0
;
else
if
(
!
spi_cs
&&
readout_first_bit
&&
(
readout_word_indx
==
0
))
readout_good
<=
readout_good_w
;
if
(
!
spi_cs
)
begin
if
(
readout_first_bit
)
begin
...
...
@@ -374,6 +409,7 @@ always @ (posedge rst or negedge spi_clk) begin
readout_sr_good
<=
{
readout_sr_good
[
14
:
0
]
,
1'b0
};
readout_sr_bad
<=
{
readout_sr_bad
[
14
:
0
]
,
1'b0
};
end
if
(
readout_first_bit
)
readout_sr_good_dbg
<=
packed_data
[
readout_address
]
;
end
if
(
rst
)
readout_word_indx
<=
0
;
...
...
@@ -398,13 +434,24 @@ always @ (posedge rst or negedge spi_clk) begin
if
(
rst
)
readout_page
<=
0
;
else
if
(
!
spi_cs
&&
packet_sent
&&
readout_last_packet
&&
readout_last_segment
)
readout_page
<=
!
readout_page
;
if
(
rst
)
readout_good
<=
0
;
else
if
(
!
spi_cs
&&
readout_first_bit
&&
(
readout_word_indx
==
0
))
readout_good
<=
segment_av_mclk
||
readout_good
;
// WRONG!
// else if (segment_done) readout_good <= 0;
else
if
(
!
spi_cs
&&
readout_segment_done
)
readout_good
<=
0
;
if
(
!
spi_cs
)
readout_segment_done
<=
readout_segment_done_w
;
//segment_av_mclk
end
crc16_x16x12x5x0
crc16_x16x12x5x0_i
(
.
clk
(
mclk
)
,
// input
.
srst
(
!
copy_run
||
copy_crc
)
,
// input
// .srst (!copy_run || copy_crc), // input
.
srst
(
!
segment_run
||
copy_crc
)
,
// input
.
en
(
1'b1
)
,
// input
.
din
(
crc_in
)
,
// input[15:0]
.
dout
(
crc_out
)
// output[15:0]
...
...
util_modules/gpio393.v
View file @
f35c087d
...
...
@@ -161,7 +161,7 @@ module gpio393 #(
generate
genvar
i
;
for
(
i
=
0
;
i
<
GPIO_N
;
i
=
i
+
1
)
begin
:
gpio_block
gpio_bit
gpio_bit_i
(
gpio
393
_bit
gpio_bit_i
(
// .rst (rst), // input
.
clk
(
mclk
)
,
// input
.
srst
(
mrst
)
,
// input
...
...
util_modules/gpio393_bit.v
View file @
f35c087d
/*!
* <b>Module:</b>gpio393
* <b>Module:</b>gpio393
_bit
* @file gpio393.v
* @date 2015-07-06
* @author Andrey Filippov
...
...
@@ -48,7 +48,7 @@
// 1 0 2 1 1
// 1 1 3 0 0
module
gpio_bit
(
module
gpio
393
_bit
(
// input rst, // global reset
input
clk
,
// system clock
input
srst
,
// @posedge clk - sync reset
...
...
x393.v
View file @
f35c087d
...
...
@@ -88,8 +88,8 @@ module x393 #(
inout
sns4_ctl
,
inout
sns4_pg
,
`elsif
LWIR
in
p
ut
[
4
:
0
]
sns1_dp40
,
in
p
ut
[
4
:
0
]
sns1_dn40
,
in
o
ut
[
4
:
0
]
sns1_dp40
,
in
o
ut
[
4
:
0
]
sns1_dn40
,
inout
sns1_dp5
,
// diff MIPI signals (not yet implemented)
inout
sns1_dn5
,
// diff MIPI signals (not yet implemented)
inout
[
7
:
6
]
sns1_dp76
,
...
...
@@ -101,8 +101,8 @@ module x393 #(
inout
sns1_ctl
,
inout
sns1_pg
,
in
p
ut
[
4
:
0
]
sns2_dp40
,
in
p
ut
[
4
:
0
]
sns2_dn40
,
in
o
ut
[
4
:
0
]
sns2_dp40
,
in
o
ut
[
4
:
0
]
sns2_dn40
,
inout
sns2_dp5
,
// diff MIPI signals (not yet implemented)
inout
sns2_dn5
,
// diff MIPI signals (not yet implemented)
inout
[
7
:
6
]
sns2_dp76
,
...
...
@@ -114,8 +114,8 @@ module x393 #(
inout
sns2_ctl
,
inout
sns2_pg
,
in
p
ut
[
4
:
0
]
sns3_dp40
,
in
p
ut
[
4
:
0
]
sns3_dn40
,
in
o
ut
[
4
:
0
]
sns3_dp40
,
in
o
ut
[
4
:
0
]
sns3_dn40
,
inout
sns3_dp5
,
// diff MIPI signals (not yet implemented)
inout
sns3_dn5
,
// diff MIPI signals (not yet implemented)
inout
[
7
:
6
]
sns3_dp76
,
...
...
@@ -127,8 +127,8 @@ module x393 #(
inout
sns3_ctl
,
inout
sns3_pg
,
in
p
ut
[
4
:
0
]
sns4_dp40
,
in
p
ut
[
4
:
0
]
sns4_dn40
,
in
o
ut
[
4
:
0
]
sns4_dp40
,
in
o
ut
[
4
:
0
]
sns4_dn40
,
inout
sns4_dp5
,
// diff MIPI signals (not yet implemented)
inout
sns4_dn5
,
// diff MIPI signals (not yet implemented)
inout
[
7
:
6
]
sns4_dp76
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment