hnu 数字电路 实验4.2 8位指令计数器PC

2.用VHDL语言设计一个8位指令计数器PC
① 理解题意,分析题目要求我们先设计一个8位指令计数器PC,在时钟下降沿时,若IN_PC=1,LD_PC=0,则c[7…0]中数据自加1;若IN_PC=0,LD_PC=1,则a[7…0]信号传入c[7…0]中。
② 打开Quartus II,新建工程,工程命名为PC,开始编写源代码。
③ 写好源代码,保存文件。

LIBRARY IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity PC is
  port(LD_PC,IN_PC,clk:in std_logic;
       a:in std_logic_vector(7 downto 0);
       c:out std_logic_vector(7 downto 0));
end PC;

architecture achieve of PC is
signal trans:std_logic_vector(7 downto 0):="00000000";
begin
  process(clk)
    begin
      if(clk'event and clk='0')  then
        if(IN_PC='1' and LD_PC='0')  then
          trans<=trans+"00000001";
        elsif(IN_PC='0' and LD_PC='1')  then
          trans<=a;
        else
          trans<=trans;
        end if;
      else
        trans<=trans;
      end if;
  end process;
  c<=trans;
end achieve;

在这里插入图片描述
④ 编译与调试。确保顶层实现的命名和工程名一致。编译成功。
在这里插入图片描述
⑤ 查看RTL视图。
在这里插入图片描述
⑥ 结果分析及结论。
如RTL图所示,在时钟下降沿时,若IN_PC=1,LD_PC=0,则c[7…0]中数据自加1;若IN_PC=0,LD_PC=1,a[7…0]信号传入c[7…0]中
⑦ 功能仿真的波形及验证。
a.新建波形文件。
b.生成网表,功能仿真。生成网表成功。
在这里插入图片描述
功能仿真成功。功能仿真波形图如图所示:
在这里插入图片描述
c.结果分析及结论
20.0ns时,处于时钟下降沿,IN_PC=1,LD_PC=0,对c进行自加操作,c=00000000+00000001=00000001,仿真无误。
40.0ns时,处于时钟下降沿,IN_PC=0,LD_PC=1,对c进行传输a值操作,c=a=10101010,仿真无误。
60.0ns时,处于时钟下降沿,IN_PC=1,LD_PC=0,对c进行自加操作,c=10101010+00000001=10101011,仿真无误。
80.0ns时,处于时钟下降沿,IN_PC=1,LD_PC=0,对c进行自加操作,c=10101011+00000001=10101100,仿真无误。
100.0ns时,处于时钟下降沿,IN_PC=0,LD_PC=1,对c进行传输a值操作,c=a=10101010,仿真无误。
120.0ns时,处于时钟下降沿,IN_PC=0,LD_PC=1,对c进行传输a值操作,c=a=10101010,仿真无误。

⑧ 实现时序仿真。
a.时序仿真成功。
在这里插入图片描述
b.时序仿真波形图如下:
在这里插入图片描述
c.结果分析及结论
20.0ns时,处于时钟下降沿,IN_PC=1,LD_PC=0,对c进行自加操作,因为存在延时,一段时间后c=00000000+00000001=00000001,仿真无误。
40.0ns时,处于时钟下降沿,IN_PC=0,LD_PC=1,对c进行传输a值操作,因为存在延时,一段时间后c=a=10101010,仿真无误。
60.0ns时,处于时钟下降沿,IN_PC=1,LD_PC=0,对c进行自加操作,因为存在延时,一段时间后c=10101010+00000001=10101011,仿真无误。
80.0ns时,处于时钟下降沿,IN_PC=1,LD_PC=0,对c进行自加操作,因为存在延时,一段时间后c=10101011+00000001=10101100,仿真无误。
100.0ns时,处于时钟下降沿,IN_PC=0,LD_PC=1,对c进行传输a值操作,因为存在延时,一段时间后c=a=10101010,仿真无误。
120.0ns时,处于时钟下降沿,IN_PC=0,LD_PC=1,对c进行传输a值操作,因为存在延时,一段时间后c=a=10101010,仿真无误。

d.编译【classic timing analysis】-在compilation report中选择【timing analysis】-【tpd】(引脚到引脚的延时)
在这里插入图片描述
从trans3到c3耗时最长,为6.612ns,从trans1到c1耗时最短,为5.432ns,可结果由耗时最长的那个决定,故整体耗时为6.612ns。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用资料,这是一个Verilog的8位计数器的示例代码: ```verilog module count( clk, rst_n, count_out ); input clk; input rst_n; output reg [7:0 count_out; always @ ( posedge clk or negedge rst_n ) begin if( !rst_n ) begin count_out <= 8'b0; end else begin count_out <= count_out + 1'b1; end end endmodule ``` 这个计数器的原理是在时钟上升沿时,输出信号从0开始,每个时钟周期输出值加1。当复位信号有效时,输出被清零。计时实现只需累加即可。计数器在许多场合都有应用,比如产生ROM地址、分频、状态机等。 对于这个计数器的激励信号,可以使用以下代码进行编写: ```verilog `timescale 1 ns/ 1 ps module count_vt(); reg clk; reg rst_n; wire [7:0 count_out; count i1 ( .clk(clk), .count_out(count_out), .rst_n(rst_n) ); initial begin clk = 0; rst_n = 0; #20; rst_n = 1; #600; $stop; $display("Running testbench"); end always begin #5 clk = ~clk; end endmodule ``` 这个激励信号在初始化时会给clk和rst_n赋初值,并通过时钟变换信号clk来模拟时钟的上升沿。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Quartus ii 与 Verilog入门教程(1)——Verilog实现8位计数器](https://blog.csdn.net/DengFengLai123/article/details/105335836)[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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值