Implemented Task Add in c an vhdl. Still testing
This commit is contained in:
parent
0d1b73e3e0
commit
344619c957
@ -30,7 +30,34 @@ architecture rtl of add is
|
|||||||
signal next_task_state : work.task.State;
|
signal next_task_state : work.task.State;
|
||||||
signal index : integer range 0 to work.task.STREAM_LEN;
|
signal index : integer range 0 to work.task.STREAM_LEN;
|
||||||
|
|
||||||
|
signal start_ipcore : std_logic;
|
||||||
|
signal done_ipcore : std_logic;
|
||||||
|
|
||||||
|
signal a_readdata : std_logic_vector(31 downto 0);
|
||||||
|
signal b_readdata : std_logic_vector(31 downto 0);
|
||||||
|
signal result : std_logic_vector(31 downto 0);
|
||||||
|
|
||||||
|
type CalcState is (
|
||||||
|
CALC_IDLE,
|
||||||
|
CALC_READ,
|
||||||
|
CALC_PROCESS,
|
||||||
|
CALC_WRITE
|
||||||
|
);
|
||||||
|
signal Calc_State : CalcState;
|
||||||
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
u_float_add: entity work.float_add
|
||||||
|
port map (
|
||||||
|
clk => clk,
|
||||||
|
reset => reset,
|
||||||
|
start => start_ipcore,
|
||||||
|
done => done_ipcore,
|
||||||
|
A => a_readdata,
|
||||||
|
B => b_readdata,
|
||||||
|
sum => result
|
||||||
|
);
|
||||||
|
|
||||||
task_state_transitions : process ( current_task_state, task_start, index ) is
|
task_state_transitions : process ( current_task_state, task_start, index ) is
|
||||||
begin
|
begin
|
||||||
next_task_state <= current_task_state;
|
next_task_state <= current_task_state;
|
||||||
@ -39,14 +66,17 @@ begin
|
|||||||
if ( task_start = '1' ) then
|
if ( task_start = '1' ) then
|
||||||
next_task_state <= work.task.TASK_RUNNING;
|
next_task_state <= work.task.TASK_RUNNING;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
when work.task.TASK_RUNNING =>
|
when work.task.TASK_RUNNING =>
|
||||||
if ( index = work.task.STREAM_LEN - 1 ) then
|
if ( index = work.task.STREAM_LEN ) then
|
||||||
next_task_state <= work.task.TASK_DONE;
|
next_task_state <= work.task.TASK_DONE;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
when work.task.TASK_DONE =>
|
when work.task.TASK_DONE =>
|
||||||
if ( task_start = '1' ) then
|
if ( task_start = '1' ) then
|
||||||
next_task_state <= work.task.TASK_RUNNING;
|
next_task_state <= work.task.TASK_RUNNING;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
end case;
|
end case;
|
||||||
end process task_state_transitions;
|
end process task_state_transitions;
|
||||||
|
|
||||||
@ -54,24 +84,52 @@ begin
|
|||||||
begin
|
begin
|
||||||
if ( reset = '1' ) then
|
if ( reset = '1' ) then
|
||||||
current_task_state <= work.task.TASK_IDLE;
|
current_task_state <= work.task.TASK_IDLE;
|
||||||
|
Calc_State <= CALC_IDLE;
|
||||||
index <= 0;
|
index <= 0;
|
||||||
elsif ( rising_edge( clk ) ) then
|
elsif ( rising_edge( clk ) ) then
|
||||||
current_task_state <= next_task_state;
|
current_task_state <= next_task_state;
|
||||||
case next_task_state is
|
case next_task_state is
|
||||||
when work.task.TASK_IDLE =>
|
when work.task.TASK_IDLE =>
|
||||||
index <= 0;
|
index <= 0;
|
||||||
signal_write <= '0';
|
Calc_State <= CALC_IDLE;
|
||||||
when work.task.TASK_RUNNING =>
|
signal_write <= '0';
|
||||||
index <= index + 1;
|
|
||||||
signal_write <= '1';
|
when work.task.TASK_RUNNING =>
|
||||||
signal_writedata <= ( others => '0' );
|
case Calc_State is
|
||||||
when work.task.TASK_DONE =>
|
when CALC_IDLE =>
|
||||||
index <= 0;
|
Calc_State <= CALC_READ;
|
||||||
signal_write <= '0';
|
when CALC_READ =>
|
||||||
|
signal_write <= '0';
|
||||||
|
signal_a_read <= '1';
|
||||||
|
signal_b_read <= '1';
|
||||||
|
Calc_State <= CALC_PROCESS;
|
||||||
|
when CALC_PROCESS =>
|
||||||
|
signal_a_read <= '0';
|
||||||
|
signal_b_read <= '0';
|
||||||
|
start_ipcore <= '1';
|
||||||
|
if(done_ipcore = '1') then
|
||||||
|
start_ipcore <= '0';
|
||||||
|
Calc_State <= CALC_WRITE;
|
||||||
|
end if;
|
||||||
|
when CALC_WRITE =>
|
||||||
|
Calc_State <= CALC_READ;
|
||||||
|
index <= index + 1;
|
||||||
|
signal_write <= '1';
|
||||||
|
end case;
|
||||||
|
|
||||||
|
when work.task.TASK_DONE =>
|
||||||
|
index <= 0;
|
||||||
|
Calc_State <= CALC_IDLE;
|
||||||
|
signal_write <= '0';
|
||||||
|
|
||||||
end case;
|
end case;
|
||||||
end if;
|
end if;
|
||||||
end process sync;
|
end process sync;
|
||||||
|
|
||||||
|
signal_writedata <= result;
|
||||||
|
a_readdata <= signal_a_readdata;
|
||||||
|
b_readdata <= signal_b_readdata;
|
||||||
|
|
||||||
task_state <= current_task_state;
|
task_state <= current_task_state;
|
||||||
|
|
||||||
end architecture rtl;
|
end architecture rtl;
|
||||||
|
@ -3,8 +3,18 @@
|
|||||||
#include "system/float_word.h"
|
#include "system/float_word.h"
|
||||||
|
|
||||||
int task_add_run( void * task ) {
|
int task_add_run( void * task ) {
|
||||||
|
add_config* taskConfig = (add_config*) task;
|
||||||
|
|
||||||
// TODO
|
for(uint32_t i = 0; i < DATA_CHANNEL_DEPTH; ++i) {
|
||||||
|
float chnl1, chnl2;
|
||||||
|
data_channel_read(taskConfig->sources[0], (uint32_t*) &chnl1);
|
||||||
|
data_channel_read(taskConfig->sources[1], (uint32_t*) &chnl2);
|
||||||
|
|
||||||
|
float_word result;
|
||||||
|
result.value = chnl1 + chnl2;
|
||||||
|
|
||||||
|
data_channel_write(taskConfig->sink, result.word);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user