注意,此代码是错误代码,并不能实现想要的结果。

之所以留着,因为里面的enable 是独立开来的思想值得借鉴。就是控制单元和运算单元分开(我也是借鉴别人的实现思想)。具体用verilogHDL实现IIC通讯在http://www.cnblogs.com/sepeng/p/3258705.html 里会做到。

 //date :2013/7/7
//designer :pengxiaoen
//synthesizer:QuartusII 12.1
//function : IIC实现HMC5883的通讯 50M /(400k × 4)= 32 `define WriteAddress 'h3c
`define ReadAddress 'h3d `define RegAAddress 'h00 //配置寄存器A
`define RegBAddress 'h01 //配置寄存器B
`define ModelAddress 'h02 //模式寄存器
`define X_MSBAddress 'h03 //X MSB寄存器
`define X_LSBAddress 'h04
`define Z_MSBAddress 'h05
`define Z_LSBAddress 'h06
`define Y_MSBAddress 'h07
`define Y_LSBAddress 'h08
`define STATEAddress 'h09 //状态寄存器
`define IdentifyAAddress 'h10 //识别寄存器A
`define IdentifyBAddress 'h10
`define IdentifyCAddress 'h10 `define INITIAL
`define MEASURE `define START
`define Re
`define Se
`define STOP //`default_nettype none module HMC5883_IIC (
clock,reset,
sda,scl,
out_seg, sel_seg
); input clock,reset;
inout sda,scl;
output reg [:]out_seg; output reg [:]sel_seg; reg [:] SEND_buffer;
reg [:] Re_buffer ;
reg sda_reg;
reg scl_reg;
reg sda_enable;
reg scl_enable; reg IC_state;
reg [:]state; //当前状态寄存器
reg state_finish_flag ; // reg [:] clk_counter;
reg [:] step_counter;
reg [:] clk_temp ; //-------------------------时钟控制模块-------------------------------start------------------
always @ (posedge clock or negedge reset)
if (!reset)
begin
clk_temp <= 'd0;
clk_counter <= 'd0;
end
else if (clk_temp[])
begin
clk_temp <= 'd0;
if (state_finish_flag) clk_counter <= 'd0;
else if (clk_counter == 'b111_111) //这里是一个保护机制,可以设置一个flag
begin
clk_counter <= 'b111_111;
end
else clk_counter <= clk_counter + ;
end
else clk_temp <= clk_temp + ;
//-------------------------时钟控制模块-----------------------------------end------------------ //-----------------状态机控制模块------------------------------------------start-------------------
always @ (posedge clock or negedge reset)
if(!reset)
IC_state <= `INITIAL;
else IC_state <= `MEASURE; always @ (posedge clock or negedge reset)
if (!reset)
begin
step_counter <= 'd0;
SEND_buffer <= 'd0;
end
else if(IC_state == `INITIAL)
case (step_counter)
: begin state <= `START; step_counter <= step_counter + ;end
: begin SEND_buffer <= 'h3c;state <= `Se; step_counter <= step_counter + 1; end
: begin SEND_buffer <= 'h02;state <= `Se; step_counter <= step_counter + 1; end
: begin SEND_buffer <= 'h00;state <= `Se; step_counter <= step_counter + 1; end
: begin SEND_buffer <= 'h00;state <= `Se; step_counter <= step_counter + 1; end
default step_counter <= 'd0;
endcase
else if (IC_state == `MEASURE)
case (step_counter)
: begin state <= `START; step_counter <= step_counter + ;end
: begin SEND_buffer <= 'h3c;state <= `Se; step_counter <= step_counter + 1; end
: begin SEND_buffer <= 'h03;state <= `Se; step_counter <= step_counter + 1; end
: begin state <= `START; step_counter <= step_counter + ;end
: begin SEND_buffer <= 'h3d;state <= `Se; step_counter <= step_counter + 1; end : begin state <= `Re; step_counter <= step_counter + ; end
: begin state <= `Re; step_counter <= step_counter + ; end
: begin state <= `Re; step_counter <= step_counter + ; end
: begin state <= `Re; step_counter <= step_counter + ; end
: begin state <= `Re; step_counter <= step_counter + ; end
: begin state <= `Re; step_counter <= step_counter + ; end
: begin state <= `Re; step_counter <= step_counter + ; end
: begin state <= `Re; step_counter <= step_counter + ; end : begin state <= `STOP; step_counter <= 'd0; end
default step_counter <= 'd0;
endcase //-----------------状态机控制模块-------------------------------------------end--------------------- //------------------------------------------使能控制模块--------------------------start---------------
always @ (posedge clk_counter or negedge reset)
if (!reset)
begin
sda_enable <= 'd0;
scl_enable <= 'd0;
end
else case (state)
`START : begin
if(clk_counter >= 'd4)
begin
sda_enable <= 'd0;
scl_enable <= 'd0;
end
else
begin
sda_enable <= 'd1;
scl_enable <= 'd1;
end
end `STOP : begin
if(clk_counter >= 'd4)
begin
sda_enable <= 'd0;
scl_enable <= 'd0;
end
else
begin
sda_enable <= 'd1;
scl_enable <= 'd1;
end
end `Se : begin
if(clk_counter >= 'd36) //send 完成之后释放掉使能
begin
sda_enable <= 'd0;
scl_enable <= 'd0;
end
else
begin
sda_enable <= 'd1;
scl_enable <= 'd1;
end
end `Re : begin
if(clk_counter >= 'd32) //receive 完成之后释放掉使能
begin
sda_enable <= 'd0;
scl_enable <= 'd0;
end
else
begin
sda_enable <= 'd1;
scl_enable <= 'd1;
end
end
endcase
//------------------------------------------使能控制模块--------------------------end--------------- //------------------------------------------------外部数据线 控制模块-----------------start---------------
always @ (posedge clk_counter or negedge reset)
if(!reset)
begin
sda_reg <= 'd0;
scl_reg <= 'd0;
state_finish_flag <= 'd0;
Re_buffer <= 'd0;
end
else case (state)
`START : begin
case (clk_counter)
: begin sda_reg <= 'd1; scl_reg <= 1'd0; state_finish_flag <= 'd0; end
: begin sda_reg <= 'd1; scl_reg <= 1'd0; state_finish_flag <= 'd0; end
: begin sda_reg <= 'd1; scl_reg <= 1'd1; state_finish_flag <= 'd0; end
: begin sda_reg <= 'd0; scl_reg <= 1'd1; state_finish_flag <= 'd0; end
default begin sda_reg <= 'dz; scl_reg <= 1'dz; state_finish_flag <= 'd1; end
endcase
end `STOP : begin
case (clk_counter)
: begin sda_reg <= 'd0; scl_reg <= 1'd0; state_finish_flag <= 'd0; end
: begin sda_reg <= 'd0; scl_reg <= 1'd0; state_finish_flag <= 'd0; end
: begin sda_reg <= 'd0; scl_reg <= 1'd1; state_finish_flag <= 'd0; end
: begin sda_reg <= 'd1; scl_reg <= 1'd1; state_finish_flag <= 'd0; end
default begin sda_reg <= 'dz; scl_reg <= 1'dz; state_finish_flag <= 'd1; end
endcase
end `Se : begin
case (clk_counter)
: begin sda_reg <= 'd0; scl_reg <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin sda_reg <= SEND_buffer[]; scl_reg <= 'd1; state_finish_flag <= 1'd0; end : begin /*state_finish_flag <= sda;*/ scl_reg <= 'd0; /*state_finish_flag <= 1'd0; */ end
: begin /*state_finish_flag <= sda;*/ scl_reg <= 'd0; /*state_finish_flag <= 1'd0; */ end
: begin /*state_finish_flag <= sda;*/ scl_reg <= 'd1; /*state_finish_flag <= 1'd0; */ end
: begin state_finish_flag <= sda; scl_reg <= 'd1; /*state_finish_flag <= 1'd0; */ end default begin scl_reg <= 'dz; state_finish_flag <= sda; end //等待响应
endcase
end `Re : begin
case (clk_counter)
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin Re_buffer[] <= sda; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin Re_buffer[] <= sda; scl_reg <= 'd1; state_finish_flag <= 1'd0; end : begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin Re_buffer[] <= sda; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin Re_buffer[] <= sda; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin Re_buffer[] <= sda; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin Re_buffer[] <= sda; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin Re_buffer[] <= sda; scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd0; state_finish_flag <= 1'd0; end
: begin scl_reg <= 'd1; state_finish_flag <= 1'd0; end
: begin Re_buffer[] <= sda; scl_reg <= 'd1; state_finish_flag <= 1'd0; end // 32:begin sda_reg <= 1'd0; scl_reg <= 1'd0; state_finish_flag <= 1'd0; end //NA
// 33:begin sda_reg <= 1'd0; scl_reg <= 1'd0; state_finish_flag <= 1'd0; end
// 34:begin sda_reg <= 1'd0; scl_reg <= 1'd1; state_finish_flag <= 1'd0; end
// 35:begin sda_reg <= 1'd0; scl_reg <= 1'd1; state_finish_flag <= 1'd0; end default begin sda_reg <= 'dz; scl_reg <= 1'dz; state_finish_flag <= 'd1; end
endcase
end
endcase
//------------------------------------------------外部数据线 控制模块-----------------end--------------- assign sda = sda_enable ? sda_reg : 'dz ;
assign scl = scl_enable ? scl_reg : 'dz ; always @ (posedge clk_counter or negedge reset)
if (!reset)
begin sel_seg <= 'b111110;
end
else if(state_finish_flag)
begin
sel_seg <= {sel_seg[:],sel_seg[]};
end always @(posedge clock or negedge reset)
if (!reset) out_seg <= 'd0;
else
begin
case (Re_buffer)
'b0000 : out_seg<=8'b1100_0000;//0000_0011
'b0001 : out_seg<=8'b1111_1001;//1001_1111
'b0010 : out_seg<=8'b1010_0100;//0010_0101
'b0011 : out_seg<=8'b1011_0000;//0000_1101
'b0100 : out_seg<=8'b1001_1001;//1001_1001
'b0101 : out_seg<=8'b1001_0010;//0100_1001
'b0110 : out_seg<=8'b1000_0010;//0100_0001
'b0111 : out_seg<=8'b1111_1000;//0001_1111
'b1000 : out_seg<=8'b1000_0000;//0000_0001
'b1001 : out_seg<=8'b1001_1000;//0001_1001
'b1010 : out_seg<=8'b1000_1000;//0001_0001
'b1011 : out_seg<=8'b1000_0011;//1100_0001
'b1100 : out_seg<=8'b1100_0110;//0110_0011
'b1101 : out_seg<=8'b1010_0001;//1000_0101
'b1110 : out_seg<=8'b1000_0110;//0110_0001
'b1111 : out_seg<=8'b1000_1110;//0111_0001
endcase
end endmodule

用Verilog实现IIC通讯的更多相关文章

  1. Verilog实现IIC通讯第二版

    HMC5883三轴磁力传感器IIC通讯模块的VerilogHDL的实现 上一版并没有实现我想要的功能 0.0.1版   正在修订中   2013/9/2 //date :2013/7/7 //desi ...

  2. LPC1768的iic通讯

    LPC1768有三路IIC,其中IIC0支持高速模式和plus模式,另外两路是普通IIC,使用IIC的过程如下 首先依然是打开IIC时钟,同时打开GPIO时钟 然后配置引脚为IIC功能 另外,因为ii ...

  3. STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点

    近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...

  4. 基于esp32的IIC通讯

    本文源码地址在:http://download.csdn.net/download/noticeable/9962029 IIC 通讯应该是当代比较常用的几种通讯方式之一,其无需特殊的IO接口,连线方 ...

  5. iic通讯 FPGA实现 mpu6050为例

    IIC最常用的通讯协议,但普遍用于单片机.arm这些,用FPGA实现大材小用,但对于菜鸡水平练练手很不错,考验串并转换和时序的控制.今天我就以mpu6050陀螺仪为例,实现FPGA的iic通信. 1. ...

  6. 「STM32 」IIC通讯原理及其实验

    I2C两线式串行总线通讯协议,它是由飞利浦开发的,主要用于连接微控制器及其外围设备之间,它是由数据线SDA和信号线SCL构成的,可发送和接收数据即在MUC和I2C设备之间,I2C和I2C之间进行全双工 ...

  7. IIC通讯协议(非原创,转载他人,用于学习)

    I2C协议:1.空闲状态 2.开始信号 3.停止信号 4.应答信号 5.数据的有效性 6.数据传输 IIC详解 1.I2C总线具有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL 2.IIC总 ...

  8. IIC通讯程序

    IIC程序 IIC起始信号 void IIC_Start(void) { SDA_OUT();//sda设为输出 IIC_SDA=; IIC_SCL=; delay_us();//延时一段时间,具体时 ...

  9. 填坑-关于IIC通讯

    ​01.概述 在之前的文章中<STM32IIC详解>中详细讲解了IIC协议,并且使用是NXP的官方手册,demo示例使用IIC读取RTC芯片,运行正常,没有任何问题.并且更新了<II ...

随机推荐

  1. linux所有信息查询网址

  2. MyEclipse 8.5整合Git,并在Github上发布项目(转)

    下载Eclipse的git插件——EGit.下载网址http://download.eclipse.org/egit/updates-1.3/org.eclipse.egit-updatesite-1 ...

  3. 牛人眼中如何精通spring?

    现在市场上,spring框架很火,很多公司面试题直接将spring中某个api拿出来考面试人员,我去东南融通就遇到了这个情况,我拒绝做这些没有水准的试题,如果公司非让让我做,我想这样的公司也不值得我来 ...

  4. Android系统智能指针的设计思路(轻量级指针、强指针、弱指针)

    本博客为原创,转载请注明出处,谢谢. 参考博文:Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 C++中最容易出错的地方莫过于指针了,指针问题主要有两类,一是内存泄露,二是无 ...

  5. 基于Visual C++2013拆解世界五百强面试题--题15-递归相加

    有一分数序列: 1/2 , 1/4 , 1/6 , 1/8 ......,用递归的方法,求此数列20项之和. 可以看出规律:每一项位1/n*2 这个很容易些递归,但是要注意一点,使用浮点数相除保存: ...

  6. ubuntu安装hadoop 若干问题的解决

    问题1:安装openssh-server失败 原因: 下列软件包有未满足的依赖关系: openssh-server : 依赖: openssh-client (= 1:5.9p1-5ubuntu1) ...

  7. 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例

    第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...

  8. UISegmentedControl(分页控制器) AND UISlider(滑块控制器)

    - (void)viewDidLoad { [super viewDidLoad]; UIImageView * animatedImageView = [[UIImageView alloc]ini ...

  9. kendo ui grid 汉化

    加入js引用 <link href="http://cdn.kendostatic.com/2014.2.716/styles/kendo.common.min.css" r ...

  10. 2.4.5 用NPOI操作EXCEL--插入图片

    我们知道,在Excel中是可以插入图片的.操作菜单是“插入->图片”,然后选择要插入图片,可以很容易地在Excel插入图片.同样,在NPOI中,利用代码也可以实现同样的效果.在NPOI中插入图片 ...