密码锁设计-verilog及仿真

Posted QQ_778132974

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了密码锁设计-verilog及仿真相关的知识,希望对你有一定的参考价值。

实验目的:
(1)掌握自顶向下(Top-Down)的结构化设计方法;
(2)运用Verilog语言完成数字系统设计,锻炼对具有一定复杂度和规模的问题的分析与求解能力。

实验内容:
实现3位数字的密码锁,每位数字取值1、2、3。
功能说明:
A. 按S1复位进入初始状态,数码管显示00000000。
B. 若已解锁,或未设置密码:按S2设置密码,通过44小键盘输入3位初始密码,
输入满三位后按S5确定,成功后GLD0亮;
C. 若已设置密码:按S3可以验证密码,通过小键盘逐位输入密码,输入满三位
后按S5确定,如果正确则进入解锁状态,累计失败次数清零,不正确则累计失
败次数+1,显示对应数量红灯,若累计3次则系统锁住,数码管显示ffffffff,
所有功能无效(除复位)。
功能说明:
D. 每次进入新状态,数码管清除上个状态的输入,每个状态下,同步显示键盘输
入到数码管,显示方式不限,只需要逐位显示3个数字即可。
E. 密码匹配要求用状态机实现。
使用4
4小键盘

verilog--逻辑仿真的构成及设计举例

      1、 模块设计完成之后,我们需要检验功能的正确性,通过设计激励块来完成测试。(可以把激励块理解成一个新的设计块,但是又和原来的设计块存在联系)

激励块测试块分开设计是一种良好的设计风格。激励块一般称为测试台。可以使用不同的测试台对设计块进行全面测试。

      2、激励块的设计有两种模式。

      一种是将激励块作为顶层模块,调用(实例引用)并直接驱动设计块,如图1。顶层为激励块,由它控制clk和reset信号,检查并显示输出信号q。

      另一种是在一个虚拟的顶层模块中调用(实例引用)激励块和设计块,激励块和设计块之间通过接口进行交互,如图2。激励块驱动信号d_clk和d-reset,这两个信号则连接到设计块的clk和reset输入端口,激励模块同时检查和显示信号c_q,这个信号连接到输出端口q,顶层模块的作用只是调用(实例引用)设计块和激励块。

    

3、设计举例

☆设计块:我们使用自顶向下的方法设计。

①顶层模块:脉动进位计数器

module ripplp_carry_counter(q,clk,reset);
output  [3:0] q;
input clk, reset;
//调用(实例引用)四个T触发器
T_FF tff0(q[0],clk,reset);
T_FF tff1(q[1],clk,reset);
T_FF tff2(q[2],clk,reset);
T_FF tff3(q[3],clk,reset);
endmodule

 

②定义模块T_FF

module T_FF(q,clk,reset);
output  q;
input clk, reset;
wire d;
D_FF dff0(q,d,clk,reset);//调用(实例引用)一个D触发器
not n1(d,q);//调用(实例引用)一个非门,非门是verilog语言的内置原语部件
endmodule

③定义模块D触发器

//异步复位D触发器
module D_FF(q,d,clk,reset);
output q;
input d,clk,reset;
reg q;
always @(posedge reset or negedge clk)
 if (reset)
   q<=1\'b0;
 else
   q<=d;
endmodule

通过以上三步,我们按照自顶向下的设计方法完成了设计块。接下来就要对设计块施加激励信号以检验其是否正确,即设计激励块。

 

☆激励块:激励块可以看做是一个新的模块,但同时又和设计块一一对应。在这一例中按照前面的第一种方法来设计激励块,即在激励块中实例引用设计块。

①激励块的编写

module stimulus;

reg clk;
reg reset;
wire [3:0] q;

//实例引用已经设计好的模块
ripple_carry_counter r1(q,clk, reset);

//控制驱动设计块的时钟信号,时钟周期为10个单位时间
initial
     clk =1\'b0;//把clk设置为0
always
     #5 clk =~clk;//每5个时间单位时钟翻转一次,即时钟周期为10个时间单位

//控制驱动设计块的reset信号
initial
begin
  reset = 1\'b1;
  #15 reset = 1\'b0;
  #180 reset = 1\'b1;
  #10 reset =1\'b0;
  #20 $finish;//终止仿真
end

//监视输出
initial
  $monitor($time," Output q= %d",q);

endmodule

 在激励块设计完成之后就可以进行仿真来验证设计块的功能正确性了。

②仿真

在激励块中信号有clk,reset,和计数器的4位输出。

信号clk的重复周期为10个单位;

信号reset在0-15和195至205两个时间区段为1,其余时刻为0;

输出信号q从0开始计数到15;

整个仿真在225个时间单位(此例中每个单位为1ns)终止。

仿真结果如下图所示:

检测输出结果为:

 

以上是关于密码锁设计-verilog及仿真的主要内容,如果未能解决你的问题,请参考以下文章

基于FPGA的数字时钟verilog开发

基于FPGA的分形编码器verilog设计——详细版

基于FPGA的正弦PWM产生系统verilog实现

IDCT-FPGA基于FPGA的IDCT变换的verilog实现

verilog hdl中啥是综合?啥是模拟?

Verilog语法之测试文件