2 belvey Belvey 于 2015.07.28 09:31 提问

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

5个回答

Belvey
Belvey   2015.08.13 17:11
已采纳

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

lindexi_gd
lindexi_gd   2015.07.28 15: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 20:54

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

Belvey
Belvey   2015.07.28 20:59

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

Belvey
Belvey   2015.07.30 14:56

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

Csdn user default icon
上传中...
上传图片
插入图片