当前位置:   article > 正文

FPGA设计编程(三) 时序逻辑电路-计数器设计_时序逻辑电路设计fpga实验报告

时序逻辑电路设计fpga实验报告

目录

 

【实验要求】 

【实验软件工具】

【实验一】设计一个8位异步二进制计数器模块

1. 实验内容与原理说明

2. 实验模块程序代码和激励代码

(1)设计模块代码

(2)激励模块代码

3. 波形仿真图

4.门级电路图

【实验二】设计一个8位同步二进制计数器模块

1. 实验内容与原理说明

2. 实验模块程序代码和激励代码

(1)设计模块代码

(2)激励模块代码

3. 波形仿真图

4.门级电路图

【实验三】设计一个8位十进制计数器(异步/同步)模块

1. 实验内容与原理说明

2. 实验模块程序代码和激励代码

(1)设计模块代码

(2)激励模块代码

3. 波形仿真图

 4.门级电路图

【实验四】设计一个m序列码产生器模块(要求:码长为31,寄存器级数5,反馈系数为75(八进制)的m序列产生器)

1. 实验内容与原理说明

2. 实验模块程序代码和激励代码

(1)设计模块代码

(2)激励模块代码

3. 波形仿真图

4.门级电路图

【实验结果分析及思考】


【实验要求】 

  1. 实验内容与原理说明(包括框图、逻辑表达式和真值表)。
  2. 实验模块程序代码(设计模块Design Block)和激励代码(激励模块Test Bench)。
  3. 仿真波形图。
  4. 综合得到的门级电路图。
  5. 实验结果分析及思考。
  6. 每一次报告用Word文档提交,文件名:姓名_班级_第几次实验_学号。

【实验软件工具】

  1. QuartusII;
  2. ModelSim SE.

【实验一】设计一个8位异步二进制计数器模块

1. 实验内容与原理说明

构成计数器的低位计数器触发器的输出作为相邻计数触发器的时钟,这样逐步串行连接起来的一类计数器称为异步计数器。时钟信号的这种连接方法称为行波计数。这种异步计数器的计数延迟增加影响它的应用范围。异步清零程序的实现:通过判断最后一个状态,当为下一个状态时,就将输出清零,回到循环起点。

由于八位异步二进制计数器不便形象地展示,这里以三位二进制计数器作以描述,计数器工作前,一般都需要把所有的触发器置“0”,即计数器状态为000。这一过程称清零或复位。清零之后,计数器就可以开始计数了。第一个计数脉冲输入时,在该脉冲的下降沿到来时刻,F1翻转,Q由0变1。Q的正跳变加到F2的CP端,因为触发器都是负跳变触发,所以F2不翻转,计数器的状态为001。第二个计数脉冲输入时,F1又翻转,Q由1变0。Q的负跳变送到F2的CP端,F2翻转,Q= 1。Q的正跳变送到F3的CP端,F3不翻转,计数器状态为010。

按照上述规律,当第七个脉冲输入时,计数器状态为111。如输入第八个脉冲,计数器状态变成000,并产生一个向高位的进位信号。

由上述可知,每向触发器CP端输入一个脉冲,触发器状态就翻转一次,即其原理框图如下:

 对应的真值表如下所示:

2. 实验模块程序代码和激励代码

(1)设计模块代码

  1. module Asyn8count(clk,rst,y);
  2. input clk;
  3. input rst;
  4. output[7:0] y;
  5. wire[7:0] dy;
  6. D U0(y[0],~y[0],clk,rst);
  7. D U1(y[1],~y[1],y[0],rst);
  8. D U2(y[2],~y[2],y[1],rst);
  9. D U3(y[3],~y[3],y[2],rst);
  10. D U4(y[4],~y[4],y[3],rst);
  11. D U5(y[5],~y[5],y[4],rst);
  12. D U6(y[6],~y[6],y[5],rst);
  13. D U7(y[7],~y[7],y[6],rst);
  14. endmodule
  15. module D(y,din,clk,rst);
  16. input clk;
  17. input din;
  18. input rst;
  19. output reg y;
  20. always@(negedge clk or negedge rst) begin
  21. if(!rst) begin
  22. y<=0;
  23. end
  24. else begin
  25. y<=din;
  26. end
  27. end
  28. endmodule

(2)激励模块代码

  1. // Verilog Test Bench template for design : Asyn8count
  2. //
  3. // Simulation tool : ModelSim (Verilog)
  4. //
  5. `timescale 1 ps/ 1 ps
  6. module Asyn8count_vlg_tst();
  7. // constants
  8. // general purpose registers
  9. reg eachvec;
  10. // test vector input registers
  11. reg clk;
  12. reg rst;
  13. // wires
  14. wire [7:0] y;
  15. // assign statements (if any)
  16. Asyn8count i1 (
  17. // port map - connection between master ports and signals/registers
  18. .clk(clk),
  19. .rst(rst),
  20. .y(y)
  21. );
  22. initial
  23. begin
  24. clk<=0;rst<=0;
  25. #17 rst<=1;
  26. #6000 $stop;
  27. end
  28. always #5 clk<=~clk;
  29. endmodule

3. 波形仿真图

4.门级电路图

【实验二】设计一个8位同步二进制计数器模块

1. 实验内容与原理说明

计数器的基本原理是将几个触发器按照一定的顺序连接起来,然后根据触发器的组合状态按照一定的计数规律随着时钟脉冲的变化记忆时钟脉冲的个数。按照计数器各个触发器的时钟是否同步分为同步计数器和异步计数器。同步二进制加法计数器的基本构成方法:将触发器接成 T 触发器;各触发器都用计数脉冲 CP 触发,最低位触发器 的T 输入为 1,其他触发器的 T 输入为其低位各触发器输出信号相与。在同步8位二进制计数器的电路符号中,clk为时钟信号输入端,DATA为预置初值使能端, rst为清零端,en为计数使能端,这些端口均为高电平有效,DOUT为预置计数器初值,Q为计数输出端,COUT为进位信号。

2. 实验模块程序代码和激励代码

(1)设计模块代码

  1. module Sync8count(clk,rst,y);
  2. input clk;
  3. input rst;
  4. output reg [7:0] y;
  5. always@(posedge clk or negedge rst) begin
  6. if(~rst) begin
  7. y<=0;
  8. end
  9. else begin
  10. y<=y+1;
  11. end
  12. end
  13. endmodule

(2)激励模块代码

  1. // Verilog Test Bench template for design : Sync8count
  2. //
  3. // Simulation tool : ModelSim (Verilog)
  4. //
  5. `timescale 1 ps/ 1 ps
  6. module Sync8count_vlg_tst();
  7. // constants
  8. // general purpose registers
  9. reg eachvec;
  10. // test vector input registers
  11. reg clk;
  12. reg rst;
  13. // wirst
  14. wire [7:0] y;
  15. // assign statements (if any)
  16. Sync8count i1 (
  17. // port map - connection between master ports and signals/registers
  18. .clk(clk),
  19. .rst(rst),
  20. .y(y)
  21. );
  22. initial
  23. begin
  24. clk<=0;rst<=0;
  25. #17 rst<=1;
  26. #6000 $stop;end
  27. always #5 clk<=~clk;
  28. endmodule

3. 波形仿真图

4.门级电路图

【实验三】设计一个8位十进制计数器(异步/同步)模块

1. 实验内容与原理说明

根据计数器的构成原理,必须由四个触发器的状态来表示一位十进制数的四位二进制编码。而四位编码总共有十六个状态。所以必须去掉其中的六个状态,至于去掉哪六个状态,可有不同的选择。这里考虑去掉1010~1111六个状态,即采用8421BCD 码的编码方式来表示一位十进制数。

在十进制运算时,当相加二数之和大于9时,便产生进位。可是用BCD码完成十进制数运算时,当和数大于9 时,必须对和数进行加6修正。这是因为,采用BCD码后,在二数相加的和数小于等于9时,十进制运算的结果是正确的;而当相加的和数大于9时,结果不正确,必须加6修正后才能得出正确的结果。因此,当第一次近似求值时,可将它看成每一级是一个4位二进制加法器来执行,就好像X,和Y,是普通4位二进制数一样。设Si`代表这样得到的4位二进制数和,Ci+1`为输出进位,而Si代表正确的BCD和,Ci+1代表正确的进位,那么

当Xi+Yi+Ci<10时,Si= Si`

当Xi+Yi+Ci≥10时,Si=Si`+6

显然,当Ci+1`=1或S`≥10时,输出进位Ci+1=1。因此,可利用C i+1的状态来产生所要求的校正因子。C i+1=1时,校正因子为6;C i+1=0时校正因子为0。

当时钟信号CLK、复位信号RST、时钟使能信号EN或加载信号LOAD中任一信号发生变化,都将启动进程语句PROCESS。此时如果RST为'0',将对计数器清0,即复位。这项操作是独立于CLK的异步(独立)行为;如果RST为'1',则看是否有时钟信号的上升沿;如果此时有CLK 信号,且又测得 EN='1',接下去是判断加载控制信号 LOAD的电平。如果LOAD为低电平,则允许将输人口的4位加载数据置入计数寄存器中,以便计数器在此数基础上累加计数。而若LOAD为高电平,则允许计数器计数;此时若满足计数值小于9,即Q<9,计数器将进行正常计数,即执行语句“Q:=Q+1”,否则对计数器清0。但如果测得EN=’0’,则跳出IF语句,使Q保持原值,并将技术值向端口输出:“DOUT<=Q;”。

第二个IF语句的功能是当计数器Q的计数值达到9时由端口COUT输出高电平,作为十进制计数溢出的进位信号,而当Q为其他值时,输出低电平’0’。

2. 实验模块程序代码和激励代码

(1)设计模块代码

  1. module bit1Dcount(clk,dout,num,rst);
  2. input clk;
  3. input rst;
  4. output reg dout;
  5. output reg [3:0] num;
  6. always@(posedge clk or negedge rst) begin
  7. if(~rst) begin
  8. num<=0;
  9. end
  10. else begin
  11. if(num==9) begin
  12. num<=0;
  13. dout<=1;
  14. end
  15. else begin
  16. num<=num+1;
  17. dout<=0;
  18. end
  19. end
  20. end
  21. endmodule
  22. module bit8Dcount(clk,dout,data,rst);
  23. input clk;
  24. input rst;
  25. output reg dout=0;
  26. output reg [31:0] data;
  27. wire dout_1,dout_2,dout_3,dout_4,dout_5,dout_6,dout_7;
  28. wire[31:0] num;
  29. wire out;
  30. bit1Dcount U0(.clk(clk),.dout(dout_1),.num(num[3:0]),.rst(rst));
  31. bit1Dcount U1(.clk(dout_1),.dout(dout_2),.num(num[7:4]),.rst(rst));
  32. bit1Dcount U2(.clk(dout_2),.dout(dout_3),.num(num[11:8]),.rst(rst));
  33. bit1Dcount U3(.clk(dout_3),.dout(dout_4),.num(num[15:12]),.rst(rst));
  34. bit1Dcount U4(.clk(dout_4),.dout(dout_5),.num(num[19:16]),.rst(rst));
  35. bit1Dcount U5(.clk(dout_5),.dout(dout_6),.num(num[23:20]),.rst(rst));
  36. bit1Dcount U6(.clk(dout_6),.dout(dout_7),.num(num[27:24]),.rst(rst));
  37. bit1Dcount U7(.clk(dout_7),.dout(out),.num(num[31:28]),.rst(rst));
  38. always@(posedge clk or negedge rst) begin
  39. if(~rst) begin
  40. data<=0;
  41. dout<=0;
  42. end
  43. else begin
  44. data<=num;
  45. dout<=out;
  46. end
  47. end
  48. endmodule

(2)激励模块代码

  1. // Verilog Test Bench template for design : bit8Dcount
  2. //
  3. // Simulation tool : ModelSim (Verilog)
  4. //
  5. `timescale 1 ps/ 1 ps
  6. module bit8Dcount_vlg_tst();
  7. // constants
  8. // general purpose registers
  9. reg eachvec;
  10. // test vector input registers
  11. reg clk;
  12. reg rst;
  13. // wirst
  14. wire [31:0] data;
  15. wire dout;
  16. // assign statements (if any)
  17. bit8Dcount i1 (
  18. // port map - connection between master ports and signals/registers
  19. .clk(clk),
  20. .data(data),
  21. .dout(dout),
  22. .rst(rst)
  23. );
  24. initial
  25. begin
  26. clk<=0;rst<=0;
  27. #4 rst<=1;
  28. #130000000 $stop;
  29. end
  30. always #1 clk<=~clk;
  31. endmodule

3. 波形仿真图

 4.门级电路图

【实验四】设计一个m序列码产生器模块(要求:码长为31,寄存器级数5,反馈系数为75(八进制)的m序列产生器)

1. 实验内容与原理说明

m序列又叫做伪随机序列、伪噪声(Pseudo Noise,PN)码或伪随机码,是一种可以资先确定、可以重复产生和复制又具有随机统计特性的二进制码序列。在通信系统中有着泛的应用,如扩频通信,卫星通信的码分多址,数字数据中的加密、加扰、同步、误码率测量等领域。

伪随机序列一般用二进制表示,每个码元(即构成m序列的元素)只有“0”或“1”两种取值,分别与数字电路中的低电平或高电平相对应。

m序列是对最长线性反馈移位寄存器序列的简称,它是一种由带线性反馈的移位寄存器所产生的序列,并且具有最长周期。下图所示是一种3位m序列产生器,它将最后两级触发器的输出通过同或门反馈到第一级的输入端,其工作原理是:在清零后,3个触发器的输出均为0,于是同或门的输出为1,在时钟触发下,每次移位后各级寄存器状态都会发生变化。分析该电路的仿真波形图,其中任何一级触发器(通常为末级)的输出都是一个周期序列(或者称为m序列),但各个输出端的m序列的初始相位不同。m序列的周期不仅与移位寄存器的级数有关,而且与线性反馈逻辑和初始状态有关。此外,在相同级数的情况下,采用不同的线性反馈逻辑所得到的周期长度是不同的。

通常,将类似于上图所示电路结构的m序列产生器称为简单型码序列发生器(Simple Shift Register Generator,SSRG),它的一般结构如图4.7.4所示、其中各个触发器构成位移寄存器。M序列反馈系数表如下所示:

 

2. 实验模块程序代码和激励代码

(1)设计模块代码

  1. module PNGenerator(clk,rst,en,dout,y);
  2. input clk;
  3. input rst;
  4. input en;
  5. output dout;
  6. output reg [4:0] y;
  7. assign dout=y[0];
  8. always@(posedge clk or negedge rst) begin
  9. if(~rst) begin
  10. y<=5'b00001;
  11. end
  12. else if(en) begin
  13. y[0]<=y[1];
  14. y[1]<=y[2];
  15. y[2]<=y[3];
  16. y[3]<=y[4];
  17. y[4]<=y[0]^y[1]^y[2]^y[3];
  18. end
  19. else begin
  20. y<=y;
  21. end
  22. end
  23. endmodule

(2)激励模块代码

  1. // Verilog Test Bench template for design : PNGenerator
  2. //
  3. // Simulation tool : ModelSim (Verilog)
  4. //
  5. `timescale 1 ps/ 1 ps
  6. module PNGenerator_vlg_tst();
  7. // constants
  8. // general purpose registers
  9. reg eachvec;
  10. // test vector input registers
  11. reg clk;
  12. reg en;
  13. reg rst;
  14. // wirst
  15. wire dout;
  16. wire [4:0] y;
  17. // assign statements (if any)
  18. PNGenerator i1 (
  19. // port map - connection between master ports and signals/registers
  20. .clk(clk),
  21. .dout(dout),
  22. .en(en),
  23. .rst(rst),
  24. .y(y)
  25. );
  26. initial
  27. begin
  28. clk<=0;rst<=0;en<=0;
  29. #17
  30. rst<=1;
  31. #17
  32. en<=1;
  33. #6000 $stop;
  34. end
  35. always #5 clk<=~clk;
  36. endmodule

3. 波形仿真图

4.门级电路图

【实验结果分析及思考】

这次实验是设计8位异步二进制计数器模块、8位同步二进制计数器模块、8位十进制计数器以及m序列码产生器模块的实验,我更加理解了在FPGA课本一开始所介绍的,行为描述是最常用的描述方法。在实际的建模中,我从看到题目要求的迷惑,逐渐转变为仔细分析题目要求,建模的自信,很大原因归功于行为描述的简洁与清晰。同样,实验中需要注意的地方是有关于异步、同步还有位数以及进制的问题。

此外,通过实验,也让我从实践的角度理解了异步和同步二进制加法计数器的构成区别:异步二进制加法计数器的构成方法是将触发器接成计数触发器;最低位触发器用计数脉冲 CP 触发,其他触发器用邻低位输出的下降沿触发。而同步二进制加法计数器的构成方法:将触发器接成 T 触发器;各触发器都用计数脉冲 CP 触发,最低位触发器 的T 输入为 1,其他触发器的 T 输入为其低位各触发器输出信号相与。

在程序设计和原理图设计的过程中,我通过对Quartus的练习和使用,锻炼了自己的编程能力,对于Quartus和Modelsim联合仿真也比以往熟练不少,也学会了如何在遇到错误的时候冷静分析原因,例如端口的定义错误,测试程序的逻辑报错等等,通过对程序不断调试和改进,我对于verilog语言的理解有了很大的提升。

相关参考资源已上传:

山东大学FPGA实验参考与报告实验三时序逻辑电路计数器设计-嵌入式文档类资源-CSDN下载山东大学FPGA实验参考与报告实验三时序逻辑电路计数器设计更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/m0_52316372/85900903

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/607825
推荐阅读
相关标签
  

闽ICP备14008679号