summaryrefslogtreecommitdiffstats
path: root/hdl/PIC.vhd
diff options
context:
space:
mode:
Diffstat (limited to 'hdl/PIC.vhd')
-rw-r--r--hdl/PIC.vhd93
1 files changed, 86 insertions, 7 deletions
diff --git a/hdl/PIC.vhd b/hdl/PIC.vhd
index a31bec7..7471add 100644
--- a/hdl/PIC.vhd
+++ b/hdl/PIC.vhd
@@ -22,7 +22,10 @@ entity PIC is
-- UART physical pins
uart_tx : out std_logic;
- uart_rx : in std_logic
+ uart_rx : in std_logic;
+
+ -- 1-Wire physical pin
+ ow_pin : inout std_logic
);
end entity PIC;
@@ -34,12 +37,13 @@ architecture rtl of PIC is
signal alu_skip : std_logic;
signal mem_q : std_logic_vector(7 downto 0);
- signal mem_qstatus : std_logic_vector(2 downto 0);
+ signal mem_qstatus : std_logic_vector(7 downto 0);
signal mem_we : std_logic;
signal mem_re : std_logic;
signal bit_select : std_logic_vector(2 downto 0);
signal addr : std_logic_vector(6 downto 0);
+ signal mem_addr : std_logic_vector(7 downto 0);
signal sm_data : std_logic_vector(7 downto 0);
signal sm_pc : std_logic_vector(12 downto 0);
signal we_w : std_logic;
@@ -64,6 +68,26 @@ architecture rtl of PIC is
signal uart_rx_empty : std_logic;
signal uart_rx_full : std_logic;
+ -- 1-Wire <-> dpram bridge signals
+ signal ow_tx_byte : std_logic_vector(7 downto 0);
+ signal ow_op : std_logic_vector(1 downto 0);
+ signal ow_start : std_logic;
+ signal ow_rx_byte : std_logic_vector(7 downto 0);
+ signal ow_presence : std_logic;
+ signal ow_busy : std_logic;
+
+ -- Interrupt bridge signals
+ signal irq_pending : std_logic;
+ signal gie_clear : std_logic;
+ signal gie_set : std_logic;
+
+ -- Timer0 bridge signals
+ signal t0if : std_logic;
+ signal tmr0_val : std_logic_vector(7 downto 0);
+ signal tmr0_we_sig : std_logic;
+ signal tmr0_in_sig : std_logic_vector(7 downto 0);
+ signal option_reg : std_logic_vector(7 downto 0);
+
begin
work_reg <= W;
@@ -71,6 +95,9 @@ begin
instruction_return <= instr_ret;
status <= alu_status;
+ -- banking: RP0 (STATUS bit 5) selects bank 0 or bank 1
+ mem_addr <= mem_qstatus(5) & addr;
+
b_operand_select : process(use_literal, sm_data, mem_q)
begin
if use_literal = '1' then
@@ -110,7 +137,10 @@ begin
stack_din => stack_din,
stack_dout => stack_dout,
alu_skip => alu_skip,
- alu_result => alu_result
+ alu_result => alu_result,
+ irq_pending => irq_pending,
+ gie_clear => gie_clear,
+ gie_set => gie_set
);
alu : entity work.alu(rtl)
@@ -119,7 +149,7 @@ begin
b => b_operand,
op => alu_operation,
bit_select => bit_select,
- status_in => mem_qstatus,
+ status_in => mem_qstatus(2 downto 0),
result => alu_result,
status => alu_status,
skip => alu_skip
@@ -136,14 +166,14 @@ begin
);
mem : entity work.dpram(rtl)
- generic map (DEPTH => 128)
+ generic map (DEPTH => 256)
port map (
clk => clk,
we => mem_we,
re => mem_re,
d => alu_result,
d_status => "00000" & alu_status,
- addr => addr,
+ addr => mem_addr,
q => mem_q,
q_status => mem_qstatus,
port_a => port_a,
@@ -155,7 +185,56 @@ begin
uart_rx_byte => uart_rx_byte,
uart_rx_rd_en => uart_rx_rd_en,
uart_rx_empty => uart_rx_empty,
- uart_rx_full => uart_rx_full
+ uart_rx_full => uart_rx_full,
+ ow_tx_byte => ow_tx_byte,
+ ow_op => ow_op,
+ ow_start => ow_start,
+ ow_rx_byte => ow_rx_byte,
+ ow_presence => ow_presence,
+ ow_busy => ow_busy,
+ tmr0_val => tmr0_val,
+ tmr0_we => tmr0_we_sig,
+ tmr0_in => tmr0_in_sig,
+ option_reg => option_reg,
+ t0if_set => t0if,
+ gie_clear => gie_clear,
+ gie_set => gie_set,
+ irq_pending => irq_pending
+ );
+
+ ow_inst : entity work.onewire
+ generic map (
+ CLK_FREQ => CLK_FREQ
+ )
+ port map (
+ clk => clk,
+ reset => reset,
+ ow_pin => ow_pin,
+ start => ow_start,
+ op => ow_op,
+ tx_byte => ow_tx_byte,
+ rx_byte => ow_rx_byte,
+ presence => ow_presence,
+ busy => ow_busy,
+ done => open
+ );
+
+ tmr0_inst : entity work.timer0(rtl)
+ generic map (
+ CLK_FREQ => CLK_FREQ
+ )
+ port map (
+ clk => clk,
+ reset => reset,
+ t0cki => '0',
+ t0cs => option_reg(5),
+ t0se => option_reg(4),
+ psa => option_reg(3),
+ ps => option_reg(2 downto 0),
+ tmr0_we => tmr0_we_sig,
+ tmr0_in => tmr0_in_sig,
+ tmr0_out => tmr0_val,
+ t0if => t0if
);
uart_inst : entity work.uart