📄 ekeyfsm.cpp
字号:
#include "ekeyfsm.h"
void ekeyfsm::clocked_proc() {
if (resetn.read() == 0) {
current_state.write((state_type)(s0 ));
ekey_done_cld.write((bool)(0 ));
round_daddr_cld.write((sc_uint<4>)("0b0000"));
round_eaddr_cld.write((sc_uint<4>)("0b0000"));
sel_rk3_cld.write((sc_uint<2>)("0b00"));
sel_sk_cld.write((sc_uint<4>)("0b0000"));
} else
if (clk.posedge()) {
current_state.write((state_type)(next_state.read() ));
switch (current_state.read()) {
case s0 :
ekey_done_cld.write((bool)(0 ));
break;
case s1 :
round_eaddr_cld.write((sc_uint<4>)(round_eaddr_cld.read() + 1 ));
break;
case s2 :
sel_rk3_cld.write((sc_uint<2>)(sel_rk3_cld.read() + 1 ));
break;
case s4 :
if (round_eaddr_cld.read() != (sc_uint<4>)"0b1010") {
round_eaddr_cld.write((sc_uint<4>)(round_eaddr_cld.read() + 1 ));
} break;
case s5 :
ekey_done_cld.write((bool)(1 ));
break;
case wr0 :
round_daddr_cld.write((sc_uint<4>)(round_daddr_cld.read() + 1 ));
round_eaddr_cld.write((sc_uint<4>)("0b1001" ));
break;
case s6 :
sel_sk_cld.write((sc_uint<4>)(sel_sk_cld.read() + 1 ));
break;
case s7 :
sel_sk_cld.write((sc_uint<4>)(sel_sk_cld.read() + 1 ));
break;
case s8 :
round_daddr_cld.write((sc_uint<4>)(round_daddr_cld.read() + 1 ));
round_eaddr_cld.write((sc_uint<4>)(round_eaddr_cld.read() - 1 ));
break;
case s11 :
round_daddr_cld.write((sc_uint<4>)("0b0000"));
round_eaddr_cld.write((sc_uint<4>)("0b0000"));
sel_rk3_cld.write((sc_uint<2>)("0b00"));
sel_sk_cld.write((sc_uint<4>)("0b0000"));
break;
default : break;
}
}
}
void ekeyfsm::nextstate_proc() {
switch (current_state.read()) {
case s0 :
if (ld_key.read() == 1) {
next_state.write((state_type)(s1 ));
} else {
next_state.write((state_type)(s0 ));
} break;
case s1 :
next_state.write((state_type)(s2 ));
break;
case s2 :
if (sel_rk3_cld.read() != (sc_uint<2>)"0b11") {
next_state.write((state_type)(s3 ));
} else
if (sel_rk3_cld.read() == (sc_uint<2>)"0b11") {
next_state.write((state_type)(s4 ));
} else {
next_state.write((state_type)(s2 ));
} break;
case s3 :
next_state.write((state_type)(s2 ));
break;
case s4 :
if (round_eaddr_cld.read() == (sc_uint<4>)"0b1010") {
next_state.write((state_type)(s5 ));
} else
if (round_eaddr_cld.read() != (sc_uint<4>)"0b1010") {
next_state.write((state_type)(s2 ));
} else {
next_state.write((state_type)(s4 ));
} break;
case s5 :
next_state.write((state_type)(rd10 ));
break;
case wr0 :
next_state.write((state_type)(rd9 ));
break;
case s6 :
if (sel_sk_cld.read()(1,0 ) == (sc_uint<2>)"0b10") {
next_state.write((state_type)(s7 ));
} else {
next_state.write((state_type)(s6 ));
} break;
case s7 :
if (sel_sk_cld.read() != (sc_uint<4>)"0b1111") {
next_state.write((state_type)(s6 ));
} else
if (sel_sk_cld.read() == (sc_uint<4>)"0b1111") {
next_state.write((state_type)(s8 ));
} else {
next_state.write((state_type)(s7 ));
} break;
case s8 :
next_state.write((state_type)(rdx ));
break;
case s10 :
next_state.write((state_type)(s11 ));
break;
case s11 :
if (ld_key.read() == 1) {
next_state.write((state_type)(s0 ));
} else {
next_state.write((state_type)(s11 ));
} break;
case rd10 :
next_state.write((state_type)(wr0 ));
break;
case rd9 :
next_state.write((state_type)(s6 ));
break;
case rdx :
if (round_daddr_cld.read() != (sc_uint<4>)"0b1010") {
next_state.write((state_type)(s6 ));
} else
if (round_daddr_cld.read() == (sc_uint<4>)"0b1010") {
next_state.write((state_type)(s10 ));
} else {
next_state.write((state_type)(rdx ));
} break;
default : next_state.write((state_type)(s0 ));
break;
}
}
void ekeyfsm::output_proc() {
busy.write((bool)(1 ));
dkey_done.write((bool)(0 ));
dkey_mux.write((bool)(0 ));
key_inp_mux.write((bool)(1 ));
ld.write((bool)(0 ));
ld_rk3.write((bool)(0 ));
ldd.write((bool)(0 ));
wr_dmem.write((bool)(0 ));
switch (current_state.read()) {
case s0 :
key_inp_mux.write((bool)(0 ));
busy.write((bool)(0 ));
break;
case s1 :
ld.write((bool)(1 ));
key_inp_mux.write((bool)(0 ));
break;
case s2 :
ld_rk3.write((bool)(1 ));
break;
case s4 :
ld.write((bool)(1 ));
break;
case wr0 :
dkey_mux.write((bool)(1 ));
wr_dmem.write((bool)(1 ));
break;
case s7 :
ldd.write((bool)(1 ));
break;
case s8 :
wr_dmem.write((bool)(1 ));
break;
case s10 :
wr_dmem.write((bool)(1 ));
dkey_mux.write((bool)(1 ));
break;
case s11 :
dkey_done.write((bool)(1 ));
busy.write((bool)(0 ));
break;
default : break;
}
}
void ekeyfsm::comb_assignments() {
ekey_done.write((bool)(ekey_done_cld.read() ));
round_daddr.write((sc_uint<4>)(round_daddr_cld.read() ));
round_eaddr.write((sc_uint<4>)(round_eaddr_cld.read() ));
sel_rk3.write((sc_uint<2>)(sel_rk3_cld.read() ));
sel_sk.write((sc_uint<4>)(sel_sk_cld.read() ));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -