数电第六周周结_by_yc

2023-02-25,

时序逻辑电路的设计要点:

  ①只有时钟信号复位信号可以放在敏感列表里;

  ②使用非阻塞赋值,即使用"<=";

  ③无需对所有分支进行描述,对于未描述的分支,变量将保持原值;

  ④如果敏感列表中,有一个信号是边沿触发,则所有信号都得使用边沿触发。

锁存器: 当时钟为高电平时,输出才会随输入数据的变化而更新。

//基本锁存器
module latch(clk, d, q);
input clk, d;
output q;
always @(clk, d) begin
if(clk)
q<=d;
end
endmodule //含复位控制的锁存器:高电平有效,低电平复位
module latch_reset(clk, rstn, d, q);
input clk, rstn;
input d;
output q;
always @(clk, rstn, d) begin
if(!rstn)
q<=0;
else if(clk)
q<=d;
end
endmodule

触发器: 只有在时钟上升沿时才会更新数据

//基本D触发器
module dff(clk, d, q);
input clk;
input d;
output reg q;
always @(posedge clk)
q<=d;
endmodule //含异步复位信号的D触发器:高电平有效,低电平复位
module dff_reset(clk, rstn, d, q);
input clk, rstn;
input d;
output reg q;
always @(posedge clk, negedge rstn) begin
if(~rstn)
q<=1'b0;
else
q<=d;
end
endmodule //同步复位信号的D触发器
module dff_reset(clk, rstn, d, q);
input clk, rstn;
input d;
output reg q;
always @(posedge clk) begin
if(~rstn)
q<=1'b0;
else
q<=d;
end
endmodule //含异步复位和同步使能的D触发器:使能信号高电平有效;优先级:reset>clk>en.
module dff_reset_en(clk, rstn, en, d, q);
input clk, rstn, en;
input d;
output reg q;
always @(posedge clk, negedge rstn) begin
if(~rstn)
q<=1'b0;
else if(en)
q<=d;
end
endmodule

寄存器:

//1位寄存器
module reg1(clk, reset, load, in_data, out_data);
input clk, reset, load;
input in_data;
output reg out_data;
always @(posedge clk, posedge reset) begin
if(reset)
out_data<=1'b0;
else if(load)
out_data<=in_data;
end
endmodule //N位寄存器
module regN
#(parameter N=8)
(input clk, reset, load,
input [N-1:0] in_data,
output reg [N-1:0] out_data); always @(posedge clk, posedge reset) begin
if(reset)
out_data<=0;
else if(load)
out_data<=in_data;
end
endmodule

计数器:

//模M计数器:参数M指定计数模值;参数N指定计数器所需位数。
module counter_mod_m
#(parameter M=10,
parameter N=4)
(input clk, reset,
output [N-1:0] qd,
output cout); always@(posedge clk) begin
if(reset)
regN<=0;
else if(regN<(M-1))
regN<=regN+1;
else
regN<=0;
end
assign qd = regN;
assign cout=(regN==(M-1))?1'b1:1'b0;
endmodule

数电第六周周_by_yc的相关教程结束。

《数电第六周周结_by_yc.doc》

下载本文的Word格式文档,以方便收藏与打印。