这个i2c程序仿真错在哪了?

2019-03-25 10:37发布

module i2c(
   input                 clk,
   input                 rst_n,
   input                enable,
   output reg        scl,
   inout                 sda,
   output reg[7:0] dout,
   output reg[3:0] state,
   output reg[2:0] cmd,
   output reg[4:0] i_state,
   output reg[4:0] i_next_state,
   output reg        r_w,
   output reg        next,
   output reg[3:0] bit_num
 );
reg           ack_data;
reg           bit_num_check;
reg           bit_false;
reg           sda_reg;
reg [  7:0] sec_value;
reg [19:0]  delay_num;
reg [  3:0]  next_state;
  parameter idle                 = 4'd0;    parameter start_1             = 4'd1; 
parameter sla_w              = 4'd2;    parameter sla_w_ack        = 4'd3; 
parameter sec_addr        = 4'd4;    parameter sec_addr_ack  = 4'd5; 
parameter start_2            = 4'd6;    parameter sla_r                = 4'd7; 
parameter sla_r_ack        = 4'd8;    parameter sec_data         = 4'd9; 
parameter sec_data_ack = 4'd10;  parameter stop                 = 4'd11;
parameter delay               = 4'd12; parameter i_idle     = 5'd0;      parameter start_a = 5'd1; 
parameter start_b  = 5'd2;      parameter start_c = 5'd3; 
parameter bit_a     = 5'd4;      parameter bit_b    = 5'd5; 
parameter bit_c     = 5'd6;      parameter ack_a   = 5'd7; 
parameter ack_b   = 5'd8;      parameter ack_c   = 5'd9; 
parameter stop_a  = 5'd10;    parameter stop_b  = 5'd11; 
parameter stop_c  = 5'd12;    parameter stop_d  = 5'd13;
parameter stop_e  = 5'd14;    parameter stop_f  = 5'd15;
parameter i_delay = 5'd16;   parameter cmd_start = 3'd0;    
parameter cmd_byte  = 3'd1;
parameter cmd_ack   = 3'd2;
parameter cmd_stop  = 3'd3;
parameter cmd_delay = 3'd4; [ 本帖最后由 andyandy 于 2010-11-5 09:44 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
andyandy
1楼-- · 2019-03-25 21:36
 精彩回答 2  元偷偷看……
andyandy
2楼-- · 2019-03-26 03:32
格式不好,改起来更烦。
稍后我会上传文件和仿真波形。
网络太差。
andyandy
3楼-- · 2019-03-26 08:00

最早不正确的是bit_num。原意是仅在i_state等于bit_a(也就是4)时递减,但仿真不是这样。

哪位大侠能告诉我原因?谢谢!

andyandy
4楼-- · 2019-03-26 12:31
module test_v;

        // Inputs
        reg clk;
        reg rst_n;
        reg enable;

        // Outputs
        wire scl;
        wire [7:0] dout;
        wire [3:0] state;
        wire [4:0] i_state;
        wire [4:0] i_next_state;
        wire [2:0] cmd;
        wire       r_w;
        wire       next;
        wire [3:0] bit_num;

        // Bidirs
        wire sda;

       
        i2c uut (
                .clk(clk),
                .rst_n(rst_n),
                .enable(enable),
                .scl(scl),
                .sda(sda),
                .dout(dout),
                .state(state),
                .i_state(i_state),
                .i_next_state(i_next_state),
                .cmd(cmd),
                .r_w(r_w),
                .next(next),
                .bit_num(bit_num)
        );

        initial begin
                // Initialize Inputs
                clk = 0;
                rst_n = 0;
                enable = 0;

                #100 rst_n = 1;
        end
       
        always #10 clk = !clk;
        always #10 enable = !enable;   
   
endmodule

一周热门 更多>