简介
今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做文档记录,为自己加油。
本实验,基于ALINX AX7020开发板,芯片为xc7z020clg400-2。
开发板输入时钟为50MHz
学了这么久,还没有整理过关于FPGA基本逻辑单元的学习,今天先整理一部分,日后再来更新。
一、锁存器 latch—对脉冲电平敏感,在时钟脉冲的电平作用下改变状态
锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,当锁存器处于使能状态时,输出才会随着数据输入发生变化。(简单地说,它有两个输入,分别是一个有效信号EN,一个输入数据信号DATA_IN,它有一个输出Q,它的功能就是在EN有效的时候把DATA_IN的值传给Q,也就是锁存的过程);
D锁存器
E=1时,Q=D;E=0时,Q不变。
应用场合:数据有效滞后于时钟信号有效,这意味着时钟信号先到,数据信号后到。在某些运算器电路中有时采用锁存器作为数据暂存器 ;
优点:面积小、锁存器比FF快,所以用在地址锁存是很合适的,不过一定要保证所有的latch信号源的质量,锁存器在CPU设计中很常见,正是由于它的应用使得CPU的速度比外部IO部件逻辑快许多。latch完成同一个功能所需要的门较触发器要少,所以在asic中用的较多;
缺点:时序分析较困难;
不用锁存器的原因有二:
1、锁存器容易产生毛刺,
2、锁存器在ASIC设计中应该说比FF要简单,但是在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用一个逻辑门和FF来组成锁存器,这样就浪费了资源;
二、D触发器
最后代码
`timescale 1ns/1ps
module seq_logic(
input clk,
input rst_n,
input latch_d,
input dff_d,
input [1:0] reg_d,
input shift_ctrl,
output reg latch_q, //锁存器输出
output reg dff_q, //D触发器
output reg[1:0] reg_q, //2位寄存器
output reg[3:0] shift_reg //移位寄存器
);
//D锁存器,clk=1,q=d;clk=0,q不变;
always@(clk,latch_d)
begin
if(clk)
latch_q <= latch_d;
else
latch_q <= latch_q;
end
//D触发器
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
dff_q <= 1'b0;
else
dff_q <= dff_d;
end
//2位寄存器
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
reg_q <= 2'b00;
else
reg_q <= reg_d;
end
//4位的移位寄存器
parameter DATA=4'b0001;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
shift_reg <= 4'b0000;
else
case(shift_ctrl)
2'b00:shift_reg <= DATA;
2'b01:shift_reg <= {DATA[0],DATA[3:1]};
2'b10:shift_reg <= {DATA[2:0],DATA[3]};
default: shift_reg <= DATA;
endcase
end
endmodule