精华内容
参与话题
问答
  • 1 概念 移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移或右移。移位寄存器不仅可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器,进行数值运算以及数据处理等,...

    1 概念

    移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移或右移。移位寄存器不仅可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器,进行数值运算以及数据处理等,它也是数字系统中应用非常广泛的时序逻辑部件之一。

    有四种不同类型的移位寄存器可用数据输入和输出设备的方式不同:

    串行输入,串行输出

    串行输入,并行输出

    并行输入,串行输出

    并行输入,并行输出
    在这里插入图片描述
    右移位寄存器的特点是右边寄存器的次态等于左边触发器的现态。串行输出数据从触发器FD的QD端输出,并行数据从个触发器的QA~QD端输出,两种输出方式都属于同向输出。各触发器都采用同一时钟信号,所以它们工作在同步状态。如果将FD的输出端QD接到FA的输入端DI,则可以构成循环移位的右移位寄存器。

    右移寄存器

    并行输入串行输出

    module right_shift_pin_sout(
        clk    ,
        rst_n  ,
        //其他信号,举例dout
        sout,
        pin    
        );
    
        //参数定义
        parameter      DATA_W =         4;
        parameter    CNT_W=2;
    
        //输入信号定义
        input               clk    ;
        input               rst_n  ;
        input [DATA_W-1: 0] pin    ;
    
        //输出信号定义
        output  sout   ;
    
    
    
        //中间信号定义
        reg[CNT_W-1: 0]     cnt    ;
        wire [DATA_W-1: 0]   D    ;
    
        reg [DATA_W-1: 0]   Q    ;
        //计数
        always@(posedge clk or negedge rst_n)begin
            if(rst_n==1'b0)begin
                cnt<=0;
            end
            else begin
                if(cnt==DATA_W-1)begin
                    cnt<=0;
                end
                else begin
                    cnt<=cnt+1;
                end
             end
        end
        //D
        assign D=(cnt==0)?pin:4'b0;
        assign sout=Q[3];
        //sout
        always  @(posedge clk or negedge rst_n)begin
            if(rst_n==1'b0)begin
                sout<=0;
            end
            else begin
                sout<=Q[3];
            end
        end
    //Q
        always  @(posedge clk or negedge rst_n)begin
            if(rst_n==1'b0)begin
                Q<=0;
            end
            else if(cnt==0)begin
                Q<=D;
            end
            else begin
                Q[3:1]<=Q[2:0]; 
            end
        end
    
    
    
        endmodule
    
    
    

    tb

     `timescale 1 ns/1 ns
    
    module testbench_name();
    parameter      DATA_W =         4;
    parameter    CNT_W=2;
    //时钟和复位
    reg clk  ;
    reg rst_n;
     
    wire sout;  
    reg[DATA_W-1: 0]  pin ; 
            //时钟周期,单位为ns,可在此修改时钟周期。
            parameter CYCLE    = 20;
    
            //复位时间,此时表示复位3个时钟周期的时间。
            parameter RST_TIME = 3 ;
    
            //待测试的模块例化
            right_shift_pin_sout 
            #(.DATA_W(DATA_W),.CNT_W(CNT_W))  uut(
           .clk    (   clk    ), 
           .rst_n  (   rst_n  ), 
           .sout   (  sout   ),
           .pin    (   pin    ) 
                )  ;  
            
    
                //生成本地时钟50M
                initial begin
                    clk = 0;
                    forever
                    #(CYCLE/2)
                    clk=~clk;
                end
    
                //产生复位信号
                initial begin
                    rst_n = 1;
                    #2;
                    rst_n = 0;
                    #(CYCLE*RST_TIME);
                    rst_n = 1;
                end
    
                //输入信号pin赋值方式
                initial begin
                    #1;
                    //赋初值
                    pin =4'b1111;
                    #(9*CYCLE);
                    pin=4'b1000;
                    #(9*CYCLE);
                    pin=4'b0010;
                    #(9*CYCLE);
                    pin=4'b0001;
                    //开始赋值
    
                end
    
    endmodule
    
    
    
    展开全文
  • 1 Verilog描述 module shift_p2s( input clk, input [7:0] din, input load, output reg q ); reg [7:0] tmp; always@(posedge clk)begin if(load == 1...

    1 Verilog描述

    module shift_p2s(
        input         clk,
        input [7:0]    din,
        input         load,
        output reg     q
    );
        reg [7:0] tmp;
        
        always@(posedge clk)begin
            if(load == 1'b1)
                tmp <= din;
            else begin
                q <= tmp[7];
                tmp <= {tmp[6:0],1'b0};
            end
        end

    endmodule

    2 RTL视图

    3 功能仿真

    展开全文
  • 这是一个将并行数据转换为串行输出的变换器,利用双向总线输出。这是由EEPROM读写器的缩减得到的,首先对I2C总线特征介绍: I2C总线(inter integrated circuit)双向二线制串行总线协议为:只有总线处于“非忙”...

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

    这是一个将并行数据转换为串行输出的变换器,利用双向总线输出。这是由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 [7:0]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 [2:0]state;                //main status,
      9   reg [4:0]sh8out_state;         //serial output status
     10   reg [7:0]sh8out_buf;           //output data buffer
     11   reg finish_F;                  //whether finished an operation of main status
     12   reg ack;                       
     13   
     14   parameter  idle=0, addr_write=3'd1, data_write=3'd2, stop_ack=3'd4;          //main status code
     15   parameter  bit0=1, bit1=2, bit2=3, bit3=4, bit4=5, bit5=6, bit6=7, bit7=8;   //serial output status code
     16   
     17   assign sda=link_write?sh8out_buf[7]:1'bz;               //???????????
     18   
     19   always @(posedge clk)
     20   begin
     21   if(!rst)                       //reset
     22     begin
     23     ack<=0;
     24     link_write<=0;               //???????
     25     finish_F<=0;
     26     state<=idle;
     27     sh8out_state<=idle;
     28     sh8out_buf<=0;
     29     end
     30     else
     31       case(state)
     32         idle:begin
     33              link_write<=0;        //??????
     34              ack<=0;
     35              finish_F<=0;
     36              sh8out_buf<=addr;     //???????
     37              sh8out_state<=idle;
     38              state<=addr_write;    //???????
     39              end
     40         addr_write:begin
     41              if (finish_F==0) begin shift8_out;end    //???????
     42              else
     43                begin
     44                link_write<=0;
     45                ack<=0;
     46                finish_F<=0;
     47                sh8out_buf<=data;  //???????
     48                state<=data_write;
     49                sh8out_state<=idle;     
     50                end          
     51              end
     52         data_write:begin
     53              if (finish_F==0) begin shift8_out;end    //???????
     54              else
     55                begin
     56                link_write<=0;
     57                finish_F<=0;
     58                state<=stop_ack;
     59                ack<=1;            //????????
     60                end
     61              end 
     62         stop_ack:begin            //????
     63              ack<=0;
     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<=1;        //?????????????????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<=1;       
     78            sh8out_buf=sh8out_buf<<1;   //?????data?????bit6
     79            sh8out_state<=bit6;
     80            end
     81       bit6:begin
     82            link_write<=1;       
     83            sh8out_buf=sh8out_buf<<1;  
     84            sh8out_state<=bit5;
     85            end
     86       bit5:begin
     87            link_write<=1;       
     88            sh8out_buf=sh8out_buf<<1;   
     89            sh8out_state<=bit4;
     90            end
     91       bit4:begin
     92            link_write<=1;       
     93            sh8out_buf=sh8out_buf<<1;   
     94            sh8out_state<=bit3;
     95            end
     96       bit3:begin
     97            link_write<=1;       
     98            sh8out_buf=sh8out_buf<<1;   
     99            sh8out_state<=bit2;
    100            end
    101       bit2:begin
    102            link_write<=1;       
    103            sh8out_buf=sh8out_buf<<1;   
    104            sh8out_state<=bit1;
    105            end
    106       bit1:begin
    107            link_write<=1;       
    108            sh8out_buf=sh8out_buf<<1;   
    109            sh8out_state<=bit0;
    110            end
    111       bit0:begin
    112            link_write<=0;       
    113            finish_F<=1;
    114            end
    115       endcase
    116     end
    117     endtask
    118 endmodule
    复制代码

     

     测试程序:

     

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

    波形信号:

    转载于:https://www.cnblogs.com/ZZiz/p/6752289.html

    展开全文
  • 小白在做一个竞赛,需要控制很多led,为了减少线路,想使用移位寄存器,一个输入,八个输出,但是在查找资料时发现,网上对于同一个芯片有相反的说明,很想清楚到底哪一种是我所需要的,跪求大神指点一二。
  • 51单片机串行口扩展并行输入输出Proteus仿真
  • 它内建的CMOS位移寄存器与锁存功能,可以将串行输入数据转换成平行输出数据格式。芯片的输入电压范围值为3.3伏特至5伏特,提供16个恒定电流源,可以在每个输出级提供 3-45mA 的恒定电流量以驱动 LED。  特点: ...
  • FPGA输入端口:CLR ,CLK , ALE , WR , DATA_P0 [7..0] , DATA_P2[7..0] ; FPGA输出端口:SCLK , SDATA , LD ; 16并转16位同步串出
  • 电子设计.doc

    2019-05-28 11:58:28
    0292、改进的并行积分算法低通滤波器的FPGA设计 0293、高频试验箱资料 0294、高清电视音频解码的定点DSP 实现 0295、反激式DC—DC电源的集成化研究 0296、高性能DDS芯片AD9850的数字调制系统 0297、关于单端反激变换...
  • 电脑蓝屏对照码

    2019-05-05 14:16:40
    ◆错误分析:这个停机码说明注册表或系统配置管理器出现错误, 由于硬盘本身有物理损坏或文件系统存在问题, 从而造成在读取注册文件时出现输入/输出错误. ◇解决方案:使用"chkdsk /r"检查并修复磁盘错误. 13、0x...
  • 微型计算机组成原理课程内容介绍第一章 微型计算机基础第二章 80X80微型处理器第三章 汇编语言指令集第四章 汇编语言程序设计第五章 输入/输出系统第六章 中断系统第七章 微型计算机系统串行通讯第八章 并行I/O接口...

    本笔记的视频,源自中国大学MOOC,南京邮电大学的微型计算机原理与接口技术。

    课程内容介绍

    第一章 微型计算机基础

    这一章将讲解信息在计算机中的表示方法以及微型计算机系统的基本组成。

    第二章 80X80微型处理器

    这一章是微型计算机的核心——CPU的工作原理(CPU的内部结构及工作模式)。

    第三章 汇编语言指令集

    这一章将讲解组成汇编程序的基本单位 指令相关的知识,在讲解寻址方式与汇编语法的基础上,按照功能类别对汇编语言指令进行系统的讲解。

    第四章 汇编语言程序设计

    这一章将讲解应用汇编语言指令,来设计实现各种功能的汇编语言程序。除了讲解程序设计方法,还将对系统功能调用进行讲解。

    第五章 输入/输出系统

    这一章是学习接口技术的基础,在讲解总线的构成和工作原理的基础上,将会讲解接口电路相关概念,以及用于不同信息交换方式的接口类型。

    第六章 中断系统

    这一章将系统的讲解终端这一重要的接口方式,讲解中断的基本概念、中断指令、8259A中断控制器的工作原理、中断系统的构成以及应用方法。

    第七章 微型计算机系统串行通讯

    这一章将学习到串行通讯的协议标准,8250串行异步通信接口芯片的结构,实现串行异步通讯的方法,以及开发串行通讯应用程序的方法等。

    第八章 并行I/O接口

    这一章中将讲解 8255A 并行接口芯片的结构,工作方式,不同工作方式在并行输入输出中的实际应用和程序设计方法。此外,对并行打印机接口的工作原理进行简单介绍。

    第九章 可编程定时/计数器

    这一章将学习 8254 定时计数器,讲解它的结构,工作原理,工作方式以及如何编写程序来实现 8254 的应用。

    课程意义

    掌握两个能力:

    • 用汇编语言进行程序开发的能力
    • 设计微型计算机输入输出接口的能力

    汇编语言

    • 汇编语言是最接近于机器语言的编程语言,是人与机器最直接的沟通语言。
      学习本课程能够充分获得底层编程的经验,深刻理解机器运行程序的原理,使我们对于复杂变化的计算机只是了解更清晰。

    • 汇编语言是联系硬件与软件的纽带,硬件与软件构成了完整的计算机体系。
      学习本课程不但能感知硬件内部的工作原理,清晰地了解到芯片之间的协作流程,而且有助于理解高级语言的核心原理。

    因此,学习本课程,既能向上理解软件,又能向下感知硬件,形成一个软硬兼具的计算机知识体系。

    接口技术

    接口技术是计算机硬件系统实现人机交互的重要通道,学习接口技术是理解和掌握硬件的最佳入口。

    学习目标

    • 为深入学习高级语言,例如C语言等打下基础。
    • 为编写系统级软件,例如操作系统软件,以及驱动程序等打下基础。
    • 为学习其他计算机系统类课程,例如嵌入式系统等打下基础。
    展开全文
  • 本次要说明的程序 本程序是在cubemx初始化stm32f103c8后直接生成的初始程序上继续编程。 #include "main.h" #define SDI_SET HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET) #define SDI_RESET HAL_GPIO_...
  • LTC2274 的新型高速二线式品行接口极大地减少了一个 16 位 ADC 和 FPGA 之间所需的数据输入/输出 (I/O) 线的数目 (从 16 个 CMOS 或 32 个 LVDS 并行数据线减少至一对传输速率为 2.1Gbps 的自定时差分线) ,从而腾出...
  • 74HC164、74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。 数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接...
  • (请复制整个下载地址到迅雷、快车、QQ旋风进行下载) 电子书下载地址:http://files.cnblogs.com/wenziqi/划时代-51单片机C语言全新教程.rar 转载于:...
  • 一、背景 老同学今天突然咨询关于74HC595,自己没用过,同学说可以级联10级!... 74HC595为1个8位串行移位输入寄存器带1个存储寄存器,并可8位带锁存并行输出串行移位输入寄存器 和存储寄存器分别有独自的时钟...
  • 74HC595 - 串行并行

    2020-07-14 17:44:36
    1、串行并行 引脚图 逻辑框图 2、功能注释 芯片主要分为移位寄存器和锁存寄存器两大部分。移位寄存器存储串行输入的数据,锁存寄存器锁存移位寄存器内的数据。 1)SHIFT CLOCK:移位时钟输入引脚,上升沿将...
  • 0--------LED output  /* ********************************************************************** * 头文件包含 ********************************************************************...
  • 74HC164、74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。 数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接...
  • 题: 试用D触发器和必要的门电路(或最小数量的中规模集成电路芯片)设计两位串行输入并行输出双向移位寄存器. 寄存器有X、K两个输入端, K控制移位方向, X输入数据. K=0时, 寄存器数据从高位移向低位, X往寄存器高位...
  • 说明:串行数据由 RXD 发送给串 并转换芯片 74164,TXD 则用于输出移位时钟脉冲,74164 将串行输入的 1 字节转换为并行数据,并将转换的数据通过 8 只 LED 显示出来。本例串口工作模式 0,即移位寄存器 I/O 模式。
  • 串行通信与并行通信

    2019-09-26 01:33:28
    串行通信是用一根数据线,将数据一位位的输出 是用一根数据线,将数据一位位的输出 并行通信时数据的各个位同时...1.将并行输入转换为串行输出 2.将串行输入转换为并行输出 转载于:https://www.cnblogs.com...
  • 1.串行加法器串行加法器即加法器执行位串行行操作,利用多个时钟周期完成一次加法运算,即输入操作数和输出结果方式为随时钟串行输入/输出。位并行加法器速度高,但是占用资源多。在许多实际应用中并不需要这样高的...
  • 并行接口是bai在多根数据du线上,数据以字节或字为单位与zhi输入输出设备或控制对象传送信息的。与此相对的串行接口是在一根数据线上以1位数据位为单位与I/O设备或通信设备传送信息。实际应用中,凡是在CPU与外设...
  • 主要用于扩展并行输入或输出口。数据有RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接受均为8位数据。低位在前,高位在后。 //串行口工作模式0 #include #define uchar ...
  • 74HC165是8位并行输入串行输出移位寄存器,可在末级得到互斥的串行输出。 1) 原理图 2) 实物图 3) 输入接口 接口编号:JP11,8位并行数据输入 4) 输出接口 输出接口为JP14,串行输出。

空空如也

1 2 3 4 5 ... 20
收藏数 593
精华内容 237
关键字:

并行输入串行输出