利用D触发器的输入输出延迟实现二倍频电路


在电路中, 触发器的输入与输出是有一个延迟的,并不是上升沿一来,输出端马上输出数据,这是由于触发器内部电路决定的。
就算是最简单的非门,输入与输出也有延迟,更别说复杂的电路了。

下面是具体的二倍频电路(来源网络)

图中=1是一个异或门

如果我们是理想情况下,没有任何延迟,那我们就不能利用延迟设计二倍频。

而功能(行为)仿真就是基于理想情况,信号在电路中传输没有任何延迟

所以本次设计是在时序仿真下实现的

选择的芯片型号是 Altera(Intel)公司的 cyclone 4 系列EP4CE10F17C8
使用modelsim进行时序仿真
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原时钟周期20ns

可以看到,输出时钟的高电平持续时间为27350-25360=1990ps;低电平持续时间为35372-27350=8022ps,周期为10012ps,约等于10ns,基本实现二倍频

其实非门也有延迟,时序仿真中大概10ps

每次对程序编译后,执行的时序仿真都不太一样,有些许区别,这是因为每次布局布线都不太一样,导致时序有些区别

源码

参考:https://wenku.baidu.com/view/70330be8172ded630b1cb6fd.html


// 利用D触发器的输入输出延迟来达到倍频效果

module double_clk(
	input				sys_clk,
	output				d_out_n,
	output	reg			d_out = 0,	//D触发器输出端
	output				clk_out			// 输出倍频时钟

    );
    
	 
	 
    assign clk_out = sys_clk ^ d_out;
    assign d_out_n = ~d_out;	//D触发器取反
    
    always@(posedge clk_out ) begin
    	d_out <= d_out_n;
    end
    
endmodule

仿真文件

`timescale 1ns / 1ps
`define clk_period 20

module double_clk_tb();

reg				clk;

wire			clk_out;
wire			d_out;
wire			d_out_n;


	initial clk = 0;
	
	always #(`clk_period/2) clk = ~clk;
	

double_clk double_clk(
		.sys_clk		(clk),
		.d_out_n		(d_out_n), 
		.d_out		(d_out),
		.clk_out		(clk_out)
	);
	
endmodule

在进行时序仿真之前,一定要用quartus进行全编译,不能只综合,这样才能布局布线,才能进行时序仿真。
用vivado的话,原理一样

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值