实验目的

  • (1)熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法;
  • (2)通过实验理解和掌握RS触发器原理;
  • (3)学习用Verilog HDL语言行为级描述方法描述RS触发器电路。

实验任务

本实验的任务是描述一个RS触发器电路,并通过STEP FPGA开发板的12MHz晶振作为触发器时钟信号clk,拨码开关的状态作为触发器输入信号S,R,触发器的输出信号Q和非Q,用来分别驱动开发板上的LED,在clk上升沿的驱动下,当拨码开关状态变化时LED状态发生相应变化。

实验原理

基本RS触发器可以由两个与非门按正反馈方式闭合构成。通常将Q端的状态定义为锁存器的状态,即Q=1时,称为锁存器处于1的状态;Q=0时,称锁存器处于0的状态,电路具有两个稳态。电路要改变状态必须加入触发信号,因是与非门构成的基本RS触发器,所以,触发信号是低电平有效。非Rd和非Sd是一次信号,只能一个个加,即它们不能同时为低电平,因为会有逻辑矛盾(Q == 非Q)。


Verilog HDL建模描述

用数据流描述实现的RS触发器
程序清单rs_ff.v

  module rs_ff
   ( 
    input wire clk,r,s,			//rs触发器输入信号		
    output reg q,				//输出端口q,在always块里赋值,定义为reg型
    output wire qb				//输出端口非q
   );
   assign qb = ~q;
   always@(posedge clk)
	begin
		case({r,s})
			2'b00:  q <= q;      //r,s同时为低电平,触发器保持状态不变
			2'b01:  q <= 1'b1;	   //触发器置1状态
			2'b10:  q <= 1'b0;   //触发器置0状态
			2'b11:  q <= 1'bx;   //r,s同时为高电平有效,逻辑矛盾,触发器为不定态
		endcase
	end
  endmodule
 

仿真文件rsfftb.v

  `timescale 1ns/100ps    //仿真时间单位/时间精度
   module rs_ff_tb();       
    reg    clk,r,s;         	//需要产生的激励信号定义
    wire   q,qb;      	  //需要观察的输出信号定义
    //初始化过程块
    initial
    begin
	  clk = 0;
	  r = 0;
	  s = 0;
	  #50
	  r = 0;
	       s = 1;
	  #50
	  r = 1;
          s = 0;
	  #50
	  r = 1;
	       s = 1;
	  #50
	  r = 0;
	       s = 1;
    end
   always #10 clk = ~clk;      //产生输入clk,频率50MHz
   //module调用例化格式
   rs_ff  u1 (      //rs_ff表示所要例化的module名称,u1是我们定义的例化名称
		.clk(clk),     //输入输出信号连接。
		.r(r),
		.s(s),
		.q(q),    //输出信号连接
		.qb(qb)   
             );
  endmodule
 

实验步骤

  1. 打开Lattice Diamond,建立工程。
  2. 新建Verilog HDL设计文件,并键入设计代码。
  3. 综合并分配管脚,将输入信号clk,r,s分配至拨码开关,将输出信号q,qb分配至板卡上的LED。clk/C1,r/M7,s/M8,q/N13,qb/M12
  4. 根据仿真教程,实现对本工程的仿真,验证仿真结果是否与预期相符。
  5. 如果仿真无误,构建并输出编程文件,烧写至FPGA的Flash之中。
  6. 观察输出结果。

仿真结果和实验现象

  1. 仿真结果如下图所示:
  2. 实验现象:拨动拨码开关拨至01,led1亮,led2灭。拨动拨码开关拨至10,led1灭,led2亮。拨动拨码开关拨至00,保持上一个状态。