利用状态机实现比较复杂的接口设计:

这是一个将并行数据转换为串行输出的变换器,利用双向总线输出。这是由EEPROM读写器的缩减得到的,首先对I2C总线特征介绍:

I2C总线(inter integrated circuit)双向二线制串行总线协议为:只有总线处于“非忙”状态时,数据传输才开始。在数据传输期间,只要时钟线为高电平,数据线都必须保持稳定,否则数据线上的任何变化都被当作“启动”或“停止”信号。

下面介绍A、B、C、D的工作状态:

(1)总线处于非忙状态(A段):该段内的数据线(sda)和时钟线(scl)都保持高电平;

(2)启动数据传输(B段):当时钟线(scl)为高电平时,数据线(sda)由高电平变为低电平的下降沿被认为是“启动”信号;

(3)停止数据传输(C段):当时钟线(scl)为高电平时,数据线(sda)由低电平变为高电平的上升沿被认为是“停止”信号;

(4)数据有效(D段):在出现“启动”信号之后,在时钟线(scl)为高电平时,数据线是稳定的,这是数据线上的数据就是要传送的数据,数据线上的数据改变必须在时钟线(scl)为低电平期间完成,每个数据占用一个时钟;

(5)应答信号:每个正在接受数据的EEPROM在接收到一个字节的数据后,通常需要发出一个应答信号;而每个正在发送数据的EEPROM在发出一个字节的数据后,通常需要接受一个应答信号;EEPROM读写控制器必须提供一个与这个应答信号相联系的二外的始终脉冲。

其控制字节一共有8位:1010xxxW/R 其中1010是I2C总线器件特征编码,xxx表示地址,W/R表示读写状态。

在实现并行输入串行输出时,需要两个状态机:

主状态机主要控制内部存储器和输入端的连接,以及给出应答信号;从状态机主要负责总线连接时,内部寄存器的最高位输出个移位;

状态机的源码如下:

  1. module parallel_to_serial(rst,clk,addr,data,sda,ack);
  2. input rst,clk;
  3. input [:]data,addr;
  4.  
  5. inout sda; //data bus
  6. output ack; //ask for next address/data writting wo eeprm;
  7. reg link_write; //whether connect to output
  8. reg [:]state; //main status,
  9. reg [:]sh8out_state; //serial output status
  10. reg [:]sh8out_buf; //output data buffer
  11. reg finish_F; //whether finished an operation of main status
  12. reg ack;
  13.  
  14. parameter idle=, addr_write='d1, data_write=3'd2, stop_ack='d4; //main status code
  15. parameter bit0=, bit1=, bit2=, bit3=, bit4=, bit5=, bit6=, bit7=; //serial output status code
  16.  
  17. assign sda=link_write?sh8out_buf[]:'bz; //???????????
  18.  
  19. always @(posedge clk)
  20. begin
  21. if(!rst) //reset
  22. begin
  23. ack<=;
  24. link_write<=; //???????
  25. finish_F<=;
  26. state<=idle;
  27. sh8out_state<=idle;
  28. sh8out_buf<=;
  29. end
  30. else
  31. case(state)
  32. idle:begin
  33. link_write<=; //??????
  34. ack<=;
  35. finish_F<=;
  36. sh8out_buf<=addr; //???????
  37. sh8out_state<=idle;
  38. state<=addr_write; //???????
  39. end
  40. addr_write:begin
  41. if (finish_F==) begin shift8_out;end //???????
  42. else
  43. begin
  44. link_write<=;
  45. ack<=;
  46. finish_F<=;
  47. sh8out_buf<=data; //???????
  48. state<=data_write;
  49. sh8out_state<=idle;
  50. end
  51. end
  52. data_write:begin
  53. if (finish_F==) begin shift8_out;end //???????
  54. else
  55. begin
  56. link_write<=;
  57. finish_F<=;
  58. state<=stop_ack;
  59. ack<=; //????????
  60. end
  61. end
  62. stop_ack:begin //????
  63. ack<=;
  64. state<=idle;
  65. end
  66. endcase
  67. end
  68.  
  69. task shift8_out; //???????
  70. begin
  71. case(sh8out_state)
  72. idle:begin
  73. link_write<=; //?????????????????17?assign sda=link_write?sh8out_buf[7]:1'bz; sda??????????sh8out_buf?????
  74. sh8out_state<=bit7;
  75. end
  76. bit7:begin
  77. link_write<=;
  78. sh8out_buf=sh8out_buf<<; //?????data?????bit6
  79. sh8out_state<=bit6;
  80. end
  81. bit6:begin
  82. link_write<=;
  83. sh8out_buf=sh8out_buf<<;
  84. sh8out_state<=bit5;
  85. end
  86. bit5:begin
  87. link_write<=;
  88. sh8out_buf=sh8out_buf<<;
  89. sh8out_state<=bit4;
  90. end
  91. bit4:begin
  92. link_write<=;
  93. sh8out_buf=sh8out_buf<<;
  94. sh8out_state<=bit3;
  95. end
  96. bit3:begin
  97. link_write<=;
  98. sh8out_buf=sh8out_buf<<;
  99. sh8out_state<=bit2;
  100. end
  101. bit2:begin
  102. link_write<=;
  103. sh8out_buf=sh8out_buf<<;
  104. sh8out_state<=bit1;
  105. end
  106. bit1:begin
  107. link_write<=;
  108. sh8out_buf=sh8out_buf<<;
  109. sh8out_state<=bit0;
  110. end
  111. bit0:begin
  112. link_write<=;
  113. finish_F<=;
  114. end
  115. endcase
  116. end
  117. endtask
  118. endmodule

测试程序:

  1. `timescale 1ns/1ns
  2. `define clk_period
  3. module parallel_to_serial_test;
  4. reg rst,clk;
  5. reg [:]data,addr;
  6. wire ack,sda;
  7. wire [:]state; //main status,
  8. wire [:]sh8out_state;
  9.  
  10. initial
  11. begin
  12. clk=;
  13. rst=;
  14. data=;
  15. addr=;
  16. #(*`clk_period) rst=;
  17. #(*`clk_period) rst=;
  18. #(*`clk_period) $stop;
  19. end
  20.  
  21. always # clk=~clk;
  22.  
  23. always @(posedge clk)
  24. begin data=data+; addr=addr+; end
  25.  
  26. parallel_to_serial m(
  27. .rst(rst),
  28. .clk(clk),
  29. .addr(addr),
  30. .data(data),
  31. .sda(sda),
  32. .ack(ack)
  33. );
  34.  
  35. assign state=m.state;
  36. assign sh8out_state=m.sh8out_state;
  37. endmodule

波形信号:

Verilog学习笔记简单功能实现(七)...............接口设计(并行输入串行输出)的更多相关文章

  1. Verilog学习笔记简单功能实现(八)...............同步FIFO

    Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...

  2. Verilog学习笔记简单功能实现(二)...............全加器

    先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有:   Xi     Yi    Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...

  3. Verilog学习笔记简单功能实现(六)...............计数分频电路

    在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...

  4. Verilog学习笔记简单功能实现(五)...............序列检测设计

    这里采用夏宇闻教授第十五章的序列检测为例来学习; 从以上的状态转换图可以写出状态机的程序: module seqdet(x,out,clk,rst); input x,clk,rst; output ...

  5. Verilog学习笔记简单功能实现(三)...............同步有限状态机

    在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...

  6. Verilog学习笔记简单功能实现(四)...............译码器和编码器

    这里以简单的3-8译码器和8-3编码器为例: module decoder3_8(a,out); :]a; :]out; 'b1<<a;/*把最低位的1左移in位(根据in口输入的值)并赋 ...

  7. Verilog学习笔记简单功能实现(一)...............D触发器

    module D_flop(data,clk,clr,q,qb); input data,clk,clr; output q,qb; wire a,b,c,d,e,f,ndata,nclk; nand ...

  8. Verilog学习笔记简单功能实现(八)...............异步FIFO

    基本原理:       1.读写指针的工作原理 写指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0). 读指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0). ...

  9. Spring框架学习笔记(9)——API接口设计相关知识及具体编码实现

    最近需要设计一个API服务器,想要把API接口搞得规范一下,就通过网上搜集到了一些资料,以下便是自己的一些理解以及相关的具体实现 本文采用的是spring boot+maven的方案 restful规 ...

随机推荐

  1. Atitit 图像金字塔原理与概率 attilax的理解总结qb23

    Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔  (  Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...

  2. stackView的隐藏与显示注意事项

    1.想要通过变换stackView的y值来让stackView显现/隐藏,同时让其中的button能点击响应,得用topCons 2.导航栏的tinBar要设置为非透明状态

  3. 理解模板引擎Razor 的原理

    Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.简洁的语法与.NET Framework 结合,广泛应用于ASP.NET MVC 项目.Razor Pad是一 ...

  4. ProgressBar 源码

    /** * @FileName CircleProgressBar.java * @Package com.read.view * @Description TODO * @Author Alpha ...

  5. javascript中的错误处理机制

    × 目录 [1]对象 [2]类型 [3]事件[4]throw[5]try[6]常见错误 前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较 ...

  6. 【转载】经典SQL语句大全

    [原文地址]http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html 一.基础 1.说明:创建数据库CREATE DATABAS ...

  7. 解决firefox和IE9对icon font字体的跨域访问问题

    何为跨域访问,为什么会有跨域限制?一切还得从浏览器的同源策略说起. 同源策略:是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能会受到影响,可以说Web是构建在同源策略基础 ...

  8. 24个 HTML5 & CSS3 下拉菜单效果及制作教程

    下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...

  9. 【转】 制作Android Demo GIF:程序演示效果GIF图录制

    在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.(生成动画的工具:Ulead GIF Animator),可以讲单独的图片生成 ...

  10. chrome dev debug network 的timeline说明

    在使用chrome的时候F12的开发者工具中有个network,其中对每个请求有个timeline的说明,当鼠标放上去会有下面的显示: 这里面的几个指标在说明在chrome使用文档有说明: 下面我用人 ...