新手上路
- 积分
- 49
- 金钱
- 49
- 注册时间
- 2016-12-9
- 在线时间
- 6 小时
|
在以太网环回实验中,以下是always@(*)产生的组合逻辑,但是对内部语句是怎样执行的,存在疑惑。就比如,cur_state==st_idle时,如果skip_en从0变1,那么,只执行语句
if(skip_en)
next_state = st_check_sum;
还时说从begin的开始处执行,也就是说
先执行
next_state = st_idle;
再执行
if(skip_en)
next_state = st_check_sum;
是不是always@(*)语句中,只要敏感信号出现变化,begin-end内的语句都会执行一遍?还是说,只是跳到敏感信号出执行相应程序。
always @(*) begin
next_state = st_idle;
case(cur_state)
st_idle : begin //等待发送数据
if(skip_en)
next_state = st_check_sum;
else
next_state = st_idle;
end
st_check_sum: begin //IP首部校验
if(skip_en)
next_state = st_preamble;
else
next_state = st_check_sum;
end
st_preamble : begin //发送前导码+帧起始界定符
if(skip_en)
next_state = st_eth_head;
else
next_state = st_preamble;
end
st_eth_head : begin //发送以太网首部
if(skip_en)
next_state = st_ip_head;
else
next_state = st_eth_head;
end
st_ip_head : begin //发送IP首部+UDP首部
if(skip_en)
next_state = st_tx_data;
else
next_state = st_ip_head;
end
st_tx_data : begin //发送数据
if(skip_en)
next_state = st_crc;
else
next_state = st_tx_data;
end
st_crc: begin //发送CRC校验值
if(skip_en)
next_state = st_idle;
else
next_state = st_crc;
end
default : next_state = st_idle;
endcase
end
|
|