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 编辑 ]
此帖出自
小平头技术问答
稍后我会上传文件和仿真波形。
网络太差。
最早不正确的是bit_num。原意是仅在i_state等于bit_a(也就是4)时递减,但仿真不是这样。
哪位大侠能告诉我原因?谢谢!
// 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
一周热门 更多>