搜索
bottom↓
回复: 12

请帮忙分析fpga状态机不连续的原因,谢谢,代码如下

[复制链接]

出0入0汤圆

发表于 2012-8-28 18:05:37 | 显示全部楼层 |阅读模式
本帖最后由 langxing08 于 2012-8-29 10:43 编辑

请问为什么我的状态机不连续啊?
我有两个状态机,一个正常,另外一个就不正常,如下图所示:
为什么呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-8-28 18:21:22 | 显示全部楼层
没有人光看状态图就能debug的。。。。

出0入0汤圆

发表于 2012-8-28 18:24:19 | 显示全部楼层
brahen 发表于 2012-8-28 18:21
没有人光看状态图就能debug的。。。。

而且是一个连跳转条件都没有的状态图

出0入0汤圆

 楼主| 发表于 2012-8-28 22:16:38 | 显示全部楼层
我也是很疑惑,我明明写了跳转条件的,可是编译出来就没有了...

出0入0汤圆

发表于 2012-8-28 22:19:46 | 显示全部楼层
贴上你的代码

出0入0汤圆

 楼主| 发表于 2012-8-28 22:24:38 | 显示全部楼层
好,明天早上把代码贴上!

出0入0汤圆

 楼主| 发表于 2012-8-29 10:20:44 | 显示全部楼层
module uart_top(
        clk,rst_n,
        txd_en,txd,txd_flag,txd_data,
        rxd,rxd_flag,rxd_data
);

input  clk;
input  rst_n;

input  txd_en;                                // uart发送使能
input  rxd;                                       
output txd;
input  [7:0] txd_data;       
output [7:0] rxd_data;
output txd_flag;                        // uart发送完成标志位
output rxd_flag;                        // uart接收完成标志位
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
`timescale 1ns / 1ps
// SRAM:CY7C131
// Note:clk 25MHz
                                       
module SRAM_ctrl(
        clk,rst_n,
        sram_wr_data,sram_rd_data,sram_addr_in,
        sram_wr_req,sram_rd_req,sram_wr_ok,sram_rd_ok,
        sram_addr,sram_data,sram_ce_n,sram_oe_n,sram_rw,sram_busy_n
);

input  clk;                // clk 25MHz
input  rst_n;        // reset,low

//SRAM:CY7C131
input  [9:0] sram_addr_in;
output [9:0] sram_addr;
inout  [7:0] sram_data;
input  [7:0] sram_wr_data;
output [7:0] sram_rd_data;
output sram_ce_n;
output sram_oe_n;
output sram_rw;
input  sram_busy_n;
input  sram_wr_req;
input  sram_rd_req;
output sram_wr_ok;
output sram_rd_ok;


reg [9:0] sram_addr_r;
reg [7:0] sram_rd_data_r;
reg sram_ce_n_r;
reg sram_oe_n_r;
reg sram_rw_r;


//-----------------------------------------------------------
//reg[9:0] sram_addr_cnt;
//always@(posedge sram_wr_req or negedge rst_n)
//        if(!rst_n) sram_addr_cnt <= 10'd0;
//        else sram_addr_cnt <= sram_addr_cnt + 1'b1;
//------------------------------------------------------------
//check sram_wr_req posedge edge
reg sram_wr_req_r0,sram_wr_req_r1;
always@(posedge clk or negedge rst_n)
        if(!rst_n)
                begin
                sram_wr_req_r0 <= 1'b0;
                sram_wr_req_r1 <= 1'b0;
                end
        else
                begin
                sram_wr_req_r0 <= sram_wr_req;
                sram_wr_req_r1 <= sram_wr_req_r0;
                end

wire sram_wr_req_pose = sram_wr_req_r0 & ~sram_wr_req_r1;
               
//check sram_rd_req posedge edge
reg sram_rd_req_r0,sram_rd_req_r1;
always@(posedge clk or negedge rst_n)
        if(!rst_n)
                begin
                sram_rd_req_r0 <= 1'b0;
                sram_rd_req_r1 <= 1'b0;
                end
        else
                begin
                sram_rd_req_r0 <= sram_rd_req;
                sram_rd_req_r1 <= sram_rd_req_r0;
                end

wire sram_rd_req_pose = sram_rd_req_r0 & ~sram_rd_req_r1;
//-----------------------------------------------------------------
// sram read and write
parameter         IDLE = 4'd0,
                                RED1 = 4'd1,
                                RED2 = 4'd2,
                                RED3 = 4'd3,
                                RED4 = 4'd4,
                                WRT1 = 4'd5,
                                WRT2 = 4'd6,
                                WRT3 = 4'd7,
                                WRT4 = 4'd8,
                                WRT5 = 4'd9,
                                WRT6 = 4'd10;
                               
reg[3:0] cstate,nstate;

always@(posedge clk or negedge rst_n)
        if(!rst_n) cstate <= IDLE;
        else cstate <= nstate;

always@(cstate or sram_wr_req_pose or sram_rd_req_pose or sram_busy_n)
        case(cstate)
                IDLE:        if(sram_wr_req_pose) nstate <= WRT1;
                                else if(sram_rd_req_pose) nstate <= RED1;
                                else nstate <= IDLE;
                //WRITE
                WRT1: nstate <= WRT2;
                WRT2:        nstate <= WRT3;
                WRT3:        nstate <= WRT4;
                WRT4: if(!sram_busy_n) nstate <= WRT4;
                                else nstate <= WRT5;       
                WRT5:        nstate <= WRT6;
                WRT6: nstate <= IDLE;
               
                //READ               
                RED1: nstate <= RED2;
                RED2:        nstate <= RED3;
                RED3: if(!sram_busy_n) nstate <= RED3;
                                else nstate <= RED4;
                RED4: nstate <= IDLE;
                //defalult               
                default:        nstate <= IDLE;
                endcase
               
always@(posedge clk or negedge rst_n)
        if(!rst_n)
                begin
                sram_ce_n_r <= 1'b1;
                sram_oe_n_r <= 1'b1;
                sram_rw_r   <= 1'b1;
                end
        else
                case(cstate)
                        IDLE:        begin
                                        sram_ce_n_r <= 1'b1;
                                        sram_oe_n_r <= 1'b1;
                                        sram_rw_r   <= 1'b1;
                                        end
                                       
                        //WRITE
                        WRT1: begin
                                        sram_ce_n_r <= 1'b0;
                                        sram_oe_n_r <= 1'b1;
                                        sram_rw_r   <= 1'b1;
                                        end
                        WRT2:        begin
                                        sram_addr_r <= sram_addr_in;
                                        end
                        WRT5: begin
                                        sram_rw_r <= 1'b0;
                                        end
                        WRT6: begin
                                        sram_rw_r <= 1'b1;
                                        end
                       
                        //READ
                        RED1:        begin
                                        sram_ce_n_r <= 1'b0;
                                        sram_oe_n_r <= 1'b0;
                                        sram_rw_r   <= 1'b1;
                                        end
                        RED2:        begin
                                        sram_addr_r <= sram_addr_in;
                                        end
                        RED4: begin
                                        sram_rd_data_r <= sram_data;
                                        end
                        default:;
                        endcase

                               
assign sram_addr = sram_addr_r;
assign sram_ce_n = sram_ce_n_r;
assign sram_oe_n = sram_oe_n_r;
assign sram_rw   = sram_rw_r;
assign sram_data = ((cstate == WRT3)||(cstate == WRT4)||(cstate == WRT5)||(cstate == WRT6)) ? sram_wr_data : 8'hzz;

assign sram_wr_ok = (cstate == WRT6) ? 1'b1 : 1'b0;
assign sram_rd_ok = (cstate == RED4) ? 1'b1 : 1'b0;
assign sram_rd_data = sram_rd_data_r;       
//------------------------------------------------------------------------

endmodule
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

`timescale 1ns / 1ps

module SRAM(
        clk,rst_n,
        led,
        txd,rxd,
        sram_addr,sram_data,sram_ce_n,sram_oe_n,sram_rw,sram_busy_n
        );
       
input  clk;                // system clk 50MHz
input  rst_n;        // system reset

wire clk25;
wire sys_rst_n;

//UART
input  rxd;
output txd;

reg  txd_en;
wire txd_flag;
wire rxd_flag;
wire [7:0] rxd_data;
reg  [7:0] txd_data;

//SRAM
inout  [7:0] sram_data;
output [9:0] sram_addr;
output sram_rw;
output sram_ce_n;
output sram_oe_n;
input  sram_busy_n;

reg  [7:0] sram_wr_data;
wire [7:0] sram_rd_data;
reg  [9:0] sram_addr_in;
reg  sram_wr_req;
reg  sram_rd_req;
wire sram_wr_ok;
wire sram_rd_ok;


//reg [9:0] sram_addr_wr;
//reg [9:0] sram_addr_rd;
//
//assign sram_addr_in = (sys_cstate == SYS_WR15) ?  sram_addr_wr : sram_addr_rd;
//------------------------------------------------------------------------------------------------------------------------------------------------------------------       
system_ctrl        u_system_ctrl(
        .clk(clk),
        .rst_n(rst_n),
        .sys_rst_n(sys_rst_n)
        );

PLL         u_PLL(
        .inclk0(clk),
        .c0(clk25)
        );
       
SRAM_ctrl        u_SRAM_ctrl(
        .clk(clk25),
        .rst_n(sys_rst_n),
       
        .sram_addr_in(sram_addr_in),
        .sram_wr_data(sram_wr_data),
        .sram_rd_data(sram_rd_data),
        .sram_wr_req(sram_wr_req),
        .sram_rd_req(sram_rd_req),
        .sram_wr_ok(sram_wr_ok),
        .sram_rd_ok(sram_rd_ok),
       
        .sram_addr(sram_addr),
        .sram_data(sram_data),
        .sram_ce_n(sram_ce_n),
        .sram_oe_n(sram_oe_n),
        .sram_rw(sram_rw),
        .sram_busy_n(sram_busy_n)
        );       
       
uart_top                u_uart_top(
        .clk(clk25),
        .rst_n(sys_rst_n),
       
        .txd_en(txd_en),
        .txd_data(txd_data),
        .txd_flag(txd_flag),       
        .rxd_flag(rxd_flag),
        .rxd_data(rxd_data),
       
        .txd(txd),
        .rxd(rxd)
        );

//------------------------------------------------------------------------------------------------------------------------------------------------------------------               
reg[7:0] rxd_bf[5:1];
reg[7:0] txd_bf[5:1];
//------------------------------------------------------------------------------------------------------------------------------------------------------------------       

reg [4:0] uart_recv_cnt;
integer i;
always@(posedge clk or negedge sys_rst_n)
        if(!sys_rst_n)
                begin
                uart_recv_cnt <= 5'd0;
                //shift memory
                for(i=5; i>0; i=i-1)
                        rxd_bf[i] <= 8'h0;
                end
        else if(uart_recv_cnt < 5'd5)
                begin
                if(rxd_flag)
                        begin
                        uart_recv_cnt <= uart_recv_cnt + 1'b1;
                       
                        for(i=5; i>1; i=i-1)
                                rxd_bf[i] <= rxd_bf[i-1];
                        rxd_bf[1] <= rxd_data;
                        end
                end
        else if(uart_recv_cnt >= 5'd5)
                uart_recv_cnt <= 5'd0;
               
//uart_receive_flag
reg uart_recv_flag;
reg uart_recv_flag_clr;
always@(posedge clk25 or negedge sys_rst_n)
        if(!sys_rst_n) uart_recv_flag <= 1'b0;
        else if(uart_recv_flag_clr) uart_recv_flag <= 1'b0;
        else if(uart_recv_cnt == 5'd5) uart_recv_flag <= 1'b1;
//------------------------------------------------------------------------------------------------------------------------------------------------------------------       
parameter        SYS_IDLE   = 4'd0,
                                SYS_RECV_1 = 4'd1,
                                SYS_RECV_2 = 4'd2,
                                SYS_RECV_3 = 4'd3,
                                SYS_WR15_1 = 4'd4,
                                SYS_WR15_2 = 4'd5,
                                SYS_WR15_3 = 4'd6,
                                SYS_RD15_1 = 4'd7,
                                SYS_RD15_2 = 4'd8,
                                SYS_RD15_3 = 4'd9,
                                SYS_SEND_1 = 4'd10,
                                SYS_SEND_2 = 4'd11,
                                SYS_SEND_3 = 4'd12;
                               
                       
reg[3:0] sys_cstate,sys_nstate;
always@(posedge clk25 or negedge sys_rst_n)
        if(!sys_rst_n) sys_cstate <= SYS_IDLE;
        else sys_cstate <= sys_nstate;

reg [4:0] sram_wr15_cnt;
reg [4:0] sram_rd15_cnt;
reg [4:0] uart_send_cnt;

       
always@(*)
        case(sys_cstate)
        SYS_IDLE         :        sys_nstate = SYS_RECV_1;
       
        SYS_RECV_1:        if(uart_recv_flag) sys_nstate = SYS_RECV_2;
        SYS_RECV_2:        sys_nstate = SYS_RECV_3;
        SYS_RECV_3:        sys_nstate = SYS_WR15_1;
       
        SYS_WR15_1: if(sram_wr_ok) sys_nstate = SYS_WR15_2;
        SYS_WR15_2: if(sram_wr15_cnt < 5'd5) sys_nstate = SYS_WR15_1;
                                        else sys_nstate = SYS_WR15_3;  
        SYS_WR15_3:        sys_nstate = SYS_RD15_1;
       
        SYS_RD15_1: if(sram_rd_ok) sys_nstate = SYS_RD15_2;
        SYS_RD15_2: if(sram_rd15_cnt < 5'd5) sys_nstate = SYS_RD15_1;
                                        else sys_nstate = SYS_RD15_3;  
        SYS_RD15_3:        sys_nstate = SYS_SEND_1;
       
        SYS_SEND_1: if(txd_flag) sys_nstate = SYS_SEND_2;
        SYS_SEND_2: if(uart_send_cnt < 5'd5) sys_nstate = SYS_SEND_3;
                                        else sys_nstate = SYS_SEND_1;
        SYS_SEND_3:        sys_nstate = SYS_IDLE;
        default   : sys_nstate = SYS_IDLE;
        endcase
       
always@(posedge clk25 or negedge sys_rst_n)
        if(!sys_rst_n)
                begin
                sram_wr15_cnt <= 5'd0;
                sram_rd15_cnt <= 5'd0;
                uart_send_cnt <= 5'd0;
                sram_wr_req <= 1'b0;
                sram_rd_req <= 1'b0;
                end
        else
                case(sys_cstate)
                SYS_IDLE         :        begin
                                                sram_wr15_cnt <= 5'd0;
                                                sram_rd15_cnt <= 5'd0;
                                                uart_send_cnt <= 5'd0;
                                                sram_wr_req <= 1'b0;
                                                sram_rd_req <= 1'b0;
                                                end
                SYS_RECV_1: ;
                SYS_RECV_2: uart_recv_flag_clr <= 1'b1;
                SYS_RECV_3: uart_recv_flag_clr <= 1'b0;
               
                SYS_WR15_1:        begin
                                                sram_wr_req  <= 1'b1;
                                                sram_addr_in <= {5'h0,sram_wr15_cnt};
                                                sram_wr_data <= rxd_bf[sram_wr15_cnt + 1'b1];
                                                end
                SYS_WR15_2: sram_wr15_cnt <= sram_wr15_cnt + 1'b1;
                SYS_WR15_3: sram_wr_req  <= 1'b0;
               
                SYS_RD15_1: begin
                                                sram_rd_req  <= 1'b1;
                                                sram_addr_in <= {5'h0,sram_rd15_cnt};
                                                txd_bf[sram_rd15_cnt + 1'b1] <= sram_rd_data;
                                                end
                SYS_RD15_2: sram_rd15_cnt <= sram_rd15_cnt + 1'b1;
                SYS_RD15_3: sram_rd_req  <= 1'b0;
               
                SYS_SEND_1: begin
                                                txd_en <= 1'b1;
                                                txd_data <= txd_bf[uart_send_cnt+ 1'b1];
                                                end
                SYS_SEND_2: uart_send_cnt <= uart_send_cnt + 1'b1;
                SYS_SEND_3:        txd_en <= 1'b0;
               
                default         : ;
                endcase

//-------------------------------------------------------------------------
//LED
output [3:0] led;
reg [3:0]led_r;

always@(posedge clk25 or negedge sys_rst_n)
        if(!sys_rst_n) led_r <= 4'hf;
        else
                case(sys_cstate)
                SYS_IDLE         :        led_r <= 4'd1;
                SYS_RECV_1:        led_r <= 4'd2;
                SYS_RECV_2:        led_r <= 4'd3;
                SYS_RECV_3:        led_r <= 4'd4;
                SYS_WR15_1:        led_r <= 4'd5;       
                SYS_WR15_2:        led_r <= 4'd6;
                SYS_WR15_3:        led_r <= 4'd7;
                SYS_RD15_1:        led_r <= 4'd8;
                SYS_RD15_2:        led_r <= 4'd9;
                SYS_RD15_3:        led_r <= 4'd10;
                SYS_SEND_1:        led_r <= 4'd11;
                SYS_SEND_2:        led_r <= 4'd12;
                SYS_SEND_3:        led_r <= 4'd13;       
                default         : led_r <= 4'd14;
                endcase

assign led = led_r;       
       
endmodule

出0入0汤圆

 楼主| 发表于 2012-8-29 10:45:45 | 显示全部楼层
跳转条件为什么会消失了呢?

出0入8汤圆

发表于 2012-8-29 12:57:20 | 显示全部楼层
优化掉了吧  综合时 看看综合报告。

出0入0汤圆

 楼主| 发表于 2012-8-29 15:16:38 | 显示全部楼层
kebaojun305 发表于 2012-8-29 12:57
优化掉了吧  综合时 看看综合报告。

请问怎么看综合报告?
看哪里能找到状态机相关的信息呢?

说实话,我也是怀疑可能被编译器优化掉了,但是不知道该怎么查看。

出0入8汤圆

发表于 2012-8-30 11:05:34 | 显示全部楼层
langxing08 发表于 2012-8-29 15:16
请问怎么看综合报告?
看哪里能找到状态机相关的信息呢?

打算给你看下  可惜添加工程中 编译 一堆 错误  你还是整个工程   或者原文件上传吧。

出0入0汤圆

 楼主| 发表于 2012-8-30 13:10:40 | 显示全部楼层
本帖最后由 langxing08 于 2012-8-30 13:21 编辑

上传整个工程,请大家帮忙看看!
attach://46844.rar

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2012-9-3 17:56:21 | 显示全部楼层
langxing08 发表于 2012-8-30 13:10
上传整个工程,请大家帮忙看看!
attach://46844.rar

先分析下每条警告  要知道为啥会产生警告,解决完  我估计就OK了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表