实验四 计数器

五、实验步骤与实验结果

1、用Verilog VHDL设计D触发器。打开QuarterII新建一个基于ALTERA的Cyclone系列FPGA芯片EP1C3T144C8N的项目保存在D:\dianlu\ecp1文件夹中,新建一个Verilog HDL文件,将附件一代码写入,运行无错误,查看My74161计数器的逻辑图(图1-1),重新运行,无误后,进行“Creat symbol files for current file”操作,将My74161.bsf和My74161.v文件复制到ecp2文件夹中。

实验四 计数器_第1张图片

图1-1 My74161计数器的逻辑图

对My74161计数器进行仿真。仿真图如图1-2 My74161触发器的仿真图。可知功能表4-1与仿真图一致。

实验四 计数器_第2张图片

图1-2 My74161计数器的仿真图

2、用My74161计数器组成24进制计数器。再创建一个一个基于ALTERA的Cyclone系列FPGA芯片EP1C3T144C8N的项目保存在D:\dianlu\ecp3文件夹中,通过自己设计的74161计数器进行24进制原理图设计,设计图如图2-1,连接完毕后进行引脚锁定,如图2-2。注意:24进制的进位应该从23开始,23的二进制0001_0111,

实验四 计数器_第3张图片

图2-1 24进制计数器

实验四 计数器_第4张图片

图2-2 24进制计数器引脚锁定

3、将24进制计数器进行仿真。仿真图如图3-2,仿真图解读:从0到23一直循环执行下去。

实验四 计数器_第5张图片

图3-2 仿真图

4、将三位缓冲寄存器下载到FPGA开发板上进行测试,开发板验证结果可以对比仿真图的测试结果,判断逻辑功能是否正确。结果如图4-1,注意:LED灯是是输出为0时才亮

表4-1

脉冲个数

输出结果(Q7Q6Q5 Q4Q3Q2 Q1Q0)

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

0000_0000

0000_0001

0000_0010

0000_0011

0000_0100

0000_0101

0000_0110

0000_0111

0000_1000

0000_1001

0000_1010

0000_1011

0000_1100

0000_1101

0000_1110

0000_1111

0001_0000

0001_0001

0001_0010

0001_0011

0001_0100

0001_0101

0001_0010

0001_0011

0000_0000

5、将输出的结果显示到数码位上而不是单纯的看led的亮与不亮,实现的思路,通过原理图的方式,将输出的Q连接到总线上,然后再连接到我自定义的7段码译码器上。

7段码译码器的实现见附件二,24进制的输出结果用7段码显示见5-1用7段码译码器实现24进制的原理图。

图5-1 用7段码译码器实现24进制的原理图

实验四 计数器_第6张图片

六、实验讨论与总结

1.准备工作,Quattus创建一个D触发器和一个基本RS触发器,前者为了设计三位缓冲寄存器和四位左移移位寄存器,写verilog代码的时候一定要注意是上升沿触发还是下降沿触发。

2.注意本实验是同步时序电路,千万不要连接成异步的时序电路,同步异步的区别在于clk是不是连接在同一个脉冲上

3.一个74161最大可以构成2^4进制计数器,而两个就可以构成最大2^16进制计数器,所以构造一个24进制计数器用两个74161就可以

4.构成N进制计数器可以通过反馈清零法和同步置数法进行清零,前者不如后者

5.实现了输出结果用7段码的显示

附件一:My74161触发器代码

module My74161(clk, ldn,rdn,ep,et,d3,d2,d1,d0,q3,q2,q1,q0,co);

input clk, ldn,rdn,ep,et,d3,d2,d1,d0;

output q3,q2,q1,q0, co;

reg[3:0] Q;

reg q3,q2,q1,q0,co;

always @(posedge clk or negedge  rdn)

begin

       if(!rdn)

         Q <= 4'b0000;

       else

         if(!ldn)

            begin

              Q[3] <= d3;Q[2] <= d2;Q[1] <= d1;Q[0] <= d0;

            end

         else

              if((ep == 1'b1) && (et == 1'b1))

                  Q <= Q + 4'b0001;       

end  

always @(Q,et)

       begin

              co <= Q[3] && Q[2] && Q[1] && Q[0] && et;

              q3 <= Q[3];q2 <=Q[2]; q1 <=Q[1];q0 <= Q[0];

       end 

endmodule

附件二:7段码显示的代码

module my7(clk,RN,Q,seg_out,dig_sel_n);

input clk,RN;

reg clk10ms;

input [4:0]Q;

reg [17:0] cnt2;


//10ms----20MHZ入100HZ输出

//fiv_clock_10ms: 10ms----20MHZ入100HZ输出

always @(posedge clk or negedge RN)

begin

      if(!RN)

        cnt2 <=0;

      else

         begin

           if(cnt2 == 199_999)

               cnt2 <=0;

           else

               cnt2 <= cnt2 + 1;

           if (cnt2 <100_000)

                clk10ms <= 1'b1;

           else

                clk10ms <= 1'b0;

           end

end


//zhe shi er xuan yi

reg cnt22;

always @(posedge clk10ms)

begin

      if(!RN)

         cnt22 <= 0;

      else

         begin

                if(cnt22 == 1)

                      cnt22 <=0;

                else

                      cnt22 <= cnt22 + 1;

                end

end


//zhe shi 7 duan ma shu chu

output reg[7:0] seg_out;

output reg [7:0] dig_sel_n;

function [7:0] seg7;

       input [3:0] data;

       begin

       case(data)

          0:  seg7= 8'b11000000;

            1:  seg7= 8'b11111001;

            2:  seg7= 8'b10100100;

            3:  seg7= 8'b10110000;

            4:  seg7= 8'b10011001;

            5:  seg7= 8'b10010010;

            6:  seg7= 8'b10000010;

            7:  seg7= 8'b11111000;

            8:  seg7= 8'b10000000;

            9:  seg7= 8'b10010000; 

            default: seg7= 8'b11111111;

         endcase

    end

endfunction



always @(cnt22 ,Q,RN)

    begin

        if(!RN)

             begin    dig_sel_n <= 8'b11111111; seg_out <=8'b11111111; end       

        else

            case(cnt22)

            0:  begin dig_sel_n <= 8'b11111110; seg_out <= seg7(Q%10); end

            1:  begin dig_sel_n <= 8'b11111101; seg_out <= seg7(Q/10);end

            default:

                begin dig_sel_n <= 8'b11111111; seg_out <= 8'b11111111;end

            endcase


    end

endmodule

你可能感兴趣的:(数字逻辑,fpga开发,嵌入式硬件,单片机)