深海烟花 发表于 2013-9-26 10:45:40

关于一段式状态机的比较,欢迎各位讨论各自代码风格。

最近在学习状态机,从我入门的特权同学和黑金开发板入手,对比了一下两种代码风格。。。。
特权同学的一段式状态机:
module state_machine(
                clk,
                rst_n,
                cmd,
                wr_req,
                rd_req
                );

input clk;
input rst_n;
output cmd;
input rd_req;
input wr_req;

reg cmd;
reg cstate;
parameter IDLE = 0,
                       WR_S1 = 1,
                       WR_S2 = 2,
                       RD_S1 = 3,
                       RD_S2 = 4;
always@(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
                cstate <= IDLE;
                cmd <= 3'b111;
                end
        else
                case(cstate)
                        IDLE:
                        if(wr_req) begin
                                cstate <= WR_S1;
                                cmd <= 3'b011;
                                end
                        else if(rd_req)begin
                                cstate <= RD_S1;
                                cmd <= 3'b011;
                                end
                        else begin
                                cstate <= IDLE;
                                cmd <= 3'b111;
                                end
                        WR_S1:begin
                                cstate <= WR_S2;
                                cmd <= 3'b101;
                                end
                        WR_S2:begin
                                cstate <= IDLE;
                                cmd <= 3'b111;
                                end
                        RD_S1:
                        if(wr_req) begin
                                cstate <= WR_S2;
                                cmd <= 3'b101;
                                end
                        else begin
                                cstate <= RD_S2;
                                cmd <= 3'b110;
                                end
                        RD_S2:
                        if(wr_req) begin
                                cstate <= WR_S1;
                                cmd <= 3'b011;
                        end
                        else begin
                                cstate <= IDLE;
                                cmd <= 3'b111;
                                end
                        default: cstate <= IDLE;
                        endcase
                        end                       
endmodule
                       
下面是黑金开发板提供的类状态机写法:                               
module state_machine(
                clk,
                rst_n,
                cmd,
                wr_req,
                rd_req
                );

input clk;
input rst_n;
output cmd;
input rd_req;
input wr_req;

reg cmd;
reg i;
always@(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
                i <= 4'd0;
                cmd <= 3'b111;
                end
        else
                case(i)
                        4'd0:
                        if(wr_req) begin
                                i <= i + 1'd1;
                                cmd <= 3'b011;
                                end
                        else if(rd_req)begin
                                i <= 4'd3;
                                cmd <= 3'b011;
                                end
                        else begin
                                i <= 4'd0;
                                cmd <= 3'b111;
                                end
                        4'd1:begin
                                i <= i + 1'd1;
                                cmd <= 3'b101;
                                end
                        4'd2:begin
                                i <= 4'd0;
                                cmd <= 3'b111;
                                end
                        4'd3:
                        if(wr_req) begin
                                i <= 4'd1;
                                cmd <= 3'b101;
                                end
                        else begin
                                i <= i +1'd1;
                                cmd <= 3'b110;
                                end
                        4'd4:
                        if(wr_req) begin
                                i <= 4'd1;
                                cmd <= 3'b011;
                        end
                        else begin
                                i <= 4'd0;
                                cmd <= 3'b111;
                                end
                        default: i <= 4'd0;
                        endcase
                        end                       
endmodule

下面是占用的资源对比:

wangjun403 发表于 2013-9-26 14:43:07

这两段代码的差异无非就是一个状态机的参数使用parameter,另一个直接用数值

猜测的结果可能是使用parameter时,综合的时候可能parameter指定的值有综合器重新优化指定(完全是猜想)

另外,黑金的代码风格简直就是一坨屎

深海烟花 发表于 2013-9-26 23:13:29

wangjun403 发表于 2013-9-26 14:43 static/image/common/back.gif
这两段代码的差异无非就是一个状态机的参数使用parameter,另一个直接用数值

猜测的结果可能是使用paramet ...

我前期收黑金的影响甚大,现在正在一点点修正。。。。。。。。

ALTERA_WLB 发表于 2013-9-27 08:54:35

深海烟花 发表于 2013-9-26 23:13 static/image/common/back.gif
我前期收黑金的影响甚大,现在正在一点点修正。。。。。。。。

我现在也在通过黑金学习FPGA的一些基础代码,请问关于这个“影响”到底是好是坏? 前期的代码风格对后来的项目研发应该会影响很大,请指点一二应该通过哪些教程去入门FPGA的学习?

changer15309 发表于 2013-9-27 09:22:24

代码风格要有自己的特色一看就是你写的同时也能吸收别人的长处让别人看你的代码也能看到别人的影子
我会告诉你我是来秀头像的吗?

深海烟花 发表于 2013-9-28 13:03:11

ALTERA_WLB 发表于 2013-9-27 08:54 static/image/common/back.gif
我现在也在通过黑金学习FPGA的一些基础代码,请问关于这个“影响”到底是好是坏? 前期的代码风格对后来 ...

我前段时间接触了官网的一些示例代码,非常工整。。。。。

tiger5 发表于 2013-9-28 13:24:10

开发板的代码能写的很好,还真没见过,大部分就是应付。

要想写的好,就得多学习了。

qwerttt 发表于 2013-9-29 20:19:38

这两段代码都不怎样
没见过黑金的代码不好评论
建议用二段式状态机,逻辑与时序分开
页: [1]
查看完整版本: 关于一段式状态机的比较,欢迎各位讨论各自代码风格。