各位,初来论坛。也不知道题目写的有没有问题,见谅。
本人最近在学习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) PRES_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语句,不是造成错误结果吗? 请问是不是我理解错了什么,初手还望各位指教。。。
|