📄 aes_fsm.cpp
字号:
#include "aes_fsm.h"
void aes_fsm::clocked_proc() {
if (resetn.read() == 0) {
current_state.write((state_type)(s0 ));
key_addr_cld.write((sc_uint<4>)("0b0000"));
key_addr_mux_cld.write((bool)(0 ));
sel_cld.write((sc_uint<4>)("0b0000"));
sel_ft_fs_cld.write((bool)(0 ));
} else
if (clk.posedge()) {
current_state.write((state_type)(next_state.read() ));
switch (current_state.read()) {
case s1 :
key_addr_mux_cld.write((bool)(1 ));
break;
case ldkey :
key_addr_cld.write((sc_uint<4>)(key_addr_cld.read() + 1 ));
break;
case sx :
sel_cld.write((sc_uint<4>)(sel_cld.read() + 1 ));
break;
case s2 :
sel_cld.write((sc_uint<4>)(sel_cld.read() + 1 ));
break;
case xorrk :
key_addr_cld.write((sc_uint<4>)(key_addr_cld.read() + 1 ));
break;
case s4 :
sel_ft_fs_cld.write((bool)(1 ));
break;
case s3 :
sel_cld.write((sc_uint<4>)(sel_cld.read() + 1 ));
break;
case s5 :
sel_cld.write((sc_uint<4>)(sel_cld.read() + 1 ));
break;
case dvalid :
key_addr_cld.write((sc_uint<4>)("0b0000"));
key_addr_mux_cld.write((bool)(0 ));
sel_cld.write((sc_uint<4>)("0b0000"));
sel_ft_fs_cld.write((bool)(0 ));
break;
default : break;
}
}
}
void aes_fsm::nextstate_proc() {
switch (current_state.read()) {
case s0 :
if ((key_done.read() == 1 && ld_data.read() == 1)) {
next_state.write((state_type)(s1 ));
} else {
next_state.write((state_type)(s0 ));
} break;
case s1 :
next_state.write((state_type)(s8 ));
break;
case ldkey :
next_state.write((state_type)(sx ));
break;
case sx :
if (sel_cld.read()(1,0 ) == (sc_uint<2>)"0b10") {
next_state.write((state_type)(s2 ));
} else {
next_state.write((state_type)(sx ));
} break;
case s2 :
if (sel_cld.read() != (sc_uint<4>)"0b1111") {
next_state.write((state_type)(sx ));
} else
if (sel_cld.read() == (sc_uint<4>)"0b1111") {
next_state.write((state_type)(xorrk ));
} else {
next_state.write((state_type)(s2 ));
} break;
case xorrk :
if (key_addr_cld.read() == (sc_uint<4>)"0b1001") {
next_state.write((state_type)(s4 ));
} else
if (key_addr_cld.read() != (sc_uint<4>)"0b1001") {
next_state.write((state_type)(sx ));
} else {
next_state.write((state_type)(xorrk ));
} break;
case s4 :
next_state.write((state_type)(s3 ));
break;
case s3 :
if (sel_cld.read()(1,0 ) == (sc_uint<2>)"0b10") {
next_state.write((state_type)(s5 ));
} else {
next_state.write((state_type)(s3 ));
} break;
case s5 :
if (sel_cld.read() != (sc_uint<4>)"0b1111") {
next_state.write((state_type)(s3 ));
} else
if (sel_cld.read() == (sc_uint<4>)"0b1111") {
next_state.write((state_type)(s6 ));
} else {
next_state.write((state_type)(s5 ));
} break;
case s6 :
next_state.write((state_type)(dvalid ));
break;
case dvalid :
if (key_done.read() == 0) {
next_state.write((state_type)(s0 ));
} else
if ((key_done.read() == 1 && ld_data.read() == 1)) {
next_state.write((state_type)(s1 ));
} else {
next_state.write((state_type)(dvalid ));
} break;
case s8 :
next_state.write((state_type)(ldkey ));
break;
default : next_state.write((state_type)(s0 ));
break;
}
}
void aes_fsm::output_proc() {
busy.write((bool)(1 ));
clr_temp.write((bool)(0 ));
data_valid.write((bool)(0 ));
ld.write((bool)(0 ));
ld_din.write((bool)(0 ));
sel_dmux.write((bool)(0 ));
sel_imux.write((bool)(0 ));
switch (current_state.read()) {
case s0 :
busy.write((bool)(0 ));
break;
case ldkey :
ld.write((bool)(1 ));
ld_din.write((bool)(1 ));
clr_temp.write((bool)(1 ));
break;
case s2 :
ld.write((bool)(1 ));
break;
case xorrk :
sel_dmux.write((bool)(1 ));
sel_imux.write((bool)(0 ));
ld_din.write((bool)(1 ));
break;
case s5 :
ld.write((bool)(1 ));
break;
case s6 :
sel_dmux.write((bool)(1 ));
sel_imux.write((bool)(0 ));
ld_din.write((bool)(1 ));
break;
case dvalid :
data_valid.write((bool)(1 ));
busy.write((bool)(0 ));
break;
default : break;
}
}
void aes_fsm::comb_assignments() {
key_addr.write((sc_uint<4>)(key_addr_cld.read() ));
key_addr_mux.write((bool)(key_addr_mux_cld.read() ));
sel.write((sc_uint<4>)(sel_cld.read() ));
sel_ft_fs.write((bool)(sel_ft_fs_cld.read() ));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -