当前位置:   article > 正文

【FPGA】Verilog:时序电路 | 触发器电路 | 上升沿触发 | 同步置位 | 异步置位_rs触发器代码verilog

rs触发器代码verilog

前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载

示例:触发器电路

  

  • 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 
  • 配置方式:USB-JTAG/SPI Flash
  • 高达100MHz 的内部时钟速度 
  • 存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A)
  • 通用IO:Switch :x8LED:x16Button:x5DIP:x8   通用扩展IO:32pin
  • 音视频/显示: 7段数码管:x8 VGA视频输出接口 Audio音频接口 
  • 通信接口:UART:USB转UART   Bluetooth:蓝牙模块 
  • 模拟接口: DAC:8-bit分辨率   XADC:2路12bit 1Msps ADC

目录

Ⅰ. 前置知识

0x00 利用7400搭建RS触发器

0x01 D触发器

0x02 带复位的D触发器

0x03 带置位/复位的D触发器

Ⅱ. Verilog实现

0x00 RS触发器(上升沿触发)

0x01 D触发器 (上升沿触发)

0x02 带复位的D触发器

0x03 同步置位/复位端口的上升沿 D 触发器

0x04 异步置位/复位端口的上升沿 D 触发器


Ⅰ. 前置知识

0x00 利用7400搭建RS触发器

注意:

a、由于 时触发器输出保持,因此若初始状态,仿真启动时会报错或状态不定。

b、根据触发器的定义,应互补,因此是非法状态。

 得出RS触发器的真值表如下:

输    入

输    出

Q

0

0

保持不变

0

1

1

0

1

0

0

1

1

1

1(0)

1(0)

0x01 D触发器

 在数字电路中,D触发器是最为简单也是最为常用的一种基本时序逻辑电路,它是构成数字电路系统的基础。

大体可分为如下几类:基本的D触发器;同步复位的D触发器;异步复位的D触发器;同步置位/复位的D触发器;异步置位/复位的D触发器。

设计上升沿触发的D触发器,即当检测到时钟上升沿到来时,触发器根据真值表输出:

触发器

D

CP

Q

Q’

D

X

0

保持

保持

D

X

1

保持

保持

D

0

上升沿

0

1

D

1

上升沿

1

0

0x02 带复位的D触发器

在数字电路中,一种常见的带有复位控制端口的上升沿D触发器的功能表如表所示:

触发器

R

D

CP

Q

Q’

D

0

X

上升沿(同步复位)

0

1

D

0

X

X(异步复位)

0

1

D

1

X

0

保持

保持

D

1

X

1

保持

保持

D

1

0

上升沿

0

1

D

1

1

上升沿

1

0

不难看出,同步复位意味着只有在时钟信号的上升沿到来并且复位控制端口的信号有效时,D触发器才进行复位操作,即将输出端口Q的值置为逻辑0,而把输出端口Q的值置为逻辑1;异步复位在于只要复位控制端口的信号有效,D触发器就会立即进行复位操作,这时的复位操作是与时钟信号无关的。

0x03 带置位/复位的D触发器

带有同步置位/复位端口的上升沿D触发器的逻辑电路符号如图所示:

它的功能表如表所示:

触发器

S

R

D

CP

Q

Q’

D

1

0

X

上升沿(同步复位)

0

1

D

0

1

X

上升沿(同步复位)

1

0

D

1

1

X

0

保持

保持

D

1

1

X

1

保持

保持

D

1

1

0

上升沿

0

1

D

1

1

1

上升沿

1

0

不难看出,只有在时钟信号的上升沿到来并且同步置位/复位端口的信号有效时,D触发器才可以进行置位或者复位操作。

Ⅱ. Verilog实现

0x00 RS触发器(上升沿触发)

设计代码:

  1. module RS(clk,R,S,q,qb);
  2. input clk,R,S;
  3. output q,qb;
  4. reg q;
  5. assign qb=~q;
  6. always@(posedge clk) 
  7.    case({R,S})
  8.        2&apos;b01: q<=0;
  9.        2&apos;b10: q<=1;
  10.        2&apos;b00: q<=1&apos;bx;
  11.        endcase
  12. endmodule

仿真代码:

  1. module test();
  2.     reg clk,R,S;
  3.     wire q,qb;
  4.        RS uut(
  5.             .R(R),
  6.             .S(S),
  7.             .clk(clk),
  8.             .q(q),
  9.             .qb(qb)
  10.             );     initial
  11.         begin
  12.             clk=0;
  13.         end
  14.          
  15.     always #10 clk=~clk; 
  16.     initial
  17.         begin
  18.             R=0;S=0;
  19.             #10 R=0;S=1;
  20.             #20 R=1;S=0;
  21.             #20 R=1;S=1;
  22.             #20 $finish;
  23.          end 
  24. endmodule

仿真波形:

0x01 D触发器 (上升沿触发)

设计文件:

  1. module async_rddf(clk, d,q,qb);
  2. input clk, d;
  3. output q,qb;
  4. reg q,qb;
  5. always @(posedge clk) begin
  6. q<=d; qb<=~d;
  7. end
  8. endmodule

仿真文件:

  1. `timescale 1ns / 1ns
  2. module test;
  3. reg clk; reg d;
  4. wire q; wire qb;
  5. async_rddf uut (.clk(clk), .d(d), .q(q), .qb(qb));
  6. initial begin
  7. clk = 0;
  8. = 0;
  9. #100;
  10. end
  11. always #20 clk=~clk;
  12. always #30 d=~d;
  13. endmodule

仿真波形:

0x02 带复位的D触发器

设计文件:

  1. module sync_rddf(clk,reset,d,q,qb);
  2. input clk,reset,d;
  3. output q,qb;
  4. reg q,qb;
  5. always @(posedge clk) begin
  6. if(!reset) begin
  7. q<=0;
  8. qb<=1;
  9. end
  10. else begin
  11. q<=d;
  12. qb<=~d;
  13. end
  14. end
  15. endmodule

仿真文件:

  1. `timescale 1ns / 1ns
  2. module test;
  3. reg clk; reg d;reg reset;
  4. wire q; wire qb;
  5. sync_rddf uut (.reset(reset),.clk(clk), .d(d), .q(q), .qb(qb));
  6. initial begin
  7. clk = 0;
  8. = 0;
  9. reset = 0;
  10. #100;
  11. end
  12. always #25 reset=~reset;
  13. always #20 clk=~clk;
  14. always #30 d=~d;
  15. endmodule

仿真波形:

0x03 同步置位/复位端口的上升沿 D 触发器

设计代码:

  1. module sync_rsddf(clk,reset,set,d,q,qb);
  2. input clk,reset,set;
  3. input d;
  4. output q,qb;
  5. reg q,qb;
  6. always @(posedge clk) begin
  7. if(!set && reset) begin
  8. q<=1;
  9. qb<=0;
  10. end
  11. else if(set && !reset) begin
  12. q<=0;
  13. qb<=1;
  14. end
  15. else begin
  16. q<=d;
  17. qb<=~d;
  18. end
  19. end
  20. endmodule

仿真代码:

  1. `timescale 1ns / 1ns
  2. module test;
  3. reg clk; reg d;reg reset;reg set;
  4. wire q; wire qb;
  5. sync_rsddf uut (.set(set),.reset(reset),.clk(clk), .d(d), .q(q), .qb(qb));
  6. initial begin
  7. clk = 0;
  8. = 0;
  9. reset = 0;
  10. set = 0;
  11. #100;
  12. end
  13. always #25 reset=~reset;
  14. always #10 set=~set;
  15. always #20 clk=~clk;
  16. always #30 d=~d;
  17. endmodule

仿真波形:

0x04 异步置位/复位端口的上升沿 D 触发器

设计代码:

  1. module set_D(clk,n_reset,n_set,d,q,qb);
  2. input clk,n_reset,n_set;
  3. input d;
  4. output q,qb;
  5. reg q,qb;
  6. always @(posedge clk or negedge n_reset or negedge n_set
  7.   begin
  8.   if(!n_set && n_reset
  9.     begin
  10.     q<=1;
  11.     qb<=0;
  12.     end
  13.   else if(n_set && !n_reset
  14.     begin
  15.     q<=0;
  16.     qb<=1;
  17.     end
  18.   else 
  19.     begin
  20.     q<=d;
  21.     qb<=~d;
  22.     end
  23.   end
  24. endmodule

仿真代码:

  1. module sim_set_D();
  2. reg clk,n_reset,n_set;
  3. reg d;
  4. wire q,qb;
  5. set_D uu1(clk,n_reset,n_set,d,q,qb);
  6. initial {clk,n_reset,n_set,d}=4&apos;b0000;
  7. always #20 clk=~clk;
  8. always #40 n_reset=~n_reset;
  9. always #80 n_set=~n_set;
  10. always #30 d=~d;
  11. endmodule

仿真波形:

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

闽ICP备14008679号