第4个示例.七段数码管
这里新的语法点就是{,,}代表的拼接运算符,有点像C语言里的strcat函数
第5个示例.D触发器——时序逻辑电路的描述方法
module d_ff (q, d, clk);
output q;
input d, clk;
reg q;
always @(posedge clk)
q=d;
endmodule
posedge上升沿检测语句(从0 变为1 、0 变为x 和z 、或者从x ,z 变为1),negedge下降沿(从1 变为0 、1 变为x 和z 或者从x ,z 变为0)
这里既然进入了时序电路单元的描述,首先了解Verilog中变量的赋值
Verilog有两种赋值语句:
1.assign:连续赋值语句,=赋值,主要用于组合逻辑
2.always:过程赋值,reg变量赋值,分两类:阻塞类“=”(意味着立即执行),非阻塞类“<=”(语句块中的语句同时被赋值),通常时序用后者
同时,有以下原则需要遵守:
原则1 :在同一个always 块中同时建立时序和组合逻辑电
路时,用非阻塞赋值。
原则2:在同一个always 块中不要同时使用非阻塞赋值和
阻塞赋值。
原则3 :不要在多个always 块中为同一个变量赋值
第6个示例.计数器
同步清零4位加法计数器
module count(out,data,load,reset,clk);
output[7:0] out;
input[7:0] data;
input load,clk,reset;
reg[7:0] out;
always @(posedge clk) //clk 上升沿触发
begin
if (!reset) out <= 8'h00; // 同步 清零,低电平有效
else if (!load) out <= data; // 同步置数
else out <= out + 1; // 计数
end
endmodule
熟悉if(!)是程序低有效的表达
异步清零
module count2(out,reset,clk);
output[7:0] out ;
input clk, reset ;
reg[7:0] out ;
always @(posedge clk or negedge reset)
begin
if(!reset)
out<= 0 ;
else
out<= out + 1; // 计数
end
endmodule