七郎仔 发表于 2010-6-25 23:30:51

verilog一个关于简化ont-hot编码问题

verilog一个关于简化ont-hot编码问题
parameter
s0=4'd0,
s1=4'd1,
s2=4'd2,
s3=4'd3;
always@(posedge clk or rest)
if(rest)begin
state<=5'b0;
state<=1'b'1;
end
else state<=next;
always@(state or x)begin
next=5'b0;
y=1'b0;
case(1'b1)
state:
begin
if(......) next=1'b1;
state:if(......) next=1'b1;else.....
state:if(......) next=1'b1;else.....
state:if(......) next=1'b1;else.....
state:if(......) next=1'b1;else...
end
endcase
end
endmodule

这个是简化的one-hot编码,每个状态向量只有一位为1,其余为0;
我不明白的是,当所有状态都循环一遍的时候,那么next就不是只有一个1了,因为过程中没有给next清零,要复位时state才会全部清零.
,这时state中也不只一位为1,那么case(1'b1)下,究竟如何执行?

yangyangnuc 发表于 2012-6-15 21:00:59

我觉得你的状态机
不是one-hot编码
因为 状态分别为
0000   0001    0010    0011   
不符合 one-hot 编码

zhouliang 发表于 2012-6-24 11:34:15

回复 1# 七郎仔


    next=5'b0;
y=1'b0;
case(1'b1)


这个是阻塞赋值语句吗,如果是这样,每次循环next都会先清零,然后执行下面的case语句

zombes 发表于 2012-7-8 12:14:21

这应该是独热码代码:
2楼理解不对,s0 s1..是[]内数,表示的是next或者state的第s位,也就是第0位,第1位..,所以可以看出是独热码
3楼理解没错,补充一句,设计中采用的是两段式的状态机写法,其中第二段是组合逻辑,所以采用阻塞赋值,关于next的赋值是先清零,然后再将其某一位置1,涉及到一个原则:如果在同一个begin end中对同一量重复赋值,那么以后一次为准(具体涉及到编译器,但基本是这样的)
页: [1]
查看完整版本: verilog一个关于简化ont-hot编码问题