结束喽!
简报
这是集成同步加法计数器,也是简单元器件的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根进位引脚以及电源和接地引脚。下面为对其引脚的详细说明。
- 时钟信号引脚(CP):输入时钟信号,在时钟信号上升沿激发置数或计数功能。
- 清零信号引脚(~CR):输入清零信号。器件中清零信号引脚相当于一个非门输入,当清零信号输入为高电平(即 ~CR=0)时,计数器清零,进位引脚RCO以及数字输出引脚Q输出低电平。
- 置数信号引脚(~LD):输入置数信号,即当该引脚输入高电平( ~LD=0)时将输入的数字传递给输出引脚Q。
- 计数使能信号(EP,ET):当清零信号CR=0且置数信号LD=0时,计数使能信号有0则保持,全1且处于时钟上升沿则开始计数。
- 数字输入引脚(D,C,B,A):输入数字,以作为加数参与加法器功能。
- 数字输出引脚(Q):共4根,输出加法运算后的数据。
- 进位引脚(RCO):为级联提供功能支持。
- 电源、接地:略。
代码
`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++基础极好便可直接接单某些工程。相反,对于数电知识和逻辑方面严格的约束更要求初学者们从简单处入手,在简单处碰壁,在简单处探索,在简单处攻关,才能化简为繁,完善思维,纠正风格,最后获得能够自主搭建一套严密的逻辑体系的能力,甚至,摆脱外族束缚,逐步走向自主研发。这才应当是我们学习技术的目的。