较复杂时序逻辑电路设计实践一

1、功能图

    M0发送数据给M1,M1存取数据并赋给串行的sda,传给M0。

2、时序图

  由时序图可以看出:说重点就是,这句最重点,理解哈,如果scl=1,那么sda由高变低时刻串行数据流开始;如果scl=1,那么sda由低变高时刻串行数据流结束,如果scl=0,那么我们的sda数据就可以变化了。

3、状态图

  这是描述的时序状态图,我们可以看出,状态图就只是状态,这是时序的状态,注意clk的行为。从状态转换的条件来看,转换成功的关键在于看懂时序图,即:什么条件是代表开始,什么条件代表存数据??

4、M1程序

  1 //M1程序
  2 module ptosda(rst,sclk,ack,scl,sda,data);
  3
  4 input sclk,rst;//外部时钟和复位
  5 input[3:0] data;//外部数据
  6 output ack;//请求
  7 output scl;//m1的时钟
  8 output sda;//M1数据线
  9
 10 reg scl,link_sda,ack,sdabuf;//总线开光,数据串行寄存变量
 11 reg[3:0]databuf;//M1内部数据寄存
 12 reg[7:0]state;//状态变量
 13
 14 //九种状态,怎么想的呢???
 15 parameter     ready=8‘b0000_0000,//等待
 16             start=8‘b0000_0001,//开始
 17             bit1=8‘b0000_0010,//数据1
 18             bit2=8‘b0000_0100,//数据2
 19             bit3=8‘b0000_1000,//数据3
 20             bit4=8‘b0001_0000,//数据4
 21             bit5=8‘b0010_0000,//数据5
 22             stop=8‘b0100_0000,//结束
 23             idle=8‘b1000_0000;//空闲
 24
 25 [email protected](posedge sclk or negedge rst)//先把时钟设置好,就是这样设置的
 26     begin
 27         if(!rst)
 28             scl<=1;//m1的scl时钟需要先是高位
 29         else
 30             scl<=~scl;//这里的数据是sclk的周期的二倍,把sclk的时钟信号传递给了scl,一种方法,5rf你懂的
 31     end
 32
 33 [email protected](posedge ack)//再把数据接受好
 34     databuf<=data;//只要请求到来,就会把数据传给databuf
 35
 36 //------主状态机:产生控制信号,根据databuf中的保存数据,按照协议产生sda串行信号
 37 [email protected](negedge sclk or negedge rst)//这里是sclk 没有用scl用低电平触发
 38     if(!rst)
 39         begin
 40             link_sda<=0;//断开总线
 41             state<=ready;//进入准备状态
 42             sdabuf<=1;//m1传输数据总线打开
 43             ack<=0;//请求置0
 44         end
 45     else
 46         begin
 47             case(state)
 48                 ready:
 49                     if(ack)//
 50                         begin
 51                             link_sda<=1;//sda的总线打开
 52                             state<=start;//进入另外的开始阶段
 53                         end
 54                     else
 55                         begin
 56                             link_sda<=0;//sda 总线关闭
 57                             state<=ready;
 58                             ack<=1;//请求数据
 59                         end
 60                 start:
 61                     if(scl&&ack)//scl是高电平传状态,低电平传数据
 62                         begin
 63                             sdabuf<=0;//sdabuf寄存0
 64                             state<=bit1;//进入bit1状态
 65                         end
 66                     else
 67                         state<=start;//等待scl高电平到来
 68                 bit1:
 69                     if(!scl)
 70                         begin
 71                             sdabuf<=databuf[3];//sdabuf寄存高位数据
 72                             state<=bit2;//进入bit2状态
 73                             ack<=0;//关闭请求
 74                         end
 75                     else
 76                         state<=bit1;//等待scl变低电平,似乎是
 77                 bit2:
 78                     if(!scl)
 79                         begin
 80                             sdabuf<=databuf[2];
 81                             state<=bit3;
 82                         end
 83                     else
 84                         state<=bit2;
 85                 bit3:
 86                     if(!scl)
 87                         begin
 88                             sdabuf<=databuf[1];
 89                             state<=bit4;
 90                         end
 91                     else
 92                         state<=bit3;
 93                 bit4:
 94                     if(!scl)
 95                         begin
 96                             sdabuf<=databuf[0];
 97                             state<=bit5;
 98                         end
 99                     else
100                         state<=bit4;
101
102                 bit5:
103                     if(!scl)
104                         begin
105                             sdabuf<=0;
106                             state<=stop;
107                         end
108                     else
109                         state<=bit5;
110                 stop:
111                     if(scl)
112                         begin
113                             sdabuf<=1;
114                             state<=idle;
115                         end
116                     else
117                         state<=stop;
118                 idle:
119                     begin
120                         link_sda<=0;
121                         state<=ready;
122                     end
123                 default:
124                     begin
125                         link_sda<=0;
126                         state<=1;
127                         state<=ready;
128                     end
129             endcase
130
131         end
132
133 endmodule
时间: 2024-10-20 05:51:49

较复杂时序逻辑电路设计实践一的相关文章

v3学院带你学习-时序逻辑中时钟上升沿对齐数据变化时的处理技巧的FPGA实现

此文章为原创出自 V3学院 www.v3edu.org 时序逻辑中,数据都是在时钟的上升沿或者下降沿时刻进行采样的,以上升沿为例,时钟采数据时应该采的是时钟上升沿左边变量的值,运算的结果体现在时钟上升沿的右边,但是,在用modelsim等一些仿真工具进行仿真的时候,如果时钟上升沿刚好和数据变化对齐,就会出现与上述理论不一致的原因,如下仿真波形图: 上图中的例子是用时钟上升沿控制变量a和b按位或运算并且把结果赋值给c的小实验,根据前面说的理论,黄线位置处,时钟上升沿采的变量a和b的值都为0,进行或

verilogHDL设计中的同步时序逻辑

引用自夏宇闻教授 1.同步时序逻辑: 是指表示状态的寄存器组的值只能在唯一确定的触发条件发生改变. 只能由时钟的正跳变沿或者负跳变沿触发的状态机就是一例,[email protected](posedge clk). 1.1同步时序逻辑的优点: 同步时序逻辑比异步时序逻辑稳定简单好多,由此我们有一个规定:用verilog来设计可综合的状态机必须使用同步时序逻辑. 2.异步时序逻辑: 是指触发条件有多个控制因素组成,任何一个因素的跳变都可以引起触发.寄存器组的时钟输入端不是都连接在同一个时钟信号上

sv时序组合和时序逻辑

1 input a; 2 input b; 3 input c; 4 reg d; 5 wire e; 6 reg f; 7 8 // 时序逻辑,有寄存器 9 always@(posedge clk)begin 10 if(a==1'b1)begin 11 d <= b; 12 end else begin 13 d <= c; 14 end 15 end 16 17 // 组合逻辑 18 assign e = d & a; 19 20 //时序逻辑 21 always@(posedg

Unity游戏逻辑服务器实践

0x01:前言 由于服务器需要做客户端战斗模拟,我们的服务器是用python写的,理所当然我们战斗服务器也采用python重写了一套战斗服务器,遇到了哪些问题: 1.浮点数运算精度问题 2.运行效率问题 3.Unity核心库源码问题 0x02:奇思妙想 我们团队内部想,既然客户端有现成的代码,何不自己实现网络通信部分,把战斗部分代码剥离出来,直接用Unity导出运行文件不就行了,况且Unity支持跨平台.好吧又一次我们天真了.遇到问题: 1.线上服务器的操作系统版本,Unity不支持 2.线上服

计算机系统要素-第三章 时序逻辑

1 本章介绍时钟和触发器,构建记忆单元.触发器是具有记忆功能的最小记忆单元,能够存储一个bit位. 2 设计计算机时钟时,时钟周期的长度要比1个比特在计算机两个物理距离最长的芯片之间的传输时间稍长. 3 D触发器 4 寄存器 1) 1比特位寄存器 /** * 1-bit register: * If load[t] == 1 then out[t+1] = in[t] * else out does not change (out[t+1] = out[t]) */ CHIP Bit { IN

《Verilog数字系统设计教程》第3版 夏宇闻

目录 [toc] 第1章 Verilog的基本知识 数字电路系统设计: 从上到下(从抽象到具体)逐层描述自己的设计思想,用一系列分层的模块来描述极其复杂的数字系统. 利用EDA工具逐层进行仿真验证 将需要编程具体物理电路的模块组合经过自由综合工具转换到门级电路网表. ASIC或者FPGA实现功能. Verilog HDL和VHDL的比较: 重点是Verilog简单啊,入门容易. 逻辑网表EDIF: EDIF是电子设计交换格式(Electronic Design Interchange Forma

Verilog学习笔记01

作者:桂. 时间:2017-06-24  11:07:40 链接:http://www.cnblogs.com/xingshansi/p/7039237.html 前言 Verilog是硬件描述语言,不算FPGA的核心部分,以前没有接触过,找了本书翻看一下(<Verilog数字系统设计教程第三版>),顺便记录一些基础知识,从第三章开始. 第三章:模块结构.基本数据类型.基本运算符 A-模块的结构 0.模块基本定义 一个基本的模块就是: module name(in1,in2,...out1,o

FPGA学习笔记(四)——Verilog基本语法

###### [该随笔部分内容转载自小梅哥] ######### 组合逻辑:    多路选择器.加法器.译码器.乘法器 时序逻辑:    计数器.分频器.定时器.移位寄存器 一.Verilog文件的基本结构 1.模块声明     模块名    端口列表 2.端口类型.位宽定义 3.功能描述 //模块描述方式一(先列出端口,再描述端口类型) //此方式虽然行数多,但是方便后面例化端口,推荐使用 module name( , , //最后一个不需要"," ); //端口类型描述 //功能描

UML建模——使用EA工具开发时序图实践及经验

Enterprise Architect(以下简称EA)是一款基于OMG UML的可视化模型与设计工具,提供了对软件系统的设计和构建.业务流程建模和基于领域建模的支持,被企业和组织不仅应用于对系统的建模,还用于推进模型在整个应用程序开发周期中实现. 在EA工具建模平台上,提供如下常用设计模型: Business Process   业务流程模型 Requirements   需求分析模型 Use Case       用例模型 Domain Model    领域模型 Class