Belvey
Belvey
2015-07-28 01:31
采纳率: 100%
浏览 3.2k
已采纳

verilog代码,谁能看懂,貌似挺常用的?

always@(posedge clk_out_0, negedge reset_n) begin
if(reset_n == 1'b0)
current_state <= idle;
else
current_state <= next_state;
end

always@(*) begin
next_state = current_state;
case(current_state)
idle:begin
if(flaga == 1'b1)
next_state = read;
else
next_state = idle;
end
read:begin
if(flaga == 1'b0)
next_state = idle;
else
next_state = read;
end
default:
next_state = idle;
end

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • Belvey
    Belvey 2015-08-13 09:11
    已采纳

    已经懂了,这是典型的三段式状态机,具体的可以去百度,帖子就这样结了,此外给二楼点辛苦分把,诶,好像不行啊,

    点赞 评论
  • lindexi_gd
    lindexi_gd 2015-07-28 07:51

    always@(posedge clk_out_0, negedge reset_n) begin //循环,一旦clk_out_0有上升沿或reset_n下降沿就使用begin下语句
    //下降沿:变到0
    //上升沿:变到1
    if(reset_n == 1'b0) //判断 reset_n==一个单位的 0
    current_state <= idle; //不等待把 current_state=idle
    //=直接赋值
    //<=不等待赋值
    // a=b;b=c;c=d;顺序是从a到c
    //a<=b;b<=c;c<=d;不知顺序,因为哪个先都是不知
    else
    current_state <= next_state; //从这知道他是状态的,每个状态一个,是摩尔类(不在意我说的这个,这个没关系)
    end //停,不是停下程序,是循环,就是结束循环

    always@(*) begin //有变化,循环
    next_state = current_state; //把这个状态放下状态,这个是逆循环
    case(current_state) //分支,判断一个值如果是idle还是read
    idle:begin
    if(flaga == 1'b1) //判断
    next_state = read; //next_state = read;

    else
    next_state = idle;
    end
    read:begin
    if(flaga == 1'b0)
    next_state = idle;
    else
    next_state = read;
    end
    default:
    next_state = idle;
    end //结束

    点赞 评论
  • Belvey
    Belvey 2015-07-28 12:54

    意思是懂,但是不太了解这两个always块在这的意义,有什么用?我也仿真了图像,感觉这两个always块完全没必要。

    点赞 评论
  • Belvey
    Belvey 2015-07-28 12:59

    为了方便看,此处附代码图片,另一张是仿真图片图片说明图片说明

    点赞 评论
  • Belvey
    Belvey 2015-07-30 06:56

    帖子貌似要沉了,我说以下我目前的想法把:这里next _ state是电平触发变化很及时,它是随着flag同步变化的,而current _ state是在下一个时钟的上升沿的时候发生变化,因此current _ state会比next _ state延时一个时钟或一个时钟以内(具体看flag是什么时候变化的)。也就是说,设立这俩模块的的目的是为了做一个延时。但是问题很明显了,如果没有next _ state效果可以是一样的。(这是一个官方的datasheet中的一段程序,应该不会是没用的。)

    点赞 评论
  • weixin_39277081
    weixin_39277081 2019-03-30 02:04

    很簡單,
    其實就是分成兩個部分,
    always@(posedge clk or negedge reset) begin ... end是在描述F.F的電路(序向邏輯)
    而always( ...) begin ... end是在描述combinatinal的電路(組合邏輯)
    邏輯電路這兩個部分是必須分開描述的

    点赞 评论
  • m0_37684182
    若雨知秋 2020-05-29 12:41

    这是Verilog描述的状态机

    点赞 评论

相关推荐