方法2—并行数据流转换为一种特殊串行数据流模块的设计,

news2024/11/17 3:54:17

并行数据流转换为一种特殊串行数据流模块的设计,设计两个可综合的电路模块

    • 1,第一个可综合模块,M1。
    • 2,描述M2模块
    • 3,描述M0模块的Verilog代码
    • 4,描述顶层模块
    • 5,电路生成的门级网表,netlist
    • 6,前仿真波形验证

参考文献1
参考文献2

并行数据流转换为一种特殊串行数据流模块的设计:
设计两个可综合的电路模块,第一个模块(M1)能把4位的并行数据转换为符合以下协议的串行数据流,数据流用scl和sda两条线传输,sclk为输入的时钟信号,data[3:0]为输入数据,ack为M1请求M0发新数据信号。第二个模块(M2)能把串行数据流内的信息接收到,并转换为相应16条信号线的高电平,即若数据为1,则第一条线路为高电平,数据为n,则第N条线路为高电平。M0为测试用信号模块。该模块接收M1发出的ack信号,并产生新的测试数据[3:0].

在这里插入图片描述

1,第一个可综合模块,M1。

第一个模块M1能把4位的并行数据转换为符合以下协议的串行数据流,数据流用scl和sda两条线传输,sclk 为输入的时钟信号,data[3:0]为输入数据,ack为M1请求M0发新数据信号。

通信协议: scl为不断输出的时钟信号,如果scl为高电平时,sda由高变低时刻,串行数据流开始;如果scl为高电平时,sda由低变高时刻,串行数据结束。sda信号的串行数据位必须在scl为低电平时变化,若变为高则为1,否则为0.

模块功能,按照设计要求,把输入的 4位 并行数据转换为 协议要求的串行数据流,并由scl 和sda配合输出
本模块为RTL 可综合模块,已通过综合后 门级网表 仿真

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/11/21 11:25:20
// Design Name: 
// Module Name: ptosda
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


// 并行数据流转换为一种特殊串行数据流模块的设计
// 模块功能,按照设计要求,把输入的 4位 并行数据转换为 协议要求的串行数据流,
// 并由scl 和sda配合输出
// 本模块为RTL 可综合模块,已通过综合后 门级网表 仿真

module ptosda(rst, sclk, ack, scl, sda, data);
input  sclk, rst;
       // sclk,输入的时钟信号

input  [3:0] data;     // 并行口数据输入
output ack;            // 请求新的转换数据
output scl;            // 通信协议,scl为不断输出的时钟信号
                              // scl是1, sda由1变0,串行数据流开始;
                              // scl是0, sda由0变1,串行数据流结束;

output sda;            // 定义sda为单向的串行输出
// inout sda;

reg    scl, link_sda, ack, sdabuf;      // 不断输出时钟信号
                  // 连接 sda        // 设计 一个寄存器
               // ask_for_new_data
                    // sda 缓存器      // 设计 一个寄存器  

reg  [3:0] databuf;         // 数据 缓存器 ,用来接收 data 数据
reg  [7:0] state;           // 状态


out16hi m2(.scl(scl), .sda(sda), .outhigh());
assign sda = link_sda?sdabuf:1'b0;   // link_sda 控制 sdabuf 输出到串行总线上
// assign sda = link_sda?sdabuf:1'bz;  // link_sda 控制 sdabuf 输出到双向串行总线上

parameter  ready = 8'b0000_0000,     // 设计  9个  状态参数
            start = 8'b0000_0001,
            bit1  = 8'b0000_0010,
            bit2  = 8'b0000_0100,
            bit3  = 8'b0000_1000,
            bit4  = 8'b0001_0000,
            bit5  = 8'b0010_0000,
            stop  = 8'b0100_0000,
            idle  = 8'b1000_0000;
  
always@(posedge sclk or negedge rst)   // 由输入的  sclk时钟信号  产生串行输出时钟scl
  if(!rst)
          scl <= 1;
  else 
          scl <= ~scl;

always@(posedge ack)   // 请求新数据时 存入 并行总线上 要转换的数据
          databuf <= data;

// 主状态机,产生控制信号,根据databuf 中保存的数据,按照协议产生sda串行信号

// always@(posedge sclk or negedge rst)
always@(negedge sclk or negedge rst)
  if(!rst)  begin
           link_sda <= 0;       // 把 sdabuf 与 sda 串行总线断开
           state    <= ready;
           sdabuf   <= 1;  
           ack      <= 0;       // 请求新数据置0
     end
  else begin
  	  case(state)
  	    ready: if(ack)    // 并行数据已经到达
  	           begin
  	                 link_sda <= 1;    // 把 sdabuf 与 sda 串行总线连接
  	                 state    <= start;    // 
  	            end
  	           else       // 并行数据尚未到达
  	            begin
  	                  link_sda <= 0;    // 把 sda 总线让出,若前面把 sda 定义成双向串行总线,
  	                                    // 则此时 sda 可作为输入

  	                  state    <= ready;
  	                  ack      <= 1;	  // 请求新数据信号置 1 
  	            end
  	    start: if(scl && ack)     // 产生 sda 的开始信号
  	            begin
  	           	      sdabuf   <= 0;    // 在 sda 连接的前提下,输出开始信号
  	           	      state    <= bit1;
  	            end
  	           else 
  	                  state   <= start;
  	    bit1:   if(!scl)          // 在 scl 为低电平时送出最高位 databuf[3]
  	             begin
  	              	   sdabuf <= databuf[3];
  	              	   state  <= bit2;
  	              	   ack    <= 0;
    	         end
    	        else 
    	                state <= bit1;
    	bit2:   if(!scl)          // 在 scl 为低电平时送出次高位 databuf[2]
    	          begin
    	          	   sdabuf <= databuf[2];
    	          	   state  <= bit3;
    	          end
    	        else 
    	               state  <= bit2;
        bit3:   if(!scl)          // 在 scl 为低电平时送出次低位 databuf[1]
                  begin
                  	   sdabuf <= databuf[1];
                  	   state  <= bit4;
                  end
                else 
                       state   <= bit3;
        bit4:   if(!scl)          // 在 scl 为低电平时送出最低位 databuf[0]
                  begin
                  	   sdabuf <= databuf[0];
                  	   state  <= bit5;
                  end
                else 
                       state  <= bit4;
        bit5:   if(!scl)          // 为产生结束信号做准备,先把 sda 变为低
                  begin
                  	   sdabuf <= 0;
                  	   state  <= stop;
                  end
                else 
                       state  <= bit5;
        stop:   if(scl)          // 在scl为高时,把 sda 由低变高 产生结束信号
                  begin
                  	   sdabuf <= 1;
                  	   state  <= idle;
                  end
                else 
                       state  <= stop;
        idle:     begin
        	            link_sda <= 0;        // 把 sdabuf 与 sda 串行总线脱开
        	            state    <= ready;
           	  //          sdabuf   <= 1;
                  end 
        default:  begin
                        link_sda <= 0;
                        sdabuf   <= 1;
                        state    <= ready;	
                  end
        endcase
     end

endmodule

2,描述M2模块

模块功能: 按照协议接收串行数据,进行处理并按照数据值在相应位输出高电平;
本模块为RTL可综合模块,已通过综合后门级网表仿真。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/11/21 11:29:07
// Design Name: 
// Module Name: out16hi
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

// 描述 M2 模块的Verilog 代码
// 模块功能,按照协议接收 串行数据,进行处理 并按照数据值 在相应位 输出高电平
// 本模块为 RTL可综合模块,已通过综合后 门级网表仿真

module out16hi(scl, sda, outhigh);

input         scl, sda;   // 串行数据输入
output [15:0] outhigh;   // 根据输入的串行数据设置高电平位
reg    [5:0]  mstate;    // synthesis preserve*/;
        // 本模块的主状态
        //  /* synthesis preserve*/ 为综合指令, 使综合器布局布线后仍能保留状态信号,
        // 以便于观察,不同的综合器综合指令并不相同,必须参考综合器的技术资料才能掌握
// 

reg [3:0] pdata,  pdatabuf;
                           // 记录串行数据位时, 用寄存器和最终数据寄存器

reg [15:0] outhigh;     // 输出 位寄存器;

reg  startflag, endflag; // 数据开始和结束标志

//   always@(posedge sda)
always@(negedge sda)
   if(scl)
           startflag <= 1;     // 串行数据开始标志
   else if(endflag)
           startflag <= 0;

always@(posedge sda)
   if(scl)  begin
                   endflag   <= 1;        //  串行数据 结束标志
                   pdatabuf  <= pdata;    // 把收到的 4位数据 存入寄存器
            end
   else 
                   endflag   <= 0;        // 数据接收还没有结束

parameter  ready = 6'b00_0000,
            sbit0 = 6'b00_0001,
            sbit1 = 6'b00_0010,
            sbit2 = 6'b00_0100,
            sbit3 = 6'b00_1000,
            sbit4 = 6'b01_0000;

//always@( padabuf)         // 把收到的数据变为相应位的高电平
always@(pdatabuf)        // 把收到的数据变为相应位的高电平
    begin
    	case(pdatabuf)
    	    4'b0001: outhigh = 16'b0000_0000_0000_0001;
    	    4'b0010: outhigh = 16'b0000_0000_0000_0010;
    	    4'b0011: outhigh = 16'b0000_0000_0000_0100;
    	    4'b0100: outhigh = 16'b0000_0000_0000_1000;

    	    4'b0101: outhigh = 16'b0000_0000_0001_0000;
    	    4'b0110: outhigh = 16'b0000_0000_0010_0000;
    	    4'b0111: outhigh = 16'b0000_0000_0100_0000;
    	    4'b1000: outhigh = 16'b0000_0000_1000_0000;

    	    4'b1001: outhigh = 16'b0000_0001_0000_0000;
    	    4'b1010: outhigh = 16'b0000_0010_0000_0000;
    	    4'b1011: outhigh = 16'b0000_0100_0000_0000;
    	    4'b1100: outhigh = 16'b0000_1000_0000_0000;

    	    4'b1101: outhigh = 16'b0001_0000_0000_0000;
    	    4'b1110: outhigh = 16'b0010_0000_0000_0000;
    	    4'b1111: outhigh = 16'b0100_0000_0000_0000;
    	    4'b0000: outhigh = 16'b1000_0000_0000_0000;
        endcase
    end

always@(posedge scl)    // 在检测到开始标志后, 每次 scl 正跳变 沿 时接收数据,共 4位
   if(startflag)
      case(mstate)
         sbit0:  begin
         	      mstate   <= sbit1;
         	      pdata[3] <= sda;
         	      $display("I am in sdabit0");
            end
         sbit1: begin
         	      mstate   <= sbit2;
                  pdata[2] <= sda;
                  $display("I am in sdabit1");
            end
         sbit2: begin
         	      mstate   <= sbit3;
         	      pdata[1] <= sda;
         	      $display("I am in sdabit2");
            end
        sbit3: begin
                  mstate   <= sbit4;
                  pdata[0] <= sda;
                  $display("I am in sdabit3");    	
            end
        sbit4: begin
        	      mstate   <= sbit0;
        	      $display("I am in sdastop");
            end
        default:  mstate <= sbit0;
       endcase
    else 
                   mstate <= sbit0;

endmodule

3,描述M0模块的Verilog代码

模块功能: 本模块产生测试信号对设计中的模块进行测试。
本模块只用于测试,不能通过综合转换为电路。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/11/21 14:03:48
// Design Name: 
// Module Name: sigdata
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

// 描述 M0 模块的 Verilog代码如下:
// 模块功能:本模块产生测试信号对设计中的模块进行测试
// 本模块只用于测试,不能通过综合转换为电路
`timescale 1ns/1ns
`define halfperiod 50
module sigdata(rst, sclk, data, ask_for_data
	);
output    rst;             // 复位信号
output    [3:0] data;      // 输出的数据信号
output    sclk;            // 输出的时钟信号
input     ask_for_data;    // 从并串转换器来的请求数据信号

reg       rst, sclk;
reg       [3:0] data;

initial  begin
                 	   rst = 1;
                 #10   rst = 0;
#(`halfperiod * 2 + 3) rst = 1;

end

initial  begin
	sclk = 0;
	data = 0;
#(`halfperiod * 1000) $stop;

end

always #(`halfperiod)  sclk = ~sclk;    // 产生第一个模块需要的输入时钟
// 每次请求新数据信号的整跳变沿,等一段时间后将输出数据增加1

always@(posedge ask_for_data)
  #(`halfperiod/2 + 3) data = data + 1;
endmodule

4,描述顶层模块

模块功能: 对所设计的两个可综合模块ptosdaout16hi进行联合测试。观察ptosda模块能否正确地把并行数据转换成符合协议要求的串行码流;串行码流能否通过out16hi模块的处理输出符合设计要求的信号。本模块是为教学需要专门设计的。为了使大家容易理解接口功能,作了许多简化,因此无实用价值。

模块说明: 本模块还可以用于综合或布局布线后的电路网表模块的测试。做后仿真时,把包括的文件改为布局布线后的门级电路文件,即由综合工具生成的ptosda.vmout16hi.vm文件,或布局布线工具产生的ptosda.voout16hi.vo文件。为了能使门级电路网表模块进行仿真,有时还需要包括一个布线所用的FPGA或ASIC基本元件仿真库模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/11/21 14:05:43
// Design Name: 
// Module Name: top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


// 描述顶层模块的 Verilog代码如下:
// top.v

// 模块功能:对所设计的两个可综合模块 ptosda 和 out16hi 进行联合测试
// 观察 ptosda 模块能否正确地把 并行数据转换成 符合协议要求的串行码流;
// 串行码流能否通过 out16hi 模块的处理输出符合设计要求的信号。
// 本模块是为教学需要专门设计的。
// 为了使大家容易理解接口功能,作了许多简化,因此无 实用价值

// 模块说明:本模块还可以用于综合或布局布线后的电路网表模块的测试。
// 做后仿真时, 把包括的文件 改为 布局布线后的 门级电路网表文件,即由综合工具生成的
// pstosda.vo 和 out16hi.vo 文件。
// 为了能使门级电路网表模块进行仿真,有时还需要包括一个布线所用的FPGA 或 ASIC 
// 基本元件仿真库模块

// `timescale 1ns/1ns

`include "sigdata.v"
`include "ptosda.v"
`include "out16hi.v"


// 可用综合后产生的 门级 Verilog网表(netlist)文件 和 布局布线后产生的带延迟参数的Verilog 网表
// (netlist)文件来代替上面两个文件。 分别进行门级后仿真和布线后仿真。
// 这两种文件的扩展名不同,但都是Verilog门级模块

module top;
wire   [3:0] data;
wire   sclk;
wire   scl;
wire   sda;
wire   rst;
wire  [15:0] outhigh;

sigdata m0(.rst(rst), .sclk(sclk), .data(data), .ask_for_data(ack));
ptosda  m1(.rst(rst), .sclk(sclk), .ack(ack), .scl(scl), .sda(sda), .data(data));
out16hi m2(.scl(scl), .sda(sda), .outhigh(outhigh));


endmodule 

5,电路生成的门级网表,netlist

在这里插入图片描述

6,前仿真波形验证

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第五部分 | JS WebAPI】1:WebAPIs概述、网页元素的获取、事件

目录 | 概述 | 文档、元素、节点的概念 | 获取元素 根据ID获取 根据标签名获取 通过HTML5新增方法获取 特殊元素获取&#xff08;body html&#xff09; | 事件基础 事件三要素 点击事件 光标获得/失去焦点事件 [ 更多其它事件 ] 刷新网页自动执行某些事件 | 概述 …

Alibaba内部首发“面试百宝书+超全算法面试手册”PDF版下载

面试你打算要多高的薪资&#xff1f; 第一份工作的薪资水平就是你的薪资起点&#xff0c;如果你拿到的第一份薪水远高于其他人&#xff0c;那么你在未来涨薪路上就会省很多力。 想刚开始工作就拥有高薪&#xff0c;那就需要抬高自己的“身价”&#xff0c;提升自己的工作能力…

[附源码]java毕业设计-线上摄影平台系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Blob和ArrayBuffer和File

Blob Blob对象表示一个不可变、原始数据的类似文件的对象。Blob 表示的不一定是JavaScript原生格式的数据。 Represents a “Binary Large Object”, meaning a file-like object of immutable, raw data。 type BufferSource ArrayBufferView | ArrayBuffer; type BlobPart…

微前端——single-spa源码学习

前言 本来是想直接去学习下qiankun的源码&#xff0c;但是qiankun是基于single-spa做的二次封装&#xff0c;通过解决了single-spa的一些弊端和不足来帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。 所以我们应该先对single-spa有一个全面的认识和了解&#xff0c…

看了就能懂的NIO使用深入详解

NIO概述 NIO介绍 传统IO流(java.io):读写操作结束前,处于线性阻塞,代码简单,安全,性能低 NIO&#xff1a;支持非阻塞式编程,性能更有优势,但代码编写较为复杂。 概念理解 同步(synchronous):一条线程执行期间,其他线程就只能等待。 异步(asynchronous):一条线程在执行…

Java基础深化和提高-------多线程与并发编程

目录 多线程与并发编程 多线程介绍 什么是程序&#xff1f; 什么是进程? 什么是线程&#xff1f; 进程、线程的区别 什么是并发 线程和方法的执行特点 方法的执行特点 线程的执行特点 什么是主线程以及子线程 主线程 子线程 线程的创建 通过继承Thread类实现多线程 通过Ru…

暴力美学,拒绝平庸,Alibab开源内部神仙级“K8S核心笔记”下载

各大互联网巨头在技术战略层面&#xff0c;都把云原生列为了主要发展方向。以阿里巴巴为例&#xff0c;他们技术老大说&#xff0c;云原生是云计算释放红利的最短路径&#xff0c;也是企业数字化的最短路径。 现在云原生工程师、Kubernetes 工程师工资都特别高&#xff0c;并且…

大厂光环下的功能测试,出去面试自动化一问三不知

在一家公司待久了技术能力反而变弱了&#xff0c;原来的许多知识都会慢慢遗忘&#xff0c;这种情况并不少见。 一个京东员工发帖吐槽&#xff1a;感觉在大厂快待废了&#xff0c;出去面试问自己接口环境搭建、pytest测试框架&#xff0c;自己做点工太久都忘记了。平时用的时候…

【BLE】蓝牙数据速率

【BLE】蓝牙数据速率 理论速度 物理层 未编码PHY&#xff0c;每位数据使用1个符号表示 1Mbps&#xff08;LE 1M PHY&#xff09; 2Mbps&#xff08;LE 2M PHY&#xff09; 编码PHY 500Kbps&#xff08;S2&#xff09; 125Kbps&#xff08;S8&#xff09; 1Mbps指的是每…

MATLAB改变默认工作路径

软件版本&#xff1a;MATLAB2022a 电脑系统&#xff1a;win10 问题&#xff1a; 每次打开matlab都会自动打开matlab.exe文件夹位置&#xff0c;而不是打开自己新建的工作空间每次都要转换&#xff0c;很麻烦 方法&#xff1a; 1、找到安装目录下的matlabrc.m文件&#xff0…

大事务问题到底要如何解决?

文章目录大事务引发的问题pom依赖解决方法1. 少用Transactional 注解2. 将查询(select)方法放到事务外3. 事务中避免远程调用4. 事务中避免一次性处理太多数据5. 非事务执行6. 异步处理大事务引发的问题 在 分 享 解 决 办 法 之 前 &#xff0c;先 看 看 系 统 中 如 果 出 现…

一款集成ST-link下载及虚拟串口的STM32F103C8T6最小系统板设计

前言 在以前的STM32单片机应用中&#xff0c;经常使用STM32F103C8T6最小系统板&#xff08;小蓝板&#xff09;作为主控。程序下载和串口交互都需要额外器件和接线&#xff0c;程序下载的话要用到ST-link&#xff0c;串口交互用到USB-TTL&#xff0c;常见的样子就下面这…

(历史上最详细的网络)华为初级网络工程师知识点总结(二)工作考研均受益

超级详细网络知识二一&#xff0c;关于IPV4和IPV6地址的介绍&#xff08;重点是IPV4&#xff09;1,IPV4地址的组成2&#xff0c;子网掩码的详解3&#xff0c;IP地址的分类和播的形式4&#xff0c;IP地址的分类可用地址5&#xff0c;IPV4的特殊地址&#xff0c;公网地址&#xf…

信息数据采集软件-什么工具可以快速收集信息

随着时代的不断的进步&#xff0c;我们已经悄然无息地步入了一个大数据信息时代&#xff0c;每个人在互联网上都离不开信息数据的汇总分析以及信息数据的应用&#xff0c;不管是亮化自己的信息数据&#xff0c;还是分析同行详细信息的数据。今天小编就教大家如何用信息抓取软件…

yapi文档转换jmx脚本

需求 需要自动生成接口测试脚本接口文档&#xff08;swagger/yapi/wiki&#xff09;很多&#xff0c;我不想一个一个去复制黏贴到jmeter 期望 一键自动生成接口测试脚本&#xff0c;解放双手&#xff0c;降低纯手力劳动占比&#xff0c;进而给自己提供更多的时间去思考、理解…

第九章:单调栈与单调队列

单调栈与单调队列一、单调栈1、什么是单调栈&#xff1f;2、单调栈的模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;分析&#xff1a;二、单调队列1、什么是单调队列2、单调队列模板&#xff08;1&#xff09;问题&#xff08;2&#xff09;分析一、…

深入浅出学习透析Nginx服务器的基本原理和配置指南「Https安全控制篇」

Https反向代理 之前的内容中我们主要针对于一些对安全性要求比较高的站点&#xff0c;可能会使用HTTPS&#xff08;一种使用SSL通信标准的安全HTTP协议&#xff09;&#xff0c;针对于HTTP 协议和SSL标准相信大家都知道了&#xff0c;在这里我就不为大家进行介绍了&#xff0c…

共建“医疗合规科技实验室”,美创科技实力护航医疗数据安全

11月15日-17日&#xff0c;由工业和信息化部、深圳市人民政府主办&#xff0c;中国互联网协会、广东省通信管理局、深圳市工业和信息化局等单位承办的2022中国互联网大会隆重召开。 在互联网医疗健康合规发展论坛上&#xff0c;医疗合规科技实验室合作伙伴计划正式启动&#xf…

scau Java综合性实验之Java源程序分析程序

1. 编写一个Java应用程序&#xff0c;实现对某个目录中的所有Java源程序文件&#xff08;包含该目录的子目录中的源程序文件&#xff09;进行统计。统计内容包括&#xff1a; (1) 目录中每个源程序文件的总行数和空白行数&#xff0c;文件的字节数&#xff1b; (2) 目录中所有源…