精华内容
下载资源
问答
  • 8位串行输入串行输出移位寄存器的Verilog设计
    千次阅读
    2020-04-24 16:51:01

    1 Verilog描述

    module shift_s2s(
        input         din,
        input         clk,
        output reg     dout
    );

        reg tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7;
        
    //串行输入串行输出移位寄存器
    /*8位移位寄存器由8个D触发器串联构成,在时钟
    信号的作用下,前一级的数据向后移动*/

        always@(posedge clk)begin
            tmp1 <= din;
            tmp2 <= tmp1;
            tmp3 <= tmp2;
            tmp4 <= tmp3;
            tmp5 <= tmp4;
            tmp6 <= tmp5;
            tmp7 <= tmp6;
            dout <= tmp7;
        end

    endmodule

    2 RTL级视图

    3 功能仿真

    更多相关内容
  • 串行加法电路设计选用器件ls双向移位寄存器PPT学习教案.pptx
  • 具有串行=转并功能,通过移位寄存器和输出锁存器实现。驱动开发板上的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
    
    展开全文
  • 目录摘要 .................................................................................................................................... 11 多功能双向移位寄存器 .....................................

    目录

    摘要 .................................................................................................................................................. 1

    1 多功能双向移位寄存器 ............................................................................................................... 2

    1.1 基本工作原理 .................................................................................................................... 2

    1.2 基本实现方案 .................................................................................................................... 2

    2 电路图设计................................................................................................................................... 4

    2.1 电路结构............................................................................................................................ 4

    2.2 真值表................................................................................................................................ 4

    3 Verilog描述8位双向移位寄存器 ............................................................................................... 6

    4 程序仿真....................................................................................................................................... 8

    5 总结 ............................................................................................................................................ 10

    参考文献......................................................................................................................................... 11

    双向移位寄存器 8位双向移位寄存器电路设计

    武汉理工大学《能力拓展训练》说明书

    摘要

    移位寄存器是基本的同步时序电路,基本的移位寄存器可以实现数据的串行/并行或并行/串行的转换、数值运算以及其他数据处理功能。[wwW.nIUBB.NET)在本设计中,使用硬件描述语言Verilog,在EDA工具QuartussII中,设计8位双向移位寄存器硬件电路,根据设计语言进行功能时序仿真,验证设计的正确性与可行性。

    关键字:Verilog QuartusII

    移位寄存器 1

    双向移位寄存器 8位双向移位寄存器电路设计

    武汉理工大学《能力拓展训练》说明书

    8位双向移位寄存器电路设计

    1 多功能双向移位寄存器

    1.1 基本工作原理

    移位寄存器是基本的同步时序电路,基本的移位寄存器可以实现数据的串行/并行或并行/串行的转换、数值运算以及其他数据处理功能。[wWw.niUbb.nEt)在本设计中定义移位寄存器中的数据从低位触发器移向高位为右移,移向低位为左移。

    为了扩展逻辑功能和增加使用的灵活性,某些双向移位寄存器集成电路产品又附加了并行输入、并行输出等功能。如图1所示是上述几种工作模式的简化示意图。

    双向移位寄存器 8位双向移位寄存器电路设计

    右移串行输入(DIR左移串行输出(DOL并行输入 03右移串行输出(DOR) DIL) 12并行输出

    图1 多功能移位寄存器工作模式简图

    1.2 基本实现方案

    图2所示是实现数据保持、右移、左移、并行置入和并行输出的一种电路方案。图中的D触发器FFm是N为移位寄存器中的第m位触发器,在其数据输入端插入了一个4选1数据选择器MUXm,用2位编码输入S1、S0控制MUXm,来选择触发器输入信号Dm的来源。当S1?S0?0时,选择该触发器本身输出的Qm,

    n?1n次态为Qm,使触发器保持状态不变;当S1?0,S0?1时,触发器FFm?1?Dm?Qm

    的输出Qm?1被选中,故CP脉冲上升沿到来时,FFm存入FFm?1此前的逻辑值,即n?1nn?1n而Qm从而实现右移功能;类似地,当S1?1,S0?0时,MUXmQm?Qm?1,+1?Qm,

    选择Qm?1,实现左移功能;而当S1?S0?1时,则选中并行输入数据DIm,其次

    n?1态Qm?DIm,从而完成并行数据的置入功能。上述四种操作概述于表1,此外,

    2

    双向移位寄存器 8位双向移位寄存器电路设计

    武汉理工大学《能力拓展训练》说明书

    在各触发器的输入端QN?1~Q0,可以得到N位并行数据的输出。(wwW.NiUBB.nEt)

    双向移位寄存器 8位双向移位寄存器电路设计

    图2 实现多功能双向移位寄存器的一种方案

    如表1所示,为图2多功能双向移位寄存器的功能表:

    表1 图2的功能表

    双向移位寄存器 8位双向移位寄存器电路设计

    3

    双向移位寄存器 8位双向移位寄存器电路设计

    2.2 真值表

    2.1 电路结构

    2 电路图设计

    存器,完整电路图如图3所示。[Www.nIubB.nET]

    武汉理工大学《能力拓展训练》说明书

    有效位对应的数据选择器和最高有效位对应的数据选择器。

    双向移位寄存器 8位双向移位寄存器电路设计

    图3 8位双向移位寄存器

    数据选择器编码端S1S0分别对应地接在一起,同时选择D触发器的信号数据来

    行输入。Dsr是右移串行数据输入端,Dsl是左移串行数据输入端,分别接最低

    此电路由8个4选1数据选择器、8个带异步清零的D触发器组成。所有的

    D触发器的同步,和并行输出数据的清零。另,每个D触发器的输出对应一位并

    源。D触发器时钟端CP接一起,清零端CR也同样接在一起,这样可以保证级联

    根据上一节的移位寄存器的一种基本实现方案,可以设计出8位双向移位寄

    分析电路图,可得此8位双向移位寄存器的真值表,如表2所示:

    免责申明:本栏目所发资料信息部分来自网络,仅供大家学习、交流。我们尊重原创作者和单位,支持正版。若本文侵犯了您的权益,请直接点击提交联系我们,立刻删除!

    展开全文
  • 同步串行数据发送电路设计 实现下述功能的数据发送,发送部分由发送保持寄存器和发送移位寄存器组成。 功能如下: 1.当THR不满时,可以向THR中写入数据,一旦TSR空而THR中有数据时,THR中的数据就送到TSR,TSR中...
  • 串行动态LED扫描电路

    2020-10-22 22:16:58
    4中采用C2051单片机,同时用廉价易得的74LS164和74LS138作为扩展芯片。74LS164是一个8位串入并出的移位寄存器,其此处的功能是将C2051串行通信口输出的串行数据译码并在其并口线上输出,从而驱动LED数码管。
  • 行业资料-建筑装置-带有串行输出的动态移位寄存器的喷墨打印头识别电路.zip
  • 德州仪器移位寄存器 - 串行到并行× 1 4位7段通用阳极显示× 1 电阻220欧姆× 1 跳线(通用)× 20 软件应用程序和在线服务: Arduino IDE 只是一个实验,看看我是否可以通过添加移位寄存器在arduino上使用更少的导线...
  • 当第一个CP脉冲到来后,寄存器的输出状态Q0~Q7为01111111,与此同时S1S0变为01,转换电路变为执行串入右移工作方式,串行输入数据由1片的SR端加入。随着CP脉冲的依次加入,输出状态的变化可列成表7-3所示。由表7-...

    串行/并行转换的具体过程如下:

    转换前,RC端加低电平,使1、2两片寄存器的内容清0,此时S1S0=11,寄存器执行并行输入工作方式。当第一个CP脉冲到来后,寄存器的输出状态Q0~Q7为01111111,与此同时S1S0变为01,转换电路变为执行串入右移工作方式,串行输入数据由1片的SR端加入。随着CP脉冲的依次加入,输出状态的变化可列成表7-3所示。

    由表7-3可见,右移操作七次之后,Q7变为0,S1S0又变为11,说明串行输入结束。这时,串行输入的数码已经转换成了并行输出了。

    当再来一个CP脉冲时,电路又重新执行一次并行输入,为第二组串行数码转换作好了准备。

    ②并行/串行转换器

    并行/串行转换器是指并行输入的数码经转换电路之后,换成串行输出。

    图7-4是用两片CC40194(74LS194)组成的七位并行/串行转换电路,它比图7-3多了两只与非门G1和G2,电路工作方式同样为右移。

    寄存器清“0”后,加一个转换起动信号(负脉冲或低电平)。此时,由于方式控制S1S0为11,转换电路执行并行输入操作。当第一个CP脉冲到来后,Q0Q1Q2Q3Q4Q5Q6Q7的状态为0D1D2D3D4D5D6D7,并行输入数码存入寄存器。从而使得G1输出为1,G2输出为0,结果,S1S2变为01,转换电路随着CP脉冲的加入,开始执行右移串行输出,随着CP脉冲的依次加入,输出状态依次右移,待右移操作七次后,Q0~Q6的状态都为高电平1,与非门G1输出为低电平,G2门输出为高电平,S1S2又变为11,表示并/串行转换结束,且为第二次并行输入创造了条件。转换过程如表7-4所示。

    中规模集成移位寄存器,其位数往往以4位居多,当需要的位数多于4位时,可把几片移位寄存器用级连的方法来扩展位数。

    展开全文
  • 一、 设计一个同步串行数据发送电路,系统结构如图:略。 /WR: 写信号 /RD: 读信号 D0~D7: 双向数据线 A0: 地址线 /CS: 片选信号 假定以上信号同Intel8086,8031读、写时序兼容。 Clock: 时钟(本例中...
  • 因为结论中的(1),所以图4的触发器叫做上升沿触D触发器 上升沿D触发器电路图简化如下 结论:当CP从0变1之后,Q的值为CP=0时候的D的值 移位寄存器 接下来要说的是计算机中非常重要的一个内容:串行接口 现在将数据...
  • 移位寄存器

    千次阅读 2020-12-29 09:08:06
    (5) 保持:寄存器予置任意4位二进制数码abcd,令=1,S1=S0=0,加CP脉冲,...1.实现数据的串、并行转换(1)串行输入、并行输出按图8-3-3-3接线,进行右移串入、并出实验,串入数码自定;改接线路用左移方式实现并...
  • 它实质上是一种串行移位寄存器。除了第3个触发器是通过门电路15、16构成的组合逻辑电路作用于F3的D3端以外,其余各级均是将前一级触发器的输出端连接到后一级触发器的输入端D的,计数器最后—级的端连接到第一级的D1...
  • 用(cadence)设计一个8位串行移位寄存器电路
  • 寄存器与移位寄存器(数字电路

    千次阅读 2021-06-12 22:23:29
    基本构成: 寄存器分类 移位寄存器 移位寄存器按功能分类 四位双向位移寄存器74194 移位寄存器的具体应用 1、环形计数器 2、扭环形计数器 3、一般位移型计数器 4、偶、奇数分频器(计数器) 5、序列码检测电路 ...
  •  在数字电路中,移位寄存器(英语:shift register)是一种在若干相同时间脉冲下工作的触发器为基础的器件,数据以并行或串行的方式输入到该器件中,然后每个时间脉冲依次向左或右移动一个比特,在输出端进行输出。...
  • 移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移或右移。移位寄存器不仅可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器,进行数值运算以及数据处理等,它也是...
  • 目录摘要..................................................................................................................................................11多功能双向移位寄存器...........................
  • 本文主要讲了一下关于八位移位寄存器vhdl程序设计,希望对你的学习有所帮助。
  • 目录1多功能双向移位寄存器......................................................11.1基本工作原理.........................................................11.2基本实现方案...................................
  • 题: 试用D触发器和必要的门电路(或最小数量的中规模集成电路芯片)设计两位串行输入、并行输出双向移位寄存器. 寄存器有X、K两个输入端, K控制移位方向, X输入数据. K=0时, 寄存器数据从高位移向低位, X往寄存器高位...
  • LFSR主要用于通信加扰解...线性反馈移位寄存器(LFSR)是内测试电路中最基本的标准模块结构,既用作伪随机测试码产生器,也作为压缩测试结果数据的特征分析器。 一个n阶的LFSR由n个触发器和若干个异或门组成。在实际...
  • 方式0是外接串行移位寄存器方式。工作时,数据从RXD串行地输入/输出,TXD输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或...
  • 利用单片机的串行口和I/O 端口串行输出,利用74LS164移位转换成并行数据,接在LED灯上显示。74LS164置于通用插座上。
  • 了解移位寄存器的使用—实现数据的串行,并行转换和构成环形计数器。 二、实验原理介绍 1、移位寄存器是一个具有移位功能的寄存器,是指寄存器中所存的代码能够在移位脉冲的作用下依次左移或右移。既能左移又能...
  • A B ... 在开始分析前, 我们要理清以下四个... 在完成本例的设计后, 我们可以直观地理解寄存器的组成和移位过程. 用D触发器和门电路完成寄存器设计, 其重要性与之前的基础设计相当.    
  • 移位寄存器,也叫线性移位 查表法 并行算法 一些有用的网页: CRC并行推导 https://blog.csdn.net/Old_Street/article/details/106682144 https://blog.csdn.net/qq_16923717/article/details/83826856 ...
  • 1.本次设计的密码锁的密码为一个4位的十进制数,且原始密码固化在锁内。 2. 用户按输入按键后,依次输入每位密码,若正确,则开锁;若不正确,则系统锁定,锁定结束后才可继续输入。 3. 若用户输入密码过程中... ...
  • CH452内置时钟振荡电路,可以动态驱动8 位数码管或者64 只LED,具有BCD 译码、闪烁、移位、段位寻址、光柱译码等功能;同时还可以进行64键的键盘扫描;CH452 通过可以级联的4 线串行接口或者2 线串行接口与单片机等...
  • 寄存器(Register)是用于寄存一组二值...在每个时钟上升沿的触发之下,数据会依次向左或右移动一个比特(Bit),最后在输出端进行输出,这里,数据可以以并行或者以串行的方式输入到该移位寄存器的电路器件中。 ..

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,777
精华内容 2,310
关键字:

串行移位电路