verilog状态机问题

2019-07-15 21:21发布

波形仿真时verilog 写的状态机被综合掉,编译没有错误,状态转移也没错,什么原因可能导致这种问题呢。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
szldsj
1楼-- · 2019-07-16 11:32
黑桃ACE 发表于 2017-10-6 18:21
可能是状态转移条件有误,一直达不到转移的条件

嗯,谢谢啊,检查过了,应该不是这的问题
黑桃ACE
2楼-- · 2019-07-16 14:32
szldsj 发表于 2017-10-7 10:45
嗯,谢谢啊,检查过了,应该不是这的问题

你把代码贴上来才知道具体的原因
szldsj
3楼-- · 2019-07-16 15:47
黑桃ACE 发表于 2017-10-8 19:51
你把代码贴上来才知道具体的原因

module fft_control(clk,rst,/*re_fifo,*/wr_fifo,rst_fifo,w_cycle,wr_full1,wr_full2,wr_fifo1,wr_fifo2,fftpts_in,sink_eop,sink_sop,sink_valid,start_16,fft16_over,switch,re_im,out_reim,count_in,recycle,re1,re2);
input clk,rst;
input wr_fifo,wr_full1,start_16,fft16_over,wr_full2;
input [47:0] re_im;
output [10:0] fftpts_in;
output /*re_fifo,*/sink_eop,sink_sop,sink_valid;
output rst_fifo,re1,re2;
output w_cycle,switch,wr_fifo1,wr_fifo2;
output [13:0] count_in;
output [47:0] out_reim;
output[4:0] recycle;
wire [47:0] out_reim;
reg pd;
reg w_cycle;
reg re_fifo;
reg rst_fifo;
reg [3:0] state1;
reg [4:0] recycle; //修改,加入周期计数,积累16周期
reg [4:0] cnt;//存储计数

reg [10:0] fftpts_in;
reg [13:0] count_in;
reg sink_eop,sink_sop;
reg sink_valid;
reg flag;
assign out_reim=flag? re_im:48'd0;
assign re1=pd? re_fifo:1'b0;
assign re2=pd? 1'b0:re_fifo;
assign wr_fifo2=pd? wr_fifo:1'b0;
assign wr_fifo1=pd? 1'b0:wr_fifo;
always @(posedge clk)
if(!rst) begin
        re_fifo<=1'b0;                       
        state1<=4'b0000;
        rst_fifo<=1'b1;                       
        w_cycle<=1'b0;                       
        recycle<=5'd0;//周期计数
        fftpts_in<=11'd1024;
        sink_eop<=1'b0;
        sink_sop<=1'b0;
        sink_valid<=1'b0;
        count_in<=12'd0;
        flag<=1'b1;
        pd<=1'b0;
        cnt<=5'd0;
end
else
        case(state1)
        4'b0000:        begin
                                        rst_fifo<=1'b0;                                                                        //1024点FFT变换阶段
                                        flag<=1'b1;                                                                                //16 dian bianhuan qiehuan biaozhiwei
                                        count_in<=14'd0;                                //jisu
                                        re_fifo<=1'b0;                                                                        //ad shuju duqu fifo shineng
                                        w_cycle<=1'b0;       
                                        //zhouqi biaozhiwei
                                        recycle<=5'd0;//周期计数
                                        sink_eop<=1'b0;                                                                        //FFT shuju shuru qishibiaozhi
                                        sink_sop<=1'b0;                                                                        //FFT shuru jieshu biaozhi
                                        sink_valid<=1'b0;                                                                //shuju shuruyouxiao biaozhiwei
                                        fftpts_in<=11'd1024;                                                                //fft shuruchangdu
                                        if(((wr_full1||wr_full2)==1'b1)&&(wr_fifo==1'b0)) begin        //dang fifo duman 2048  wr_full==1'b1,qie wr_fifo==1'b0;
                                            if(cnt<=5'd16) begin
                                                state1<=4'b0001;                                                                //zhuanru xia yige zhuangtai
                                                re_fifo<=1'b1;                                                                //dushineng
                                                count_in<=10'd0;
                                                cnt<=5'd0;
                                                end
                                                else begin
                                                state1<=4'b0001;                                                                //zhuanru xia yige zhuangtai
                                                re_fifo<=1'b1;                                                                //dushineng
                                                count_in<=10'd0;
                                                cnt<=cnt+1'b1;
                                                pd<=~pd;
                                                end
                                        end
                                        else begin
                                state1<=4'b0000;
                                end
                        end
               
        4'b0001:        begin
                                        sink_valid<=1'b1;                                                                //数据输入有效标志
                                        sink_sop<=1'b1;                                                                        //输入数据流起始标志
                                        sink_eop<=1'b0;                                 //输入数据流结束标志
                                        state1<=4'b0010;                                                                        //转入下一状态,数据开始输入
                                        count_in<=count_in+1'b1;                        //开始计第一点数据
                                end
        4'b0010:        begin
                                        if(count_in==14'd2047) begin                                                        //1024dianFFT
                                                if(recycle==5'd15)         // 增加周期判断
                                                begin                       
                                                sink_eop<=1'b1;                                                                //shujukuai jieshu biaozhi
                                                count_in<=14'd0;
                                                w_cycle<=1'b1;                                                               
                                                state1<=4'b0011; //zhuanru 16dian bianhuan
                                                end
                                                else
                                                begin
                                                recycle=recycle+1;
                                                sink_eop<=1'b1;
                                                count_in<=10'd0;
                                                w_cycle<=1'b1;
                                                state1<=4'b0000;
                             end
                                end
                                        else
                                                if(count_in==14'd1023) begin                                        //shang shaopin
                                                        sink_eop<=1'b1;                                                        //shangshaopin shuju shuru jieshu
                                                        state1<=4'b0001;                                                        //fanhui shang yi ge zhuangtai wanchengxiashaopinshuju shuru
                                                        count_in<=count_in+1'b1;
                                                end
                                                else
                                                        count_in<=count_in+1'b1;
                                                sink_sop<=1'b0;
                                end
                                //16dian FFT bianhuan jieduan
        4'b0011:        begin
                        re_fifo<=1'b0;        
                                        fftpts_in<=11'd16;                                                                //停止从fifo中读取数据
                                        sink_eop<=1'b0;                                 //shuju jiesubiaozhi zhi 0
                                        sink_valid<=1'b0;
                                        w_cycle<=1'b0;
                                        count_in<=10'd0;
                                        if(start_16)begin
                                        state1<=4'b0100;                                        //16点变换开始
                                end
                                else begin
                         state1<=4'b0011;
                         end
                   end
                                    
        4'b0100:        begin
                                        sink_valid<=1'b1;                                                                //16dianbianhuan shujushuruzhunbeijieduan
                                        sink_sop<=1'b1;                                                                       
                                        sink_eop<=1'b0;
                                        state1<=4'b0101;                                                                       
                                end
        4'b0101:        begin
                                        if(count_in==14'd15) begin                                                //16dianshuju shifou shuruwanbi
                                                sink_eop<=1'b1;                                                               
                                                count_in<=12'd0;
                                                if(fft16_over)                                                                //16zhouqi shuju chuliwanbi
                                                        state1<=4'b0000;                                                        //chongxinkaishixiayilunshuju shuru
                                                else
                                                        state1<=4'b0110;                         //ruguomeijieshu jixuxiayige16dianbianhuan
                                        end       
                                        else        begin
                                                        count_in<=count_in+1'b1;               
                                                        flag<=1'b1;                                        //biaozhiwei zhi wei 1                                               
                                        end
                                        sink_sop<=1'b0;
                                end       
        4'b0110:        begin
                                        sink_eop<=1'b0;                                                                       
                                        sink_sop<=1'b1;                                                                       
                                        //sink_valid<=1'b0;
                                        state1<=4'b0101;
                                        flag<=1'b1;                                                                               
                                end
        default:         state1<=state1;
        endcase

reg switch;       
always @(posedge clk)
if(!rst)
        switch<=1'b1;                                       
else
        case(fftpts_in)
                11'd512:        switch<=1'b1;
                11'd16:                switch<=1'b0;
        default:        switch<=switch;
        endcase
endmodule
//先输入单个周期的1024点个数据然后进行周期计算,即录入16个单周期采样数据,设置快速傅里叶变换标志,即进行16点快速变换,或1024点快速变换
szldsj
4楼-- · 2019-07-16 16:38
黑桃ACE 发表于 2017-10-8 19:51
你把代码贴上来才知道具体的原因
  1. module fft_control(clk,rst,/*re_fifo,*/wr_fifo,rst_fifo,w_cycle,wr_full1,wr_full2,wr_fifo1,wr_fifo2,fftpts_in,sink_eop,sink_sop,sink_valid,start_16,fft16_over,switch,re_im,out_reim,count_in,recycle,re1,re2);
  2. input clk,rst;
  3. input wr_fifo,wr_full1,start_16,fft16_over,wr_full2;
  4. input [47:0] re_im;
  5. output [10:0] fftpts_in;
  6. output /*re_fifo,*/sink_eop,sink_sop,sink_valid;
  7. output rst_fifo,re1,re2;
  8. output w_cycle,switch,wr_fifo1,wr_fifo2;
  9. output [13:0] count_in;
  10. output [47:0] out_reim;
  11. output[4:0] recycle;
  12. wire [47:0] out_reim;
  13. reg pd;
  14. reg w_cycle;
  15. reg re_fifo;
  16. reg rst_fifo;
  17. reg [3:0] state1;
  18. reg [4:0] recycle; //修改,加入周期计数,积累16周期
  19. reg [4:0] cnt;//存储计数

  20. reg [10:0] fftpts_in;
  21. reg [13:0] count_in;
  22. reg sink_eop,sink_sop;
  23. reg sink_valid;
  24. reg flag;
  25. assign out_reim=flag? re_im:48'd0;
  26. assign re1=pd? re_fifo:1'b0;
  27. assign re2=pd? 1'b0:re_fifo;
  28. assign wr_fifo2=pd? wr_fifo:1'b0;
  29. assign wr_fifo1=pd? 1'b0:wr_fifo;
  30. always @(posedge clk)
  31. if(!rst) begin
  32.         re_fifo<=1'b0;                       
  33.         state1<=4'b0000;
  34.         rst_fifo<=1'b1;                       
  35.         w_cycle<=1'b0;                       
  36.         recycle<=5'd0;//周期计数
  37.         fftpts_in<=11'd1024;
  38.         sink_eop<=1'b0;
  39.         sink_sop<=1'b0;
  40.         sink_valid<=1'b0;
  41.         count_in<=12'd0;
  42.         flag<=1'b1;
  43.         pd<=1'b0;
  44.         cnt<=5'd0;
  45. end
  46. else
  47.         case(state1)
  48.         4'b0000:        begin
  49.                                         rst_fifo<=1'b0;                                                                        //1024点FFT变换阶段
  50.                                         flag<=1'b1;                                                                                //16 dian bianhuan qiehuan biaozhiwei
  51.                                         count_in<=14'd0;                                //jisu
  52.                                         re_fifo<=1'b0;                                                                        //ad shuju duqu fifo shineng
  53.                                         w_cycle<=1'b0;       
  54.                                         //zhouqi biaozhiwei
  55.                                         recycle<=5'd0;//周期计数
  56.                                         sink_eop<=1'b0;                                                                        //FFT shuju shuru qishibiaozhi
  57.                                         sink_sop<=1'b0;                                                                        //FFT shuru jieshu biaozhi
  58.                                         sink_valid<=1'b0;                                                                //shuju shuruyouxiao biaozhiwei
  59.                                         fftpts_in<=11'd1024;                                                                //fft shuruchangdu
  60.                                         if(((wr_full1||wr_full2)==1'b1)&&(wr_fifo==1'b0)) begin        //dang fifo duman 2048  wr_full==1'b1,qie wr_fifo==1'b0;
  61.                                             if(cnt<=5'd16) begin
  62.                                                 state1<=4'b0001;                                                                //zhuanru xia yige zhuangtai
  63.                                                 re_fifo<=1'b1;                                                                //dushineng
  64.                                                 count_in<=10'd0;
  65.                                                 cnt<=5'd0;
  66.                                                 end
  67.                                                 else begin
  68.                                                 state1<=4'b0001;                                                                //zhuanru xia yige zhuangtai
  69.                                                 re_fifo<=1'b1;                                                                //dushineng
  70.                                                 count_in<=10'd0;
  71.                                                 cnt<=cnt+1'b1;
  72.                                                 pd<=~pd;
  73.                                                 end
  74.                                         end
  75.                                         else begin
  76.                                 state1<=4'b0000;
  77.                                 end
  78.                         end
  79.                
  80.         4'b0001:        begin
  81.                                         sink_valid<=1'b1;                                                                //数据输入有效标志
  82.                                         sink_sop<=1'b1;                                                                        //输入数据流起始标志
  83.                                         sink_eop<=1'b0;                                 //输入数据流结束标志
  84.                                         state1<=4'b0010;                                                                        //转入下一状态,数据开始输入
  85.                                         count_in<=count_in+1'b1;                        //开始计第一点数据
  86.                                 end
  87.         4'b0010:        begin
  88.                                         if(count_in==14'd2047) begin                                                        //1024dianFFT
  89.                                                 if(recycle==5'd15)         // 增加周期判断
  90.                                                 begin                       
  91.                                                 sink_eop<=1'b1;                                                                //shujukuai jieshu biaozhi
  92.                                                 count_in<=14'd0;
  93.                                                 w_cycle<=1'b1;                                                               
  94.                                                 state1<=4'b0011; //zhuanru 16dian bianhuan
  95.                                                 end
  96.                                                 else
  97.                                                 begin
  98.                                                 recycle=recycle+1;
  99.                                                 sink_eop<=1'b1;
  100.                                                 count_in<=10'd0;
  101.                                                 w_cycle<=1'b1;
  102.                                                 state1<=4'b0000;
  103.                              end
  104.                                 end
  105.                                         else
  106.                                                 if(count_in==14'd1023) begin                                        //shang shaopin
  107.                                                         sink_eop<=1'b1;                                                        //shangshaopin shuju shuru jieshu
  108.                                                         state1<=4'b0001;                                                        //fanhui shang yi ge zhuangtai wanchengxiashaopinshuju shuru
  109.                                                         count_in<=count_in+1'b1;
  110.                                                 end
  111.                                                 else
  112.                                                         count_in<=count_in+1'b1;
  113.                                                 sink_sop<=1'b0;
  114.                                 end
  115.                                 //16dian FFT bianhuan jieduan
  116.         4'b0011:        begin
  117.                         re_fifo<=1'b0;        
  118.                                         fftpts_in<=11'd16;                                                                //停止从fifo中读取数据
  119.                                         sink_eop<=1'b0;                                 //shuju jiesubiaozhi zhi 0
  120.                                         sink_valid<=1'b0;
  121.                                         w_cycle<=1'b0;
  122.                                         count_in<=10'd0;
  123.                                         if(start_16)begin
  124.                                         state1<=4'b0100;                                        //16点变换开始
  125.                                 end
  126.                                 else begin
  127.                          state1<=4'b0011;
  128.                          end
  129.                    end
  130.                                     
  131.         4'b0100:        begin
  132.                                         sink_valid<=1'b1;                                                                //16dianbianhuan shujushuruzhunbeijieduan
  133.                                         sink_sop<=1'b1;                                                                       
  134.                                         sink_eop<=1'b0;
  135.                                         state1<=4'b0101;                                                                       
  136.                                 end
  137.         4'b0101:        begin
  138.                                         if(count_in==14'd15) begin                                                //16dianshuju shifou shuruwanbi
  139.                                                 sink_eop<=1'b1;                                                               
  140.                                                 count_in<=12'd0;
  141.                                                 if(fft16_over)                                                                //16zhouqi shuju chuliwanbi
  142.                                                         state1<=4'b0000;                                                        //chongxinkaishixiayilunshuju shuru
  143.                                                 else
  144.                                                         state1<=4'b0110;                         //ruguomeijieshu jixuxiayige16dianbianhuan
  145.                                         end       
  146.                                         else        begin
  147.                                                         count_in<=count_in+1'b1;               
  148.                                                         flag<=1'b1;                                        //biaozhiwei zhi wei 1                                               
  149.                                         end
  150.                                         sink_sop<=1'b0;
  151.                                 end       
  152.         4'b0110:        begin
  153.                                         sink_eop<=1'b0;                                                                       
  154.                                         sink_sop<=1'b1;                                                                       
  155.                                         //sink_valid<=1'b0;
  156.                                         state1<=4'b0101;
  157.                                         flag<=1'b1;                                                                               
  158.                                 end
  159.         default:         state1<=state1;
  160.         endcase

  161. reg switch;       
  162. always @(posedge clk)
  163. if(!rst)
  164.         switch<=1'b1;                                       
  165. else
  166.         case(fftpts_in)
  167.                 11'd512:        switch<=1'b1;
  168.                 11'd16:                switch<=1'b0;
  169.         default:        switch<=switch;
  170.         endcase
  171. endmodule
  172. //先输入单个周期的1024点个数据然后进行周期计算,即录入16个单周期采样数据,设置快速傅里叶变换标志,即进行16点快速变换,或1024点快速变换
复制代码
szldsj
5楼-- · 2019-07-16 22:35
黑桃ACE 发表于 2017-10-8 19:51
你把代码贴上来才知道具体的原因

正在审核通过
WZH1991
6楼-- · 2019-07-17 00:39
会不会是初始信号(((wr_full1||wr_full2)==1'b1)&&(wr_fifo==1'b0)) 没给到或不满足建立时间,导致状态机只能停留在初始状态。为什么不将条件改成 (wr_full1||wr_full2)&&(!wr_fifo),或新定义寄存器赋值或组合逻辑赋值flag_start = (((wr_full1||wr_full2)==1'b1)&&(wr_fifo==1'b0))拿出状态机作为判决条件if(flag_start )

一周热门 更多>