Verilog HDL的简单应用之74ls160功能的实现

结束喽!

简报

这是集成同步加法计数器,也是简单元器件的FPGA实现系列的最后一篇。希望能够对和笔者一样刚刚接触到FPGA的朋友们有所帮助,有所广益。下面,笔者将对74ls16x(x=0,1,2,3)系列进行说明,并用Verilog HDL进行74ls160功能的实现。

引脚

该系列元器件均有1+1+1+2+4+4+1+2=16根引脚,其中包括1根时钟信号引脚,1根清零信号引脚,1根置数信号引脚,2根计数使能信号引脚,4根数字输入引脚,4根数字输出引脚,1根进位引脚以及电源和接地引脚。下面为对其引脚的详细说明。

  1. 时钟信号引脚(CP):输入时钟信号,在时钟信号上升沿激发置数或计数功能。
  2. 清零信号引脚(~CR):输入清零信号。器件中清零信号引脚相当于一个非门输入,当清零信号输入为高电平(即 ~CR=0)时,计数器清零,进位引脚RCO以及数字输出引脚Q输出低电平。
  3. 置数信号引脚(~LD):输入置数信号,即当该引脚输入高电平( ~LD=0)时将输入的数字传递给输出引脚Q。
  4. 计数使能信号(EP,ET):当清零信号CR=0且置数信号LD=0时,计数使能信号有0则保持,全1且处于时钟上升沿则开始计数。
  5. 数字输入引脚(D,C,B,A):输入数字,以作为加数参与加法器功能。
  6. 数字输出引脚(Q):共4根,输出加法运算后的数据。
  7. 进位引脚(RCO):为级联提供功能支持。
  8. 电源、接地:略。

代码

`timescale 1ns / 1ps
module x74x160(
    input clk,
    input CR_n,
    input LD_n,
    input EP,ET,
    input D,C,B,A,
    output reg RCO = 1'b0,
    output [3:0]Q
    );
    reg [3:0]data_in;
    assign Q = data_in;
    always@ (posedge clk or negedge CR_n)
    begin
        if(~CR_n)
        begin
            data_in     <=4'b0;
            RCO   <=1'b0;
        end
        else if( ~LD_n )
            data_in <= { D, C, B, A };
        else if( ~EP | ~ET )
            data_in <= data_in;        
        else
        begin
           data_in <= (data_in < 4'b1010) ? data_in + 1'b1 : 4'b0;
           RCO     <= (data_in < 4'b1001) ? RCO            : 1'b1;
        end
    end
endmodule

下面为74ls160在Verilog HDL中的仿真代码:

module SIM;
    reg clk;
    reg CR_n;
    reg LD_n;
    reg EP,ET;
    reg D,C,B,A;
    wire RCO;
    wire [3:0] Q;
x74x160 u1(clk,CR_n,LD_n,EP,ET,D,C,B,A,RCO,Q);
initial begin
    clk=0;CR_n=1;LD_n=1;EP=0;ET=0;D=1;C=0;B=1;A=0;
#100;
    CR_n = 0;
#200;
    CR_n = 1; LD_n = 0;
#200
    EP = 0; ET = 1; LD_n = 1;
#200
    ET = 0;
    #100
    CR_n = 0;
    #100 
    CR_n = 1;
#260
    EP = 1;
    ET = 1;
end
always #25 clk=~clk;
endmodule

当然,时钟还是用的又细又短的那种(真的好方便啊@_@)

仿真效果

在这里插入图片描述

总之就是很可爱(〃‘▽’〃)

小结

众所周知,天下没有不散的宴席,天下没有不劳的收获。Verilog HDL的学习绝非朝日之功,跟随别人的脚步永远只能步其后尘。世上不存在完美的物件,这一系列的文章也一定会存在缺陷。为各位朋友提供某些环境(比如大一实验室笔试╮(─▽─)╭)的试题答案不是我创作的意图,一点也不是。这六篇文章(可能以后一时兴起会再续更一些)仅仅是用来告诉各位刚刚接触到Verilog HDL的朋友,不要看着Verilog HDL语法极其类似C/C++而认为可以直接着手某些协议的编写,更不能认为自己C/C++基础极好便可直接接单某些工程。相反,对于数电知识和逻辑方面严格的约束更要求初学者们从简单处入手,在简单处碰壁,在简单处探索,在简单处攻关,才能化简为繁,完善思维,纠正风格,最后获得能够自主搭建一套严密的逻辑体系的能力,甚至,摆脱外族束缚,逐步走向自主研发。这才应当是我们学习技术的目的。

  • 22
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
74LS161是一种4位二进制同步计数器,可以通过将其配置为12进制计数器来实现12进制计数。具体实现方法如下: 1.将74LS161的CP端口连接到时钟信号CLK上,将MR端口连接到复位信号RST上,将LD端口连接到逻辑1电平(即高电平)。 2.将74LS161的QA、QB、QC和QD四个输出端口连接到12进制数码管的控制端口上,以显示当前的计数值。 3.将74LS161的TC端口连接到74LS08与门的两个输入端口上,将74LS08的输出端口连接到OV端口上,以产生溢出信号。 4.将74LS161的CEP端口连接到逻辑1电平,将CET端口连接到逻辑0电平(即低电平),以将74LS161配置为同步计数器。 5.将74LS161的P0、P1、P2和P3四个并行置数端口连接到逻辑0电平,以将计数器的初始值设置为0。 6.将74LS161的LOAD端口连接到逻辑0电平,以使计数器开始计数。 7.在每个时钟周期上升沿时,74LS161会将当前计数值加1。当计数值达到11时,溢出信号OV会输出一个高电平,并将计数值重置为0。 以下是用Verilog HDL描述的74LS161计数器的代码: ```verilog module counter( input CLK, // 时钟信号 output reg [3:0] Q, // 计数器输出 output OV // 溢出信号 ); reg [3:0] count; // 计数器寄存器 always @(posedge CLK) begin if (count == 11) begin OV <= 1; // 输出溢出信号 count <= 0; // 重置计数器 end else begin OV <= 0; // 不输出溢出信号 count <= count + 1; // 计数器加1 end end assign Q = count; // 将计数器寄存器输出到Q端口上 endmodule ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值