精华内容
下载资源
问答
  • 74HC595 - 串行并行

    2020-07-14 17:44:36
    移位寄存器存储串行输入的数据,锁存寄存器锁存移位寄存器内的数据。 1)SHIFT CLOCK:移位时钟输入引脚,上升沿将数据串行输入; 2)SERIAL DATA INPUT:串行数据输入引脚; 3)RESET:清空移位寄存器中数据,低电平有效...
  • 题: 试用D触发器必要的门电路(或最小数量的中规模集成电路芯片)设计两位串行输入并行输出双向移位寄存器. 寄存器有X、K两个输入端, K控制移位方向, X输入数据. K=0时, 寄存器数据从高位移向低位, X往寄存器高位...

     题:  试用D触发器和必要的门电路(或最小数量的中规模集成电路芯片)设计两位串行输入、并行输出双向移位寄存器. 寄存器有X、K两个输入端, K控制移位方向, X输入数据. K=0时, 寄存器数据从高位移向低位, X往寄存器高位送数据; K=1时, 寄存器数据从低位移向高位, X往寄存器低位送数据.

    解析:

            根据题目的描述, 得到对应的状态表.

    状态表
    K X Q0* Q1* 功能
    0 0 Q1 0 左移
    0 1 Q1 1 左移
    1 0 0 Q0 右移
    1 1 1 Q0 右移

            根据状态表, 得到状态激励表.

    状态激励表
    K X D0 D1 功能
    0 0 Q1 0 左移
    0 1 Q1 1 左移
    1 0 0 Q0 右移
    1 1 1 Q0 右移

             这里为了提升电路设计的效率, 用一片74153的两个输出分别实现D0和D1的逻辑表达式.

            根据上面的分析, 绘制电路的原理图.

    展开全文
  • 主要用于扩展并行输入或输出口。数据有RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送接受均为8位数据。低位在前,高位在后。 //串行口工作模式0 #include #define uchar ...

    串行工作模式之同步移位寄存器的输入输出方式

    主要用于扩展并行输入或输出口。数据有RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接受均为8位数据。低位在前,高位在后。


    //串行口工作模式0


    #include <reg52.h>
    #define uchar unsigned char 
    #define uint unsigned int
    void delayms(uint xms)
    {
    uint i,j;
    for(i=xms;i>0;i--)
    for(j=110;j>0;j--);
    }
    void main()
    {
    SCON=0;
    EA=1;
    ES=1;
    TI=0;
    while(1)
    {
    SBUF=0xaa;
    //delayms(1);
    }
    }
    void ser0() interrupt 4
    {
    TI=0;
    }

    用 示波器看到的波形 注意的是发送的是靠左的是数据的地位。01010101的序列



    展开全文
  • 寄存器和ioremap的使用

    2020-12-21 17:14:33
    移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入串行输出,或串行输入、并行输出,十分灵活,用途也很广。 2.寄存器的大小...

    一、寄存器

    1.寄存器概述
    寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。

    按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。

    2.寄存器的大小:
    8位的单片机,一个寄存器占8bit,一个字节。16位的单片机,1个寄存器,占16bit,2个字节。高级一点的,arm的芯片,一个寄存器占32bit,即是4个字节。

    二、ioremap学习

    原型:

    void *ioremap(unsigned long phys_addr, unsigned long size)  
    void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)  
    
     phys_addr:要映射的起始的IO地址;
    
     size: 要映射的空间的大小(多少个字节);
    
     ioremap 依靠 __ioremap实现,它只是在__ioremap中以第三个参数为0调用来实现.
    
     flags:要映射的IO空间的和权限有关的标志;
    
     phys_addr:是要映射的物理地址,
    
     size:是要映射的长度,
    

    功能:将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问;函数专门用来为I/O内存区域分配虚拟地址。经过ioremap之后,设备驱动即可访问任意的I/O内存地址。有了ioremap (和iounmap),设备就可以访问任何I/O内存空间,不论它是否直接映射到虚拟地址空间。但是,这些地址永远不能直接使用(指物理地址),而要用readb这种函数。

    ioremap是内核提供的用来映射外设寄存器到主存的函数,我们要映射的地址来源于CPU的用户开发手册。硬件的跳线或者是物理连接方式决定了硬件上的内存映射到的cpu物理地址。映射完了有什么效果呢,举个例子,比如某个网卡有100个寄存器,他们都是连在一块的,位置是固定的,加入每个寄存器占4个字节,那么一共400个字节的空间被映射到内存成功后,ioaddr就是这段地址的开头(ioaddr = ioremap (mmio_start, mmio_len);注意ioaddr是虚拟地址,而mmio_start是物理地址,它是开发手册中提供的,肯定是物理地址,而保护模式下CPU不认物理地址,只认虚拟地址),ioaddr+0就是第一个寄存器的地址,ioaddr+4就是第二个寄存器地址(每个寄存器占4个字节),以此类推,我们就能够在内存中访问到所有的寄存器进而操控他们了。

    访问I/O内存的正确方式是通过一系列专用于此目的的函数(在<asm/io.h>中定义的):

    I/O内存读函数

    unsigned int ioread8(void*addr);     
    unsigned int ioread16(void*addr); 
    unsigned int ioread32(void*addr); 
    

    addr是从ioremap获得的地址(可能包含一个整型偏移量),返回值是从给定I/O内存读取的值

    对应的I/O内存写函数

    void iowrite8(u8value,void*addr); 
    void iowrite16(u16value,void*addr);
    void iowrite32(u32value,void*addr); 
    

    读和写一系列值到一个给定的I/O内存地址,从给定的buf读或写count个值到给定的addr

    void ioread8_rep(void *addr, void *buf, unsigned long count); 
    void ioread16_rep(void *addr, void *buf, unsigned long count); 
    void ioread32_rep(void *addr, void *buf, unsigned long count); 
    void iowrite8_rep(void *addr, const void *buf, unsigned long count); 
    void iowrite16_rep(void *addr, const void *buf, unsigned long count); 
    void iowrite32_rep(void *addr, const void *buf,unsigned long count); 
    

    需要操作一块I/O地址,使用一下函数

    void memset_io(void *addr, u8 value, unsigned int count); 
    void memcpy_fromio(void *dest,void *source, unsigned int count); 
    void memcpy_toio(void *dest, void *source, unsigned int count) 
    

    旧函数接口,仍可工作,但不推荐。

    unsigned readb(address); 
    unsigned readw(address); 
    unsigned readl(address); 
    void writeb(unsigned value,address); 
    void writew(unsigned value,address); 
    void writel(unsigned value,address); 
    
    展开全文
  • 具有串行=转并功能,通过移位寄存器和输出锁存器实现。驱动开发板上的8位数码管。 FPGA需要通过74HC595这个芯片把16位的数据(SEL + SEG)变为并行端口用来驱动数码管 74HC595的波形图 如图可知: 输入数据DS,先...

    74HC595大概原理
    在这里插入图片描述
    具有串行=转并功能,通过移位寄存器和输出锁存器实现。驱动开发板上的8位数码管。
    FPGA需要通过74HC595这个芯片把16位的数据(SEL + SEG)变为并行端口用来驱动数码管

    74HC595的波形图
    在这里插入图片描述

    如图可知:
    输入数据DS,先输入的数据,在8个时间周期之后,在Q7上

    数码管结构
    在这里插入图片描述
    此结构为一个SPI协议接口

    第一片74HC595 作为位选信号
    第二片作为段选
    在这里插入图片描述
    要求:对于74HC595芯片,该芯片在SH_CP(SCLK)的上升沿将(DIO)上的数据移入内部寄存器。
    目的:因此我们需要保证DS上的数据在SH_CP上升沿前后的一段时间,保持稳定。
    手段:FPGA要在SH_CP的下降沿改变DS的值。
    设SH_CP时钟的频率为12.5HZ
    根据波形,找到SH_CP的最小时间周期,以这个周期为基准来描述DS ST_CP 的变化,类似于此
    在这里插入图片描述
    则此信号频率应该为SH_CP的二倍

    代码如下:

    数码管显示模块:

    module hex8_2(
        Clk,
        Reset_n,
        Disp_Data,
        SEL,
        SEG
    );
        
        input Clk;
        input Reset_n;
        input [31:0]Disp_Data;
        output reg[7:0]SEL;
        output reg[7:0]SEG;//seg[0]-a,seg[1]-b...seg[7]-h
        
        reg clk_1k;
        reg [15:0]div_cnt;
        always@(posedge Clk or negedge Reset_n)    //1000000/20/2*2=50000
        if(!Reset_n)
            div_cnt <= 0;
        else if(div_cnt >= 49999)
            div_cnt <= 0;
        else
            div_cnt <= div_cnt + 1'b1;
            
        always@(posedge Clk or negedge Reset_n)    //使能时钟信号
        if(!Reset_n)
            clk_1k <= 0;
        else if(div_cnt == 49999)
            clk_1k <= 1'b1;
        else
            clk_1k <= 0;
          
        reg [2:0]num_cnt;                         
        always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            num_cnt <= 0;
        else if(clk_1k)
            num_cnt <= num_cnt + 1'b1;
            
        always@(posedge Clk)
            case(num_cnt)
                0: SEL = 8'b00000001;
                1: SEL = 8'b00000010;
                2: SEL = 8'b00000100;
                3: SEL = 8'b00001000;
                4: SEL = 8'b00010000;
                5: SEL = 8'b00100000;
                6: SEL = 8'b01000000;
                7: SEL = 8'b10000000;
            endcase
    
        reg[3:0]disp_tmp;
        always@(posedge Clk)
            case(num_cnt)
                7: disp_tmp = Disp_Data[31:28];
                6: disp_tmp = Disp_Data[27:24];
                5: disp_tmp = Disp_Data[23:20];
                4: disp_tmp = Disp_Data[19:16];
                3: disp_tmp = Disp_Data[15:12];
                2: disp_tmp = Disp_Data[11:8];
                1: disp_tmp = Disp_Data[7:4];
                0: disp_tmp = Disp_Data[3:0];
            endcase   
    
         always@(posedge Clk)
            case(disp_tmp)
                0: SEG = 8'hc0;
                1: SEG = 8'hf9;
                2: SEG = 8'ha4;
                3: SEG = 8'hb0;
                4: SEG = 8'h99;
                5: SEG = 8'h92;
                6: SEG = 8'h82;
                7: SEG = 8'hf8;
                8: SEG = 8'h80;
                9: SEG = 8'h90;
                4'ha: SEG = 8'h88;
                4'hb: SEG = 8'h83;
                4'hc: SEG = 8'hc6;
                4'hd: SEG = 8'ha1;
                4'he: SEG = 8'h86;
                4'hf: SEG = 8'h8e;
            endcase   
    
    endmodule
    

    驱动模块:

    `timescale 1ns / 1ps
    
    module HC595_Driver(
        Clk,
        Reset_n,
        Data,
        S_EN,
        SH_CP,
        ST_CP,
        DS
    );
        
        input Clk;
        input Reset_n;
        input [15:0]Data;
        input S_EN;
        output reg SH_CP;
        output reg ST_CP;
        output reg DS;
        parameter CNT_MAX = 2;
        
        reg [15:0]r_data;
        always@(posedge Clk)
            if(S_EN)
                r_data <= Data;
    
        reg [7:0]divider_cnt;//分频计数器,得到最小的那个使能时间单位
        always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            divider_cnt <= 0;
        else if(divider_cnt == CNT_MAX - 1'd1)
            divider_cnt <= 0;
        else
            divider_cnt <= divider_cnt + 1'b1;
        
        wire sck_plus;      //产生这个两倍时钟信号
        assign sck_plus = (divider_cnt == CNT_MAX - 1'd1);
        
        reg [5:0]SHCP_EDGE_CNT;
        always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            SHCP_EDGE_CNT <= 0;
        else if(sck_plus)begin
            if(SHCP_EDGE_CNT == 6'd32)            //传16位数据,需要32位计数
                SHCP_EDGE_CNT <= 0;
            else
                SHCP_EDGE_CNT <= SHCP_EDGE_CNT + 1'b1;
        end
            
        always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)begin
            SH_CP <= 0;
            ST_CP <= 0;
            DS <= 0;   
        end
        else begin
            case(SHCP_EDGE_CNT)
                0: begin SH_CP <= 0;ST_CP <= 1'd0;DS <= r_data[15];end
                1: SH_CP <= 1'd1;
                2: begin SH_CP <= 0;DS <= r_data[14];end
                3: SH_CP <= 1'd1;
                4: begin SH_CP <= 0;DS <= r_data[13];end   
                5: SH_CP <= 1'd1;
                6: begin SH_CP <= 0;DS <= r_data[12];end
                7: SH_CP <= 1'd1;
                8: begin SH_CP <= 0;DS <= r_data[11];end   
                9: SH_CP <= 1'd1;
                10: begin SH_CP <= 0;DS <= r_data[10];end
                11: SH_CP <= 1'd1;
                12: begin SH_CP <= 0;DS <= r_data[9];end  
                13: SH_CP <= 1'd1;
                14: begin SH_CP <= 0;DS <= r_data[8];end
                15: SH_CP <= 1'd1;
                16: begin SH_CP <= 0;DS <= r_data[7];end   
                17: SH_CP <= 1'd1;
                18: begin SH_CP <= 0;DS <= r_data[6];end
                19: SH_CP <= 1'd1;
                20: begin SH_CP <= 0;DS <= r_data[5];end   
                21: SH_CP <= 1'd1;
                22: begin SH_CP <= 0;DS <= r_data[4];end
                23: SH_CP <= 1'd1;
                24: begin SH_CP <= 0;DS <= r_data[3];end   
                25: SH_CP <= 1'd1;
                26: begin SH_CP <= 0;DS <= r_data[2];end
                27: SH_CP <= 1'd1;
                28: begin SH_CP <= 0;DS <= r_data[1];end
                29: SH_CP <= 1'd1;
                30: begin SH_CP <= 0;DS <= r_data[0];end
                31: SH_CP <= 1'd1;
                32: ST_CP <= 1'd1;
                default:
                    begin
                        SH_CP <= 0;
                        ST_CP <= 0;
                        DS <= 0;   
                    end
            endcase
        end
    
    endmodule
    

    测试模块:

    module hex8_test(
        Clk,
        Reset_n,
        SEL,
        SEG,
        SH_CP,
        ST_CP,
        DS
    );
        
        input Clk;
        input Reset_n;
    
        output [7:0]SEL;
        output [7:0]SEG;//seg[0]-a,seg[1]-b...seg[7]-h
        
        output SH_CP;
        output ST_CP;
        output DS;
        
        wire [31:0]Disp_Data;
        
        hex8_2 hex8_2(
            Clk,
            Reset_n,
            Disp_Data,
            SEL,
            SEG
        ); 
        wire [15:0]Data;
        assign Data = {SEG,SEL};
        
        wire S_EN;
        assign S_EN = 1;
        
        HC595_Driver HC595_Driver(
            Clk,
            Reset_n,
            Data,
            S_EN,
            SH_CP,
            ST_CP,
            DS
        );
        
        assign Disp_Data = 32'h13579bdf;    
        
    endmodule
    
    TB文件:
    `timescale 1ns / 1ps
    module hex8_tb();
    
        reg Clk;
        reg Reset_n;
        reg [31:0]Disp_Data;
        wire [7:0]SEL;
        wire [7:0]SEG;
        
        hex8 hex8(
            Clk,
            Reset_n,
            Disp_Data,
            SEL,
            SEG
        );  
        
        initial Clk = 1;
        always#10 Clk = ~Clk;
        
        initial begin
            Reset_n = 0;
            Disp_Data = 32'h00000000;
            #201;
            Reset_n = 1;
            #2000;
            Disp_Data = 32'h12345678;
            #10000000;
            Disp_Data = 32'h9abcdef0;
            #10000000;
            $stop;
        end
        
    endmodule
    
    展开全文
  • 移位寄存器(shift_reg) 在数字电路中,移位寄存器是一种在...根据移位数据的输入-输出方式,又可将它分为串行输入-串行输出、串行输入-并行输出、并行输入-串行输出和并行输入-并行输出四种电路结构。 移位寄...
  • 移位寄存器

    2020-12-09 01:57:52
    移位寄存器是暂时存放数据的部件,同时它还具有移位功能。 一、特点和分类 从逻辑结构上看,移位寄存器...移位寄存器的数据输入方式有串行输入和并行输入之分。串行输入就是在时钟脉冲作用下,把要输入的数据从一个
  • 一、背景 老同学今天突然咨询关于74HC595,自己没用过,同学说可以级联10级!... 74HC595为1个8位串行移位输入寄存器带1个存储寄存器,并可8位带锁存并行输出。串行移位输入寄存器 存储寄存器分别有独自的时钟...
  • 1.串行加法器串行加法器即加法器执行位串行行操作,利用多个时钟周期完成一次加法运算,即输入操作数输出结果方式为随时钟串行输入/输出。位并行加法器速度高,但是占用资源多。在许多实际应用中并不需要这样高的...
  • ▪ 基本信息 74HC595 具有 8 位移位寄存器和一个 存储器,三...移位寄存器有一个串行移位输入(DS),一个串行输出(Q7’),一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时
  • 74HC165并行数据转串行数据

    千次阅读 2012-11-21 00:53:44
    74HC165 概述 (NXP founded by Philips) ...74HC165是8位并行读取或串行输入移位寄存器,可在末级得到互斥的串行输出(Q7Q7),当并行读取(PL)输入为低时,从D0到D7口输入并行数据将被异步地读取进寄存器内。
  • 按接收数据方式分为串行输入和并行输入;按输出方向分为串行输出和并行输出。 如果将若干个触发器级联成如下图所示电路,则构成基本的移位寄存器。图中是一个4位移位寄存器串行二进制数据从输入端Dsi输入,左边...
  • 74系列8位移位寄存器TM74HC164,串行输入并行输出,具有与门方式的串行输入和异步清零端。
  • 移位寄存器中的数据 可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输 出,还可以并行输人、串行输出,串行输人、并行输出,输人输出方式十分灵活,用途也很广。...
  • 运算器:算术逻辑运算单元(ALU,Arithmetic Logic Unit),负责执行所有的数学逻辑工作 控制器:控制单元(CU,Control Unit),控制计算机的所有其他部件,如输入输出设备以及存储器 寄存器
  • 运算器:算术逻辑运算单元(ALU,Arithmetic Logic Unit),负责执行所有的数学逻辑工作 控制器:控制单元(CU,Control Unit),控制计算机的所有其他部件,如输入输出设备以及存储器 寄存器
  • 在此基础上,通过目标函数构造及变换构建带有移位控制的单元模块,设计了满足串行输入串/并行输出功能的n位可逆双向移位寄存器。设计结果表明,采用方法所设计的可逆移位寄存器具有较优的性能指标,且对于双向移位...
  • 寄存器(Register)是用于寄存一组二值...在每个时钟上升沿的触发之下,数据会依次向左或右移动一个比特(Bit),最后在输出端进行输出,这里,数据可以以并行或者以串行的方式输入到该移位寄存器的电路器件中。 ..
  • 4位双向移位寄存器(行为描述)

    千次阅读 2018-09-19 19:42:19
    module cy4(input S1,S0,/... input DSR,DSL,//串行数据输入 input CP,CR,//时钟清零输入 input[3:0] D,//并行数据输入 output reg[3:0]Q//输出端口及变量的数据类型声明 ); always @(posedge CP or neg...
  • 51单片机串行口波特率计算

    千次阅读 2019-06-19 21:48:58
    1.工作方式介绍: 方式 0 :这种工作方式比较特殊,与常见的微型计算机的串行口不同,它又叫同步移位寄存器输出方式。...常用于串行口外接移位寄存器,以扩展并行I/O口,这种方式不适用与两个MCS-5...
  • 实验三 6LED静态串行显示一、实验目的1、掌握数字、字符转换成由数码管显示的八段码的软件译码方法及译码过程;...6个串行输入/并行输出锁存移位寄存器芯片74HC595首尾相连。每片的并行输出作为LED数码...
  • 工作时,数据从RXD串行输入/输出,TXD输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1...
  • [转] 串、并行加法器

    2012-07-10 18:01:00
    全加器(加法单元) 加法单元是一个三端输入,两端输出的加法网络 ·串行加法器和并行加法器 串行加法器:只设一个全加器称串行加法器 典型的串行加法器只用一位全加器,由移位寄存器从低位到高位串行地提供操作数进行...
  • (笔记总结)80C51串行口的工作方式

    千次阅读 2018-11-29 16:57:38
    主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。 方式0输出 方式0输入   2.方式...
  •   74HC165是一个8位串行并行输入串行输出的移位寄存器。74HC165具有一个串行输入(DS引脚),8个并行数据输入(A-H)两个互补串行输出的功能。当S/L引脚为低时,A-H端的数据进入移位寄存器。当S/L引脚为高时...
  • 74HC595具有一个8位串行输入并行输出的移位寄存器和一个8位输出锁存器。
  • 74HC595芯片介绍使用详解【干货】

    千次阅读 多人点赞 2020-06-05 15:13:20
    串行输入并行输出。 14脚:DS,串行数据输入引脚 12脚:ST_CP,存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存带存储寄存器。 11脚:SH_CP,移位寄存器时钟引脚,上升沿时,移位寄存器中的数据整体后移...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 198
精华内容 79
关键字:

寄存器串行和并行输入