当前位置: 代码迷 >> 嵌入开发 >> verilog的高手帮忙看一上这个程序,仿真的时候只有read有结果,其他全部是0?
  详细解决方案

verilog的高手帮忙看一上这个程序,仿真的时候只有read有结果,其他全部是0?

热度:415   发布时间:2013-02-26 00:00:00.0
verilog的高手帮忙看一下这个程序,仿真的时候只有read有结果,其他全部是0??
/*信号定义:
clk: 时钟信号,本例中其频率值为 1Hz;
decide: 电话局反馈回来的信号,代表话务种类,“01”表示市话,“10”表示
长话,“11”表示特话;
dispmoney: 用来显示卡内余额,其单位为角,这里假定能显示的最大数额为 50 元
(500 角);
disptime: 显示本次通话的时长;
write,read: 当 write 信号下降沿到来时写卡,当话卡插入,read 信号变高时读卡;
warn: 余额过少时的告警信号。本例中,当打市话时,余额少于 3 角,打长
话时,余额少于 6 角,即会产生告警信号;
cut: 当告警时间过长时自动切断通话信号。 */

module acc1(state,clk,card,decide,disptime,dispmoney,
            write,read,warn,cut); 

input state,clk,card;//state为1时表示正在通话中 card为1时表示已插入卡
input[2:1] decide;

output write,read,warn,cut;
reg write,warn,cut;

output[10:0] dispmoney;
output[8:0] disptime;

reg [10:0] money;
reg [8:0] dtime;

reg minute; //分

reg set,reset_ena;
integer temp,second;

assign dispmoney=card?money:0;
assign disptime=dtime;
assign read=card?1:0;

initial
begin
   dtime=0;
   money=0;
   minute=0;
   temp=0;second=0;reset_ena=0;set=0;
end

//产生分钟
always @(posedge clk)
begin
    if(card&state)
    begin
         second<=second+1;
         if (second==60) begin second<=0; minute<=1;  end
         if (second==1) minute<=0;
    end
    else begin second<=0; minute<=0; end

end


always @(negedge clk) //该进程完成电话计费计时功能 写滞后
begin
    write=1; 
    if(!set)
    begin money=11'h500; set=1;end

    if(card&state)
    if(minute)
    begin
       case(decide)
       2'b01: if(money<3)
                        begin warn=1; write=0; reset_ena=1; end
               else
               begin 
               //市话计费 一分钟3角
               
               if(money[3:0]<3)
                       begin

                          if(money[7:4]!=0)
                                begin money[7:4]=money[7:4]-1;money[3:0]=money[3:0]+7; end
                          else
                                begin money[10:8]=money[10:8]-1; money[7:4]=9; money[3:0]=money[3:0]+7;end
  相关解决方案