将夏宇闻老师教材里一段式状态机改写成三段式,请指正。

[复制链接]
2811|3
 楼主| taishan3703 发表于 2011-2-26 22:25 | 显示全部楼层 |阅读模式
module test05(sclk, ack, scl, sda, rst, data, STATE, NEXTSTATE);
input sclk, rst;
input[3:0] data;
output ack, scl;
inout sda;
output[7:0] STATE, NEXTSTATE;
reg scl, ack;
reg link_sda, sdabuf;
reg[3:0] databuf;
reg[7:0] state, nextstate;
assign sda = link_sda ? sdabuf : 1'bz;
assign STATE = state;
assign NEXTSTATE = nextstate;
parameter ready = 8'b0000_0000,
          start = 8'b0000_0001,
           bit1 = 8'b0000_0010,
           bit2 = 8'b0000_0100,
           bit3 = 8'b0000_1000,
           bit4 = 8'b0001_0000,
           bit5 = 8'b0010_0000,
           stop = 8'b0100_0000,
           IDLE = 8'b1000_0000;
always @(posedge sclk or negedge rst)
begin
  if (!rst) // reset
    scl <= 1'b1;
  else
    scl <= ~scl;
end            
always @(posedge ack)
begin
  databuf <= data;  
end
always @(negedge sclk or negedge rst)
begin
  if (!rst)
    state <= ready;
  else
    state <= nextstate;
end
always @(state or scl or ack)
begin
  nextstate = 8'bxxxx_xxxx;
  case (state)
ready: if (!scl && !ack)
    nextstate = start;
     else
    nextstate = ready;
start: if (scl && ack)
    nextstate = bit1;
     else
    nextstate = start;
bit1:  if (!scl)
    nextstate = bit2;
     else
    nextstate = bit1;
bit2:  if (!scl)
    nextstate = bit3;
     else
    nextstate = bit2;
bit3:  if (!scl)
    nextstate = bit4;
     else
    nextstate = bit3;
bit4:  if (!scl)
    nextstate = bit5;
     else
    nextstate = bit4;
bit5:  if (!scl)
    nextstate = stop;
     else
    nextstate = bit5;
stop:  if (scl)
    nextstate = IDLE;
     else
    nextstate = stop;
IDLE:  nextstate = ready;
default: nextstate = ready;
  endcase
end
always @(negedge sclk or negedge rst)
begin
  if (!rst)
    begin
      link_sda <= 0;
      sdabuf <= 1'b1;
      ack <= 1'b0;
    end
  else
    case (nextstate)
        start: begin
                   link_sda <= 1'b1;
                   ack <= 1'b1;
               end
        bit1: sdabuf <= 1'b0;
        bit2:  sdabuf <= databuf[3];
        bit3:  sdabuf <= databuf[2];
        bit4:  sdabuf <= databuf[1];
        bit5:  sdabuf <= databuf[0];
        stop:  begin
                   sdabuf <= 1'b0;
                   ack <= 1'b0;
               end
        IDLE:  sdabuf <= 1'b1;
        ready:  link_sda <= 1'b0;
        default: begin
                   link_sda <=1'b0;
                   sdabuf <= 1'b1;
                 end
    endcase
end
endmodule
xiaoyuan_ly 发表于 2011-3-17 10:51 | 显示全部楼层
什么问题了??
wyxj 发表于 2011-3-23 13:29 | 显示全部楼层
你的第二个always的敏感表信号不对吧? 不应该是输出的always @(posedge ack)!
还有一处always @(state or scl or ack)此处我觉得只用时钟就足够了!
至于其他的我还没发现!
wyxj 发表于 2011-3-23 14:02 | 显示全部楼层
楼主,你该的应该是I2c的源程序吧?我找到源程序研究了一下!我在3楼的应该是错误的!敏感信号表中可以加输出!不过我一直没用过!看来我孤陋寡闻了!
你用软件仿真一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

108

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部