本人最近在学习verilog,,看《verilog数字设计与综合》第二版的14.7节时,分析代码,觉得有想不通的地方,就来请教一下了。书上代码先贴上:
这是整个问题的网址:http://andrew810810.blog.163.com ...
763992007895125290/
以下是一部分代码:
//用有限状态机的办法,设计报纸售卖机的投币器
module vend(coin,clock,reset,newspaper);
//声明输入输出端口
input [1:0] coin;
input clock;
input reset;
output newspaper;
wire newspaper;
//声明有限状态机的内部状态
wire [1:0] NEXT_STATE;
reg [1:0] PRES_STATE;
//状态编码
parameter s0=2'b00;
parameter s5=2'b01;
parameter s10=2'b10;
parameter s15=2'b11;
//组合逻辑
function [2:0] fsm;
input [1:0] fsm_coin;
input [1:0] fsm_PRES_STATE;
reg fsm_newspaper;
reg [1:0] fsm_NEXT_STATE;
begin
case (fsm_PRES_STATE)
S0: //状态为s0
begin
if(fsm_coin==2'b10)
begin
fsm_newspaper=1'b0;
fsm_NEXT_STATE=s10;
end
else if (fsm_coin==2'b01)
begin
fsm_newspaper=1'b0;
fsm_NEXT_STATE=s5;
end
else
begin
fsm_newspaper=1'b0;
fsm_NEXT_STATE=s0;
end
end
s5: //状态为s5
begin
if(fsm_coin==2'b10)
fsm_newspaper=1'b0;
fsm_NEXT_STATE=s15;
end
else if(fsm_coin==2'b01)
begin
fsm_newspaper=1'b0;
fsm_NEXT_STATE=s10;
end
else
begin
fsm_newspaper=1'b0;
fsm_NEXT_STATE=s5;
end
end
s10: //状态为s10
begin
if(fsm_coin==2'b10)
begin
fsm_newspaper=1'b0;
fsm_NEXT_STATE=s15;
end
else if (fsm_coin==2'b01)
begin
fsm_newspaper=1'b0;
fsm_NEXT_STATE=s15;
end
else
begin
fsm_newspaper=1'b0;
fsm_NEXT_STATE=s10;
end
end
s15: // 状态为s15
begin
fsm_newspaper=1'b1;
fsm_NEXT_STATE=s0;
end
endcase
fsm={fsm_newspaper,fsm_NEXT_STATE};
end
endfunction
//每当硬币放入或当前状态改变时,组合逻辑动作
assign
{newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
//用同步复位、时钟正跳变沿触发的状态触发器
always @(posedge clock)
begin
if(reset==1'b1)
 RES_STATE<=S0;
else
PRES_STATE<=NEXT_STATE;
end
endmodule
我的疑问在于这里:
//每当硬币放入或当前状态改变时,组合逻辑动作
assign
{newspaper,NEXT_STATE}=fsm(coin,PRES_STATE);
就是上面这一句我感到不理解。结合问题,如果我在时钟第一个下降沿改变coin(例如投个5分的硬币),那么将触发这个assign语句,从而调用函数,使NEXT_STATE变为s5状态;下降沿后是第一个上升沿,又触发语句“PRES_STATE<=NEXT_STATE;”那么PRES_STATE也变为s5状态,那么不是再一次触发了assign语句吗,而且此时coin还是2‘b01(因为题目说coin值保持一个时钟周期)。这么的一个时钟周期内两次触发assgin语句,不是造成错误结果吗?
请问是不是我理解错了什么,初手还望各位指教。。。
|