实验三 可综合时序逻辑电路实验

实验三 可综合时序逻辑电路实验

由于typora无法直接向CSDN导入图片,所以删掉了时序仿真以及使用步骤中的图片。

一 、实验目的

  1. 掌握可综合Verilog语言进行时序逻辑设计的使用;

  2. 学习测试模块的编写、综合和不同层次的仿真。

二、实验内容

1. Quartus II 软件基本使用步骤

  1. 编写verilog代码,并经modelsim仿真确认正确:

  2. 新建工程,并选择FPFA开发板型号:

    选择 New Quartus II Project

    选择项目位置,并为项目命名

    选择EP4CE115F29C7型号的开发板

    完成创建项目。

  3. 添加源文件

    在本例中将shared.v作为源文件add进了项目中。

  4. 编译:

    编译成功,verilog代码的编译比起c语言的编译要更慢,这和它要综合成硬件电路有关。

  5. 在Tool–>Netlist Viewers–>RTL Viewer中查看电路的RTL视图

2. 设计一款时钟上升沿触发的D寄存器

电路原理

D触发器是一个具有记忆功能的,具有两个稳定状态的信息存储器件,是构成多种时序电路的最基本逻辑单元,也是数字逻辑电路中一种重要的单元电路。

因此,D触发器在数字系统和计算机中有着广泛的应用。触发器具有两个稳定状态,即"0"和"1",在一定的外界信号作用下,可以从一个稳定状态翻转到另一个稳定状态。

D触发器有集成触发器和门电路组成的触发器。触发方式有电平触发和边沿触发两种,前者在CP(时钟脉冲)=1时即可触发,后者多在CP的前沿(正跳变0→1)触发。

D触发器的次态取决于触发前D端的状态,即次态=D。因此,它具有置0、置1两种功能。

对于边沿D触发器,由于在CP=1期间电路具有维持阻塞作用,所以在CP=1期间,D端的数据状态变化,不会影响触发器的输出状态。

其图示符号为:

D触发器逻辑符号

其特性表如下:

DCLKQQN
0时钟上升沿01
1时钟上升沿10
x0Q(t)QN(t)
x1Q(t)QN(t)
电路功能

从上述对D触发器的描述中可以看出,D触发器的电路功能为:

  1. 每当一个时钟信号的上升沿来临时,将此时的输入D传输给输出Q;实现传输的功能;
  2. 在时钟信号的其他阶段内,输出均保持不变,实现传输的功能。

通过电路的基本功能,设计如下电路:

输入信号
输入信号 D D D,代表1位的输入端;

时钟信号 c l k clk clk,代表周期性的时钟信号;

低电平有效的复位信号 r s t n rstn rstn

使能信号 E n En En,使能信号为1,D触发器发挥作用。

Verilog代码

Dflipflop.v

module Dflipflop(
input D,
input clk,
input rstn,  
input En,
output reg Q
);

always@(posedge clk , negedge rstn)
	if(!rstn)
		Q <= 0;
	else if(En)
		Q <= D;
endmodule

代码分析:

在always语句,即敏感事件列表中posedgenegedge分别代表上升沿和下降沿,这段代码描述了当时钟信号的上升沿或者复位信号的下降沿到来时,执行语句块:

  1. 复位信号优先级高,首先判断 r s t n rstn rstn是否为0,如果为0,立即清0;
  2. 其余再判断使能信号 E n En En是否为1,当使能信号 E n En En为1的时候执行D触发器的基本功能。

Dflipflop_tb.v

`timescale 1ns/1ps
module Dflipflop_tb;
reg D;
reg clk;
reg rstn;
reg En;
wire Q;


initial 
begin
D = 0;
clk = 0;
rstn = 0;
En = 0;
end

always#10 clk = ~clk;
always#7 D = ~D;
always#50 rstn = ~rstn;
always#100 En = ~En;

Dflipflop DFF(D,clk,rstn,En,Q);
endmodule

testbench设计思路:时序电路和组合电路不同,时序电路需要在时钟的边沿观察取值的变化情况,在这种情况下,为了尽可能的展示时序电路边沿触发的特点,应该将每个输入信号的上升沿尽量交错

3. 设计一款4bBit具有并行加载功能的移位寄存器

电路原理

简介

移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移或右移。移位寄存器不仅可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器,进行数值运算以及数据处理等,它也是数字系统中应用非常广泛的时序逻辑部件之一。

分类

移位寄存器按数据移位方向可以分为左移寄存器、右移寄存器、也可以根据数据输入、输出方式分为并行输入/串行输出、串行输入/并行输出、串行输入/串行输出、并行输入/并行输出。

4位右移位寄存器工作原理

下图是一个4位右移位寄存器的逻辑电路图。其工作原理为:串行数据从触发器F_{A}D_{I}端输入,触发器FA的状态方程为:Q{n+1}_{A}=Q{n}_{I}。其余触发器的状态方程分别为Q{n+1}_{B}=Q{n}_{A}Q{n+1}_{C}=Q{n}_{B}Q{n+1}_{D}=Q{n}_{C}。可见,右移位寄存器的特点是右边寄存器的次态等于左边触发器的现态。串行输出数据从触发器FD的QD端输出,并行数据从个触发器的QA~QD端输出,两种输出方式都属于同向输出。各触发器都采用同一时钟信号,所以它们工作在同步状态。如果将FD的输出端QD接到FA的输入端DI,则可以构成循环移位的右移位寄存器。

img

电路功能

4位的右移寄存器实现的电路功能是:

L o a d / S h i f t ‾ Load/ \overline{Shift} Load/Shift信号为 1 1 1时,并行加载数据;

L o a d / S h i f t ‾ Load/ \overline{Shift} Load/Shift信号为 0 0 0时,执行移位操作,每次时钟周期上升沿到来时,右移一位。

输入信号
[ 3 : 0 ] R [3:0]R [3:0]R,4位的并行加载数据的输入端;

L L L L o a d / S h i f t ‾ Load/ \overline{Shift} Load/Shift信号,表示加载数据或者移位;

w w w,串行数据加载端, w w w表示下一个时钟上升沿到来时,应该在最高位补0还是补1;

c l k clk clk,周期性的时钟信号

输出信号

Q Q Q,表示1位的输出端

Verilog代码

reg4.v

module shift4(R,L,w,clk,Q);
input [3:0] R;
input L,w,clk;
output reg[3:0]Q;
integer k;

always@(posedge clk)
	if(L)
		Q <= R;
	else
		begin
			for(k = 0; k < 3; k = k + 1)
				Q[k] <=Q[k+1];
			Q[3] <= w;
		end

endmodule

在本段代码中,通过for循环语句实现了右移一位的功能。

reg4_tb.v

`timescale 1ns/1ps
module shift4_tb;
reg [3:0]R;
reg L;
reg w;
reg clk;
wire [3:0]Q;

initial 
begin
R = 4'b0;
L = 0;
w = 0;
clk = 0;

#10
L = 1;
R=4'b0011;
#20
L = 0;

#100
L = 1;
R=4'b1111;
#20
L = 0;

#100
L = 1;
R = 4'b0101;
#20
L = 0;
end

always#10 clk = ~clk ;
shift4 U(R,L,w,clk,Q);
endmodule

testbench编写思路

L o a d Load Load信号为1,加载数据0011,并将串行加载数据端 w w w置0,

这样一来,经过两个时钟周期,数据就会变为0000;

再重新加载一组数1111,再观察时序图,经过四个时钟周期,数据有会变为0000。

4. 设计一款4 bit带复位功能的计数器

电路原理

1、计数器的逻辑功能是记录时钟脉冲的个数

2、能够记录的最大值为计数器的模

3、基本原理是将几个触发器按照 一定顺序连接起来,根据触发器的组合状态,按照一定技术,随着时钟脉冲的变化记录时钟脉冲的个数

4、根据输出端的接线方式可以实现不同进制的计数器


计数器根据时钟信号控制的范围分为异步计数器同步计数器,这两者的主要区别在于是否共用同一个时钟信号,相较于异步计数器,同步计数器的在位数增多的情况下并无明显的延迟,所以性能较为优良,通常选择同步计数器

还可以根据递增或者递减将计数器分为递增计数器递减计数器,这两者本质上是相同,不过是一个正向计数,另一个逆向计数。

同步计数器因为只有加1操作,可以通过加/减法电路来实现,不过这种实现方法的成本很高,通常一般选择T触发器的级联来构造同步计数器

img

电路功能

4 bit 带复位功能的计数器的基本功能是:

当时钟的上升沿到来时:

  1. 若复位信号 r s t n = 0 rstn = 0 rstn=0,表示复位信号有效,此时将数据 R R R置为0;

  2. 否则,若加载信号 L o a d / s h i f t ‾ = 1 Load/ \overline{shift} = 1 Load/shift=1,此时并行加载数据 R R R

  3. 否则, Q = Q + 1 Q = Q + 1 Q=Q+1,表示又经过了一个时钟周期;并且当Q = 15时,会溢出到0.

输入信号:

[ 3 : 0 ] R [3:0] R [3:0]R,4位的加载数据端;

c l k clk clk,周期性的时钟信号;

L L L,加载信号,高电平有效;

E n En En,使能信号,高电平有效;

u p _ d o w n up\_down up_down,选择信号,决定是递增计数器或者递减计数器;

r s t n rstn rstn,复位信号,低电平有效;

输出信号:

Q Q Q

Verilog代码

counter.v

module counter(
	input [3:0] R,
	input clk,
	input L,
	input En,
	input up_down,
	input rstn,
	output reg [3:0]Q
);

always@(posedge clk)
	if(!rstn)
		Q <= 0;
	else if(L)
		Q <= R;
	else if(En)
		Q <= Q + (up_down ? 1 : -1);
endmodule

代码分析:
always语句块中的敏感事件列表:当时钟的上升沿触发

  • 复位信号 r s t n = 0 rstn=0 rstn=0时,输出0;

  • 加载信号 L = 1 L=1 L=1时,加载数据;

  • 否则每个时钟周期自增一个;

counter_tb.v

module counter_tb;
reg [3:0] R;
reg clk;
reg L;
reg En;
reg up_down;
reg rstn;
wire [3:0] Q;
initial
begin
R = 4'b0000;
clk = 0;
L = 1;
En = 1;
up_down =1;
rstn = 1;
#50
L = 0;
#200
rstn = 0;
#100
rstn = 1;
end

always #10 clk = ~clk;
counter U(R,clk,L,En,up_down,rstn,Q);
endmodule

testbench编写思路

首先,将0000加载,调整使能信号 E n = 1 En=1 En=1,选择信号 u p _ d o w n = 1 up\_down=1 up_down=1,选择递增计数器,复位信号 r s t n = 1 rstn=1 rstn=1表示无效;

接着,将加载信号 L = 0 L=0 L=0,此时开始计数;

一段时间以后, r s t n = 0 rstn=0 rstn=0,将复位信号调整为有效,清零查看效果。

5.设计一个定时器

电路原理

在本例中,将时钟的频率定为20 M H z MHz MHz,时间定为1 s s s,并且以上例中的4 bit 的计数器为底层模块:

  1. 模块1:4位计数器模块:
Created with Raphaël 2.2.0 counter_4bit模块 counter_4bit模块,表示逢10进位的4 bit计数器 等于9 进位位up置1 三个4bit计数器模块实现1000以内的计数 按毫秒计时 不作处理 yes no

将四位的计数器改装成逢10进位,这样通过四个计数器的级联就可以实现1000以内的计数;

  1. 模块2:分频器
Created with Raphaël 2.2.0 clk_div模块 clk_in原始的时钟信号 计数 等于9999 输出时钟信号反向 clk_out处理后的时钟信号 不作处理 yes no

这样以来就将原本频率为20MHz时钟信号,调整频率为频率为2kHz的时钟信号,以便于处理时以毫秒为最小单位;

  1. 顶层模块:counter

将十二位的输出作为时间的记录,十二位信号分成0-3位,4-7位,8-11位三个四位的二进制数;

分别实例化三个计数器,当低位的计数器发生进位时,高位计数器才开始计数,即将低位的进位信号作为高位的使能信号;

累计计数到999时,即表示到1秒钟,此时将输出clock调整为1;

电路功能

频率为20 MHz,即周期为50ns,也就是说每25ns,时钟反向一次;

计数1s,表示每经过1s应该会出现一个输出信号。

输入信号

c l k clk clk,输入处理后的时钟信号;

r e s e t reset reset,复位信号;

E n En En,使能信号;

输出信号

[ 11 : 0 ] n u m b e r [11:0]number [11:0]number,十二位的计数器单元;

C l o c k Clock Clock,每1秒出现1次1,代表定时器的基本功能;

Verilog代码

counter.v

module counter(
	input clk,
	input reset,
	input En,
	output [11:0]number,
	output clock
);
wire up0,up1,up2;

assign clock = (up0&up1&up2)?1:0;

counter_4bit c1(clk,reset,En,number[3:0],up0);
counter_4bit c2(clk,reset,En & up0,number[7:4],up1);
counter_4bit c3(clk,reset,En & up1 &up0,number[11:8],up2);


endmodule

最高层次模块:每毫秒计数一次,每秒钟出现一个输出信号;

counter_4bit.v

module counter_4bit(
	input clk,
	input reset,
	input en,
	output reg [3:0] four,
	output up
);

assign up = (four == 4'b1001) ? 1'b1 : 1'b0;

always@(posedge clk or posedge reset)
begin
	if(reset)
		four <= 0;
	else if(en)
	begin
		if(four == 4'b1001)
			four <= 0;
		else
			four <= four + 1'b1; 
	end
end
endmodule

四位的计数器:逢10进位;

clk_div.v

module clk_div(
	input clk_in,
	input reset,
	output reg clk_out
);
parameter diver = 9999;
reg [17:0] count;

always@(posedge clk_in or posedge reset)
begin
	if(reset)
	begin
		count <= 0;
		clk_out <= 1;
	end
	else if(count == diver)
	begin
		clk_out <= ~clk_out;
		count <= 0;
	end
	else
		count <= count + 1;
end

endmodule

分频器:将20MHz的时钟信号调整为2kHz

timer_tb.v

module timer_tb;
reg clk;
wire clk_out;
reg reset;
reg En;
wire [11:0]number;
wire clock;
initial
begin
clk = 0;
reset = 1;
En = 1;
#100
reset = 0;
end

always #25 clk = ~clk;
clk_div U1(clk,reset,clk_out);
counter U2(clk_out,reset,En,number,clock);
endmodule

testbench编写思路:

通过always语句块生成周期为50 ns 的时钟信号;

通过分频器clk_div将原始的clk信号修改为clk_out信号;

最后将处理后的clk_out的送入counter中。

6. 串并转换器

电路原理

串并转换是完成串行传输和并行传输这两种传输方式之间转换的技术。

移位寄存器可以实现并行和串行输入和输出。 这些通常配置为“串行输入,并行输出”(SIPO)或“并行,串行输出”(PISO)。

img

  1. 此配置允许从串行格式转换为并行格式。串行输入数据,如上面的SISO部分所述。一旦数据被输入,它可以在每个输出同时读出,或者它可以被移出。

    在该配置中,每个触发器是边沿触发的。所有触发器以给定的时钟频率工作。每个输入位在N个时钟周期后下降到第N个输出,导致并行输出。

    在并行输出在串行加载过程期间不应改变的情况下,期望使用锁存或缓冲的输出。在锁存的移位寄存器中,串行数据首先被加载到内部缓冲寄存器中,然后在接收到加载信号时,缓冲寄存器的状态被复制到一组输出寄存器中。通常,串行输入/并行移位寄存器的实际应用是将数据从单线上的串行格式转换为多线上的并行格式。

img

  1. 该配置具有以并行格式在线D1至D4上输入的数据,D1是MSB。 要将数据写入寄存器,写/移位控制线必须保持低电平。 为了移位,W / S控制线变为高电平并且寄存器被锁定时。 该装置用作SISO移位寄存器,其中D1作为数据输入。 只要时钟周期数不超过数据串的长度,数据输出Q将按顺序读出并行数据。
电路功能

由于串转并与并转串是两个互逆的过程,故只在此谈论并转串的情形。

输入信号:

c l k clk clk,时钟信号

r s t rst rst,复位信号,上升沿有效

l o a d load load,加载信号,高电平有效

[ 7 : 0 ] a i n [7:0] ain [7:0]ain,并行输入端

输出信号:

b o u t bout bout,串行输出端

r e a d y ready ready

最低位不是x,ready为0表示此时还不需要Load数据;

最低位是x,ready为1表示此时已经可以Load并行数据了。

Verilog代码

b2c.v

module b2c(clk,ain,rst,bout,load,ready);//并转串
 input clk,rst,load;
 input [7:0] ain;
 output reg bout;
 output reg ready;
 
 reg [7:0] temp;
 always @(posedge clk or posedge rst)
     begin
	      if(rst)
		     begin
			      temp<=8'dx;
				  bout<=1'bx;
				  ready=1'b1;//复位时可以接收输入数据
			 end
	      else
		     begin
			      if(load && ready)//置数
				    begin
				      temp<=ain;
					end
                  if(temp[7]||!temp[7])//temp[7]有数
					begin
				      bout<=temp[7];//输出由temp[7]决定,每次左移1位,并且在最低位补x
					  temp<={temp[6:0],1'bx};
					  ready<=1'b0;
				    end	
                  else
                    begin
					  ready<=1'b1;
					  bout<=1'bx;
                    end					
			 end    
	 end
endmodule

b2c_tb.v

`timescale 1ns/1ps
module b2c_tb;
reg clk;
reg rst;
reg load;
reg [7:0]ain;
wire bout;
wire ready;
initial
begin
clk = 0;
rst = 0;
load = 1;
ain = 8'b11011010;
#20
load = 1;
#40
load = 0;
end
always #10 clk = ~clk;

b2c U(.clk(clk),.rst(rst),.load(load),.ain(ain),.bout(bout),.ready(ready));
endmodule

testbench编写思路输入一组数11011010,每次时钟上升沿到来后读取一个数字判断是否与输入相等。

三、实验心得

  1. 通过本次实验,我熟练掌握了时序电路的设计思路,设计出了时钟上升沿触发的D寄存器,4bBit具有并行加载功能的移位寄存器,4 bit带复位功能的计数器,定时器,以及串并转换器。
  2. 我学会了Quartus II软件基本使用步骤,并且在设计完时序电路后使用该软件查看电路的RTL视图。
  3. 进一步掌握了对时序电路中的上升沿触发时的testbench的编写。
  • 24
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
电子科技大学数字逻辑综合实验实验4是关于Verilog时序逻辑设计的。这个实验旨在通过使用Verilog语言进行时序逻辑电路设计,帮助学生了解和掌握时序逻辑电路的基本概念和设计方法。 在本实验中,学生需要根据实验要求,设计一个特定的时序逻辑电路,并用Verilog代码实现。学生需要了解时序逻辑电路的特点和设计要求,包括时钟信号的边沿触发、时序逻辑门电路的功能等。 学生需要根据实验要求,编写Verilog代码来描述时序逻辑电路的行为和功能。他们需要使用Verilog语言的模块化设计方法,将时序逻辑电路划分为各个模块,每个模块描述特定的功能和行为。 在完成代码编写后,学生需要使用Verilog仿真工具来验证设计的时序逻辑电路的功能和正确性。他们可以输入不同的输入信号,观察电路输出信号的变化情况,以确保电路的设计和功能是正确的。 最后,学生需要编写实验报告,详细描述实验过程、实验结果以及所学到的知识和经验。他们需要总结实验中遇到的问题和解决方法,以及对时序逻辑电路设计的理解和应用。 通过完成这个实验,学生将会掌握Verilog时序逻辑设计的基本原理和方法,了解时序逻辑电路的设计过程,提高代码编写和仿真验证的能力。这将为他们今后在数字逻辑设计领域的学习和工作中打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alfred young

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值