基础项目(3)三态门程序设计讲解

写在前面的话

我们所接触到的IO都是单纯的输入(input)或者输出(output)类型,而我们的一些总线协议如IIC等,要求信号为三态类型,也就是我们所说的输入输出(inout)类型。那么,本节梦翼师兄将和大家一起来探讨三态门的用法。

项目需求

设计一个三态门电路,可以实现数据的输出和总线“挂起”。

系统架构

模块功能介绍


模块名


功能描述


three_state


控制三态总线Sda是否处于挂起状态

顶层模块端口描述


端口名


端口说明


Clk


系统时钟


Rst_n


系统低电平复位


Data_buf


外部待传输数据输入


Sda


三态数据总线

代码解释

三态门模块代码


/****************************************************

*   Engineer      :   梦翼师兄

*   QQ             :   761664056

*   The module function:三态门模块

*****************************************************/

00  module three_state(

01                          //系统输入

02                          clk,//系统50M输入

03                          rst_n,//低电平复位信号

04                          data_buf,

05                          //系统输出

06                          sda//三态总线

07                     );

08  //-------------------系统输入-------------------

09  input clk;//系统50M输入

10  input rst_n;//低电平复位信号

11  input data_buf;//待传输数据

12  //-------------------系统输出-------------------

13  inout sda;//三态总线

14  //------------------寄存器定义------------------

15  reg flag;//三态门开关定义

16  reg [10:0]counter;//计数器定义

17  //------------------三态门赋值------------------

18  assign sda=(flag==1)?data_buf:1‘bz;

19  //----------------开关控制计数器----------------

20  always@(posedge clk or negedge rst_n)

21      begin

22          if(!rst_n)

23              begin

24                  counter<=0;//计数器复位

25              end

26          else

27              begin

28                  if(counter<25)//计数器范围

29                      counter<=counter+1;//计数器累加

30                  else

31                      counter<=0;//计数器清零

32              end

33      end

34  //----------------开关/数据控制-----------------

35  always@(posedge clk or negedge rst_n)

36      begin

37          if(!rst_n)

38              begin

39                  flag<=0;//开关关闭

40              end

41          else

42              begin

43                  if(counter==25)

44                      flag<=~flag;//开关信号翻转

45              end

46      end

47  endmodule

第18行代码就是三态门的赋值方式,三态门什么时候作为输出、什么时候作为输入是由开关信号flag控制的。当开关信号flag==1,Sda的值等于待发送的数据data_buf(此时,Sda相当于是output类型),当开关信号flag==0,Sda的值变成高阻态(此时,Sda相当于是input类型)。

第20~33行代码为我们设计的一个定时器,用来控制开关信号的翻转。

第43~44行代码表示当定时器到达预定值,开关电平开始翻转。

三态门模块测试代码


/****************************************************

*   Engineer      :   梦翼师兄

*   QQ             :   761664056

*   The module function:三态门测试模块

*****************************************************/

00  `timescale 1ns/1ns

01  module tb;

02  //-------------------系统输入-------------------

03  reg clk;//系统50M输入

04  reg rst_n;//低电平复位信号

05  reg data_buf;//待传输数据

06  //-------------------系统输出-------------------

07  wire sda;//三态总线

08  //-------------------测试激励-------------------

09  initial

10      begin

11          clk=0;//时钟赋初值

12          rst_n=0;//系统上电复位

13          data_buf=0;//data_buf赋初值

14          #1000 rst_n=1;//复位结束

15          #1000 data_buf=1;

16          #1000 data_buf=0;

17          #1000 data_buf=1;

18          #1000 data_buf=0;

19      end

20

21  always #10 clk=~clk;//产生50MHZ时钟

22  //-------------------模块实例化-------------------

23  three_state three_state(

24          //系统输入

25          .clk(clk),//系统50M输入

26          .rst_n(rst_n),//低电平复位信号

27          .data_buf(data_buf),

28          //系统输出

29          .sda(sda)//三态总线

30       );

31  endmodule

14~18行代码,模拟的是待传输数据的变化

仿真分析

由仿真波形可以看出,当开关关闭(flag==0),Sda总线放开,处于高阻状态,此时外部数据可以输入,相当于我们模块的输入。

当开关打开(flag==1),Sda等于data_buf的值,说明此时,Sda相当于我们模块的输出。

原文地址:https://www.cnblogs.com/mengyi1989/p/11518272.html

时间: 2024-11-07 09:05:14

基础项目(3)三态门程序设计讲解的相关文章

C语言零基础项目驱动式学习第一天

引言: 智能手机(Smart Phone)是一种运算能力及功能比传统手机更强的手机.目前的操作系统基本上有以下几种: 1. Symbian Os 众所周知塞班隶属于NOKIA,Symbian开发之初的目标是保证在较低资源的设备上能长时间的运行,这导致了塞班的应用程序开发有着较为陡峭的学习路线,开发成本高,但是程序的运行的效率很高> 2.Android 开源, 联盟,Android凝聚了几乎遍布全球的力量,这是Android形象及声音能够被传到全球移动互联网市场每一个角落的根本原因.不过, 1).

C语言零基础项目驱动式学习第四天

//类型修饰符  数组名[数组元素个数] = {初始化}; //定义数组的时候[]中必须是常量表达式, 不可以是变量; /* int age[5] = {21, 18, 25, 20, 18}; int array[10] = {0};//代表数组中有10个元素, 每个都是0; int array1[8] = {1};//代表数组中有8个元素,第一个是1,其余的为0; int age2[2 + 3] = {0}; */ //定义数组和使用数组的最大区别是, 前面是否有类型修饰符 //使用数组元素

C语言零基础项目驱动式学习第二天

//BOOL 类型是一种非真即假的数据类型,取值只有YES和NO, //BOOL 其实是OC中得数据类型,在C语言中,认为非0即为真. //BOOL 类型规定的存储空间为一个字节. //    BOOL a = YES; //    BOOL b = NO; //    printf("a = %d, b = %d\n", a, b); //    int a = 15, b = 18; //    BOOL c = a > b; //    printf("c = %

C语言零基础项目驱动式学习第三天

一 while循环二do   while循环三 for循环for循环的执行顺序用如下表达式: for(expression1;expression2;expression3)        循环变量初值; 循环条件; 循环变量增量  {                expression4; }       执行的顺序应该是: 1)第一次循环,即初始化循环.      首先执行表达式expression1(一般为初始化语句):再执行expression2(一般为条件判断语句),判断express

Android基础——项目的文件结构(三)

Android基础--项目的文件结构(三) 代码源文件夹与资源文件夹 [注]此项目文件结构仅限于Android Studio下的Android项目!!! 在一个Android项目中,代码源文件夹有4个,分别是java.jni.aidl.rs,资源文件夹有3个,分别是assets.res.resources.(这里的文件夹名称是在project视图下的名称,如有疑问可参考Android基础--项目的文件结构(一)Android视图与Project视图对比) 文件夹路径及概要说明如下表所示: Pro

android项目的目录结构讲解

参考书籍:<第一行代码Android> 一:android项目的目录结构讲解 1..gradle和.idea ? ??? ? 这两个目录下放置的都是Android Studio自动生成的一些文件,我们无须关心,也不要去手动编辑. 2.app ? ??? ? 项目中的代码.资源等内容几乎都是放置在这个目录下的,我们后面的开发工作也基本都是在这个目录下进行的,待会儿还会对这个目录单独展开进行讲解. 3.build ? ??? ? 这个目录你也不需要过多关心,它主要包含了一些在编译时自动生成的文件.

electron+react-redux-saga基础项目配置

electron-react-base 基于electron + react + redux + saga的基础项目配置github:https://github.com/maichonglyd/electron-react-base 项目结构: app 最终要打包的目录 build 调试项目时打包的目录 flow flow语法定义目录 img 图片目录 scss 界面样式目录 src 界面代码目录 webpack webpack打包配置目录 src下目录结构: components 界面组件目

基础项目(6)基于尖峰脉冲的按键消抖程序设计讲解

 写在前面的话 我们通常所用的按键开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会马上断开.因而在闭合及断开的瞬间均伴随有一连串的抖动,为了避免这种现象造成的干扰而作的措施就是按键消抖. 抖动时间的长短由按键的机械特性决定,一般为5ms-10ms.按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒.键抖动会引起一次按键被误读多次.为确保智能单元对按键的一次闭合仅作一次处理,必须消除键抖动.在按键闭合

基础项目(5)任意时钟分频程序设计讲解

写在前面的话 在数字逻辑电路设计中,分频器是一种基本的电路单元.通常用来对某个给定频率进行分频,以得到所需的频率.分频在FPGA的设计中一直都担任着很重要的角色,而说到分频,我相信很多人都已经想到了利用计数器计数来得到想要的时钟频率,但问题是仅仅利用计数器来分频,只可以实现偶数分频,而如果需要三分频.五分频.七分频等等奇数类分频,那应该怎么办呢?在这里,梦翼师兄为大家介绍一种可以实现任意整数分频的方法. 实现原理 这种方法同样也是利用了计数器来实现,当然我们是使用状态机来实现的.我们首先定义分频