基于VIVADO的计数器设计与仿真

目录

目的与要求:

1.电路原理图:

2.代码实现之向上计数:

2.1 Verilog源码

 2.2 testbench代码

2.3 behavioral波形图

2.4 合成电路结构图

2.5 post-synthesis timing simulation:

2.6 Implementation:

2.7 post-implementation-timing simulation​编辑

2.8 资源利用率:

3.向下计数

3.1 Verilog代码

3.2 仿真电路图

3.3 behavioral

3.4 post-synthesis timing simulation

3.5 post-implementation-timing simulation

3.6 布局布线图

3.7资源利用率:

结论:


目的与要求:

基本要求:

  1. 设计一个向上计数的4-bits计数器;
  2. 创建New Project,并编写Verilog module代码实现4-bits,检查语法错误;
  3. 编写testbench.v 文件进行仿真,并得出behavioral仿真波形图,验证所实现电路的正确性;
  4. 对Verilog module电路进行综合(synthesis),整理出电路结构图,并查看综合报告,分析波形图,得出延迟信息等;
  5. 对Verilog module电路进行布局布线(implementation),整理出布局布线图,并进行post-implementation-timing simulation,分析波形图,得出延迟信息,分析原因;
  6. 查看implementation之后的资源利用率(utilization),并指出使用了的FPGA内部的时序逻辑资源(D触发器)。

高级要求(可选):计数器功能拓展:向下计数、停止\恢复计数、清零、置位等等;

实验过程及分析(包括电路原理图):

1.电路原理图:

利用加法器和D触发器组合设计出含复位的计数器,原理图如下:

8ede894dd2fa44e0820d7fe429d0a826.jpeg

向下计数的计数器和向上计数的基本一致,减去一个数只需要加上这个数的补码即可,即加上1111,计数器的停止和开始操作只需设置一个信号,当信号有效时Q保持即停止计数状态,无效时即2开始计数状态,rst_n即可作为清零端,置位只需要设置一个信号当其有效时将Q置为1111。

2.代码实现之向上计数:

2.1 Verilog源码

module fulladder(in1,in2,cin,cout,sum);
    input in1,in2,cin;
    output cout,sum;
    wire I1,I2,I3;
    half_adder a1(I1,I2,in1,in2);
    half_adder a2(sum,I3,I1,cin);
    or (cout,I2,I3);
endmodule

module counter(CLK,rst_n,Q);
input  CLK,rst_n;
output reg [3:0]Q;
wire [3:0] S,Co,cout;
fulladder u0(Q[0],1,0,Co[0],S[0]);
fulladder u1(Q[1],0,Co[0],Co[1],S[1]);
fulladder u2(Q[2],0,Co[1],Co[2],S[2]);
fulladder u3(Q[3],0,Co[2],cout,S[3]);
always @(posedge CLK )
begin
if(!rst_n)
Q<=1'b0;
else  
Q<=S;
  end
endmodule

 2.2 testbench代码

module counter_tb();
reg CLK,rst_n;
wire [3:0]Q;
counter t(.CLK(CLK),.rst_n(rst_n),.Q(Q));
initial
begin
CLK =0;rst_n=0;
#15 rst_n=1;
#500 rst_n=0;
end 

always #10 CLK=~CLK;
endmodule

2.3 behavioral波形图

3e307a2a314b4db5ad0de96941911ce1.png

显然,观察理想状态下的仿真波形图此时延时为0并且符合预设计数器工作情况,且在rst_n信号有效时将计数器置0。

2.4 合成电路结构图

22b7e286605c4fb9959c237ea1df832d.png

2.5 post-synthesis timing simulation:

41bb84d9d32948d6a01c83a443ad3110.png

任意取一个变化的状态观察考虑传输延时的波形图并对比理想状态下的波形图发现,此时波形延迟约为6.3ns

2.6 Implementation:

fd0681ddb5f44e37b4970a609e641319.png


2.7 post-implementation-timing simulation
f633ca8788914cb6bb1e585551c368b8.png

观察后仿真输出波形发现,此时输出延时约为9.358ns ,比综合后的电路传输延时要高,这其中的原因在上一次的实验报告中已经做过分析,这是由于综合后生成的门级网表只是表示了门与门之间虚拟的连接关系,并没有规定每个门的位置以及连线的长度等。所以,布局布线图是更为接近真实情况的仿真,综合仿真是比较理想化的传输延时。

当rst_n为1时计数器正常计数,当其为0时计数器置零。

2.8 资源利用率:

7a89d7aa1de7478db8156b57da68e2df.png

49be47126ec3427182a6a77c3e6fa82d.png

b3cd7dd50fd94ed0bb2c2be2957526c2.png

3.向下计数

3.1 Verilog代码

module half_adder(S, C, A, B);
output S, C;
input A, B;
xor (S, A, B);
and (C,A,B);
endmodule

module fulladder(in1,in2,cin,cout,sum);
    input in1,in2,cin;
    output cout,sum;
    wire I1,I2,I3;
    half_adder a1(I1,I2,in1,in2);
    half_adder a2(sum,I3,I1,cin);
    or (cout,I2,I3);
endmodule

module counter1(CLK,rst_n,Q,stop,set);
input  CLK,rst_n,stop,set;
output reg [3:0]Q;
wire [3:0] S,Co,cout;
fulladder u0(Q[0],1,0,Co[0],S[0]);
fulladder u1(Q[1],1,Co[0],Co[1],S[1]);
fulladder u2(Q[2],1,Co[1],Co[2],S[2]);
fulladder u3(Q[3],1,Co[2],cout,S[3]);
always @(posedge CLK )
begin
if(!rst_n)
Q<=1'b0;
else if(stop)
Q=Q;
else if (set)
Q<=4'b1111;
else 
Q<=S;
  end
endmodule

3.2 仿真电路图

08970c9fc7164c25bde046a5c2644ee1.png

3.3 behavioral

58520f478f9f47b492628d6c79b48dc7.png

3.4 post-synthesis timing simulation

e2ef87ee83bf406da9cbcee0e74149ce.png

由图,延时为6.3ns

3.5 post-implementation-timing simulation

31eb1ddf29d249f694592b80a47e1b73.png

由图,延时约为9.397ns

当stop有效时计数器停止,当stop=0时计数器又重新开始计数,当set有效时,时钟信号上升沿来到时计数器被置为1111

3.6 布局布线图

3256138e2f29465fa5105d634a899451.png

3.7资源利用率:

a7d75aa7b4da4515ba8a1b6035b9b6ca.png

597b46c12189421c9d5db8e2d3a0f870.png

c3be4e7b93be4abb9787ae53c3951a26.png

结论:

观察普通向上计数和多功能的向下计数器的波形图发现,两者的基本功能要求已经达到。对比延时发现第二个计数的延时略高于第一个,是由于第二个计数器增加了功能导致逻辑门电路的增多故传输延时增加。查看资源利用率报告看出两者使用的D触发器都是FDRE,即带使能功能的同步清除D触发器,相比与FDR多了一个使能接口,当同步复位接口为高电平时覆盖所有其他输出,时钟的上升沿触发寄存器复位(置0);当同步时钟接口为低电平且使能接口为高电平时,时钟的上升沿触发寄存器装载数据接口的数据。

Vivado中,可以使用Verilog HDL语言实现一个计数器。你可以创建一个名为"counter"的工程,并在该工程中创建一个名为"counter"的设计文件。在该设计文件中,你需要定义一个模块名为"counter",该模块包含时钟信号和复位信号作为输入,以及一个四位的输出用于计数。以下是一个示例的Verilog代码: ``` module counter( input clk, input rst, output reg out // 4位计数器 ); always @(posedge clk or posedge rst) begin if (rst) begin out <= 0; end else begin out <= out + 1; end end endmodule ``` 你还可以使用仿真设计代码来验证计数器的功能。以下是一个示例的仿真设计代码: ``` module counter_simulation(); reg clk; reg rst; wire [3:0 out; counter c(.clk(clk), .rst(rst), .out(out)); // 例化计数器模块 initial begin clk = 0; rst = 1; #10; rst = 0; end always #5 clk = ~clk; initial begin #200; // 仿真持续时间 $finish; end endmodule ``` 这段代码将实例化计数器模块,并对时钟和复位信号进行初始化,然后通过每隔5个时间单位改变一次时钟信号的值来模拟时钟信号的上升沿。仿真持续时间为200个时间单位。你可以使用这段代码来验证计数器的功能和正确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [FPGA Vivado环境下实现计数器](https://blog.csdn.net/qq_53632296/article/details/131350046)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值