Skip to content

HDL: Add an Infrared Recorder Unit. #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ transcript

# Quartus temporary files
.qsys_edit/
subsystemHMI/
db/
HPSPlatform/
incremental_db/
Expand Down
113 changes: 88 additions & 25 deletions hdl/HPSPlatform.qsys
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,31 @@
type = "int";
}
}
element hmi.infrared_s0
{
datum _lockedAddress
{
value = "1";
type = "boolean";
}
datum baseAddress
{
value = "2048";
type = "String";
}
}
element hmi.leds_s1
{
datum _lockedAddress
{
value = "1";
type = "boolean";
}
datum _tags
{
value = "";
type = "String";
}
datum baseAddress
{
value = "1040";
Expand Down Expand Up @@ -279,6 +297,22 @@
<interface
name="hdc1000_i2c_0_i2c_serial"
internal="hmi.hdc1000_i2c_0_i2c_serial" />
<interface
name="hmi_infrared_ir_rx_i"
internal="hmi.infrared_ir_rx_i"
type="conduit"
dir="end" />
<interface
name="hmi_infrared_ir_rx_o"
internal="hmi.infrared_ir_rx_o"
type="conduit"
dir="end" />
<interface
name="hmi_infrared_ir_tx_o"
internal="hmi.infrared_ir_tx_o"
type="conduit"
dir="end" />
<interface name="hmi_infrared_irq_o" internal="hmi.infrared_irq_o" />
<interface
name="hmi_subsystemapds9301_apdsinterrupt"
internal="hmi.subsystemapds9301_apdsinterrupt"
Expand Down Expand Up @@ -367,7 +401,7 @@
internal="hmi.switches_external_connection"
type="conduit"
dir="end" />
<module name="clk_0" kind="clock_source" version="18.1" enabled="1">
<module name="clk_0" kind="clock_source" version="19.1" enabled="1">
<parameter name="clockFrequency" value="50000000" />
<parameter name="clockFrequencyKnown" value="true" />
<parameter name="inputClockFrequency" value="0" />
Expand All @@ -378,6 +412,9 @@
<parameter name="AUTO_DEVICE_FAMILY" value="Cyclone V" />
<parameter name="AUTO_DEVICE_SPEEDGRADE" value="6" />
<parameter name="AUTO_GENERATION_ID" value="0" />
<parameter name="AUTO_INFRARED_CLK_I_CLOCK_DOMAIN" value="1" />
<parameter name="AUTO_INFRARED_CLK_I_CLOCK_RATE" value="50000000" />
<parameter name="AUTO_INFRARED_CLK_I_RESET_DOMAIN" value="1" />
<parameter name="AUTO_LEDS_CLK_CLOCK_DOMAIN" value="1" />
<parameter name="AUTO_LEDS_CLK_CLOCK_RATE" value="50000000" />
<parameter name="AUTO_LEDS_CLK_RESET_DOMAIN" value="1" />
Expand All @@ -398,9 +435,9 @@
<parameter name="AUTO_SWITCHES_CLK_CLOCK_DOMAIN" value="1" />
<parameter name="AUTO_SWITCHES_CLK_CLOCK_RATE" value="50000000" />
<parameter name="AUTO_SWITCHES_CLK_RESET_DOMAIN" value="1" />
<parameter name="AUTO_UNIQUE_ID" value="HPSPlatform_hmi" />
<parameter name="AUTO_UNIQUE_ID" value="$${FILENAME}_hmi" />
</module>
<module name="hps_0" kind="altera_hps" version="18.1" enabled="1">
<module name="hps_0" kind="altera_hps" version="19.1" enabled="1">
<parameter name="ABSTRACT_REAL_COMPARE_TEST" value="false" />
<parameter name="ABS_RAM_MEM_INIT_FILENAME" value="meminit" />
<parameter name="ACV_PHY_CLK_ADD_FR_PHASE" value="0.0" />
Expand Down Expand Up @@ -932,7 +969,16 @@
</module>
<connection
kind="avalon"
version="18.1"
version="19.1"
start="hps_0.h2f_lw_axi_master"
end="hmi.infrared_s0">
<parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x0800" />
<parameter name="defaultConnection" value="false" />
</connection>
<connection
kind="avalon"
version="19.1"
start="hps_0.h2f_lw_axi_master"
end="hmi.leds_s1">
<parameter name="arbitrationPriority" value="1" />
Expand All @@ -941,7 +987,7 @@
</connection>
<connection
kind="avalon"
version="18.1"
version="19.1"
start="hps_0.h2f_lw_axi_master"
end="hmi.seven_segment_s0">
<parameter name="arbitrationPriority" value="1" />
Expand All @@ -950,7 +996,7 @@
</connection>
<connection
kind="avalon"
version="18.1"
version="19.1"
start="hps_0.h2f_lw_axi_master"
end="hmi.subsystemapds9301_s0">
<parameter name="arbitrationPriority" value="1" />
Expand All @@ -959,7 +1005,7 @@
</connection>
<connection
kind="avalon"
version="18.1"
version="19.1"
start="hps_0.h2f_lw_axi_master"
end="hmi.subsystemhdc1000_s0">
<parameter name="arbitrationPriority" value="1" />
Expand All @@ -968,7 +1014,7 @@
</connection>
<connection
kind="avalon"
version="18.1"
version="19.1"
start="hps_0.h2f_lw_axi_master"
end="hmi.subsystemmpu9250_s0">
<parameter name="arbitrationPriority" value="1" />
Expand All @@ -977,7 +1023,7 @@
</connection>
<connection
kind="avalon"
version="18.1"
version="19.1"
start="hps_0.h2f_lw_axi_master"
end="hmi.switches_s1">
<parameter name="arbitrationPriority" value="1" />
Expand All @@ -986,76 +1032,93 @@
</connection>
<connection
kind="clock"
version="18.1"
version="19.1"
start="clk_0.clk"
end="hps_0.f2h_axi_clock" />
<connection
kind="clock"
version="18.1"
version="19.1"
start="clk_0.clk"
end="hps_0.h2f_axi_clock" />
<connection
kind="clock"
version="18.1"
version="19.1"
start="clk_0.clk"
end="hps_0.h2f_lw_axi_clock" />
<connection kind="clock" version="18.1" start="clk_0.clk" end="hmi.leds_clk" />
<connection
kind="clock"
version="18.1"
version="19.1"
start="clk_0.clk"
end="hmi.infrared_clk_i" />
<connection kind="clock" version="19.1" start="clk_0.clk" end="hmi.leds_clk" />
<connection
kind="clock"
version="19.1"
start="clk_0.clk"
end="hmi.seven_segment_clock" />
<connection
kind="clock"
version="18.1"
version="19.1"
start="clk_0.clk"
end="hmi.subsystemapds9301_clk" />
<connection
kind="clock"
version="18.1"
version="19.1"
start="clk_0.clk"
end="hmi.subsystemhdc1000_clk" />
<connection
kind="clock"
version="18.1"
version="19.1"
start="clk_0.clk"
end="hmi.subsystemmpu9250_clk" />
<connection kind="clock" version="18.1" start="clk_0.clk" end="hmi.switches_clk" />
<connection kind="clock" version="19.1" start="clk_0.clk" end="hmi.switches_clk" />
<connection
kind="interrupt"
version="18.1"
version="19.1"
start="hps_0.f2h_irq0"
end="hmi.infrared_done_recording_irq">
<parameter name="irqNumber" value="1" />
</connection>
<connection
kind="interrupt"
version="19.1"
start="hps_0.f2h_irq0"
end="hmi.subsystemmpu9250_irq">
<parameter name="irqNumber" value="0" />
</connection>
<connection
kind="reset"
version="18.1"
version="19.1"
start="clk_0.clk_reset"
end="hmi.infrared_rst_n_i" />
<connection
kind="reset"
version="19.1"
start="clk_0.clk_reset"
end="hmi.leds_reset" />
<connection
kind="reset"
version="18.1"
version="19.1"
start="clk_0.clk_reset"
end="hmi.seven_segment_reset" />
<connection
kind="reset"
version="18.1"
version="19.1"
start="clk_0.clk_reset"
end="hmi.subsystemapds9301_reset" />
<connection
kind="reset"
version="18.1"
version="19.1"
start="clk_0.clk_reset"
end="hmi.subsystemhdc1000_reset" />
<connection
kind="reset"
version="18.1"
version="19.1"
start="clk_0.clk_reset"
end="hmi.subsystemmpu9250_reset" />
<connection
kind="reset"
version="18.1"
version="19.1"
start="clk_0.clk_reset"
end="hmi.switches_reset" />
<interconnectRequirement for="$system" name="qsys_mm.clockCrossingAdapter" value="HANDSHAKE" />
Expand Down
21 changes: 21 additions & 0 deletions hdl/components/infrared/comp.do
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@

#----------------------------------*-tcl-*-

#-------------------------------------------
proc myvcom {filename} {
if {[file exists ${filename}] == 1} {
puts "## vcom $filename"
vcom -93 -novopt -quiet ${filename} -work work
} else {
puts "## WARNING: File not found: ${filename}"
}
}

#-------------------------------------------
vlib work
myvcom counter.vhd
myvcom sync.vhd
myvcom sync_single.vhd
myvcom infrared.vhd

quit
104 changes: 104 additions & 0 deletions hdl/components/infrared/counter.vhd
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
-------------------------------------------------------------------------------
--! @file counter.vhd
--! @author Michael Wurm <[email protected]>
--! @copyright 2020 Michael Wurm
--! @brief Entity implementation of counter.
-------------------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

--! @brief Entity declaration of counter
--! @details
--! Provides a counter value of clock ticks of clk_i.
--! The counter is free-running, and thus overflows at its maximum.

entity counter is
generic (
counter_width_g : natural := 31);
port (
--! @name Clocks and resets
--! @{

--! System clock
clk_i : in std_logic;
--! Asynchronous reset
rst_n_i : in std_logic;

--! @}
--! @name Control and status signals
--! @{

--! Enable
enable_i : in std_ulogic;
--! Overflow
overflow_o : out std_ulogic;
--! Generated strobe
count_o : out unsigned(counter_width_g-1 downto 0));

--! @}

end entity counter;

--! RTL implementation of counter
architecture rtl of counter is
-----------------------------------------------------------------------------
--! @name Internal Registers
-----------------------------------------------------------------------------
--! @{

signal count : unsigned(count_o'range);
signal overflow : std_ulogic := '0';

--! @}
-----------------------------------------------------------------------------
--! @name Internal Wires
-----------------------------------------------------------------------------
--! @{


--! @}

begin -- architecture rtl

------------------------------------------------------------------------------
-- Outputs
------------------------------------------------------------------------------

count_o <= count;
overflow_o <= overflow;

-----------------------------------------------------------------------------
-- Signal Assignments
-----------------------------------------------------------------------------

------------------------------------------------------------------------------
-- Registers
------------------------------------------------------------------------------

regs : process (clk_i, rst_n_i) is
procedure reset is
begin
count <= to_unsigned(0, count'length);
overflow <= '0';
end procedure reset;
begin -- process regs
if rst_n_i = '0' then
reset;
elsif rising_edge(clk_i) then
-- Defaults
overflow <= '0';

if enable_i = '0' then
reset;
else
count <= count + 1;
if count = 2**count'length-1 then
overflow <= '1';
end if;
end if;
end if;
end process regs;

end architecture rtl;
Loading