2013-06-14 16:49:12
简单时序逻辑电路的verilog实现,包括D触发器、JK触发器、锁存器、寄存器、
简单时序逻辑电路的实现
D触发器(带有同步复位、置位或者异步复位、置位)
RTL描述:
1 module dff( 2 clk, 3 rst_n, 4 set_n, 5 din, 6 q, 7 q_n 8 ); 9 input clk; 10 input rst_n; 11 input set_n; 12 input din; 13 14 output q; 15 output q_n; 16 17 reg q; 18 reg q_n; 19 /* 20 always@(posedge clk) 21 if(!rst_n) //同步清零 22 begin 23 q <= 1\'b0; 24 q_n <= 1\'b1; 25 end 26 else if(!set_n) //同步置位 27 begin 28 q <= 1\'b1; 29 q_n <= 1\'b0; 30 end 31 else 32 begin 33 q <= din; 34 q_n <= ~din; 35 end 36 */ 37 38 always@(posedge clk or negedge rst_n or negedge set_n) 39 if(!rst_n) //异步清零 40 begin 41 q <= 1\'b0; 42 q_n <= 1\'b1; 43 end 44 else if(!set_n) //异步置位 45 begin 46 q <= 1\'b1; 47 q_n <= 1\'b0; 48 end 49 else 50 begin 51 q <= din; 52 q_n <= ~din; 53 end 54 55 endmodule
同步复位、置位RTL图;
(可以看到器件本身的D触发器带有复位、置位端,但是高电平有效的,代码中是低电平有效,因此要经过一个非门;另外,期间本身的D触发器输出只有Q,没有~Q,因此需要两个D触发器实现所需功能)
若用异步复位与置位,综合结果:
(可以看到,所用到的D触发器是不同的,此处为fdcp,而同步时为fdrs,是不同的)
JK触发器(带有同步复位、置位或者异步复位、置位)
RTL描述:
1 module jk_ff(clk, 2 rst_n, 3 set_n, 4 j, 5 k, 6 q 7 ); 8 input clk; 9 input rst_n; 10 input set_n; 11 input j; 12 input k; 13 14 output q; 15 16 reg q; 17 18 always@(posedge clk) 19 if(!rst_n) //同步清零 20 begin 21 q <= 1\'b0; 22 end 23 else if(!set_n) //同步置位 24 begin 25 q <= 1\'b1; 26 end 27 else 28 begin 29 case({j,k}) 30 2\'b00 : q <= q; 31 2\'b01 : q <= 0; 32 2\'b10 : q <= 1; 33 default : q <= ~q; 34 endcase 35 end 36 /* 37 always@(posedge clk or negedge rst_n or negedge set_n) 38 if(!rst_n) //异步清零 39 begin 40 q <= 1\'b0; 41 end 42 else if(!set_n) //异步置位 43 begin 44 q <= 1\'b1; 45 end 46 else 47 begin 48 case({j,k}) 49 2\'b00 : q <= q; 50 2\'b01 : q <= 0; 51 2\'b10 : q <= 1; 52 default : q <= ~q; 53 endcase 54 end 55 */ 56 endmodule
同步复位、置位RTL图:
(异步复位、置位RTL图除了将fdrs改为fdcp,其他完全相同)
锁存器
寄存器