微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 硬件描述语言Verilog HDL设计进阶之: 逻辑综合的原则以及可综合的代码设计风格

硬件描述语言Verilog HDL设计进阶之: 逻辑综合的原则以及可综合的代码设计风格

时间:06-05 来源:互联网 点击:

模块声明
output out;
input in, enable; //端口声明
assign out = enable? in: bz; //使用assign语句判断enable的值
endmodule

三态输出驱动器设计方案二。

module trist2( out,in,enable ); //模块声明
output out;
input in,enable; //端口声明
bufif1 mybuf1(out, in, enable); //bufif1是一个 Verilog门级原语(primitive)
//通过实例化该原语,实现三态门的调用
endmodule

例4.15:三态双向驱动器设计实例。

module bidir(tri_inout,out,in,en,b); //模块声明
inout tri_inout;
output out;
input in,en,b; //端口声明
assign tri_inout = en? in : bz; //三态门的输入为in
assign out = tri_inout ^ b; //三态门的输出为b
endmodule

2.时序逻辑电路设计实例
例4.16:触发器设计实例。

module dff( q,data,clk); //模块声明
output q;
input data,clk; //端口声明
reg q;
always @( posedge clk ) begin //边缘检测
q = data; //通过always语句,实现触发器
end
endmodule

例4.17:电平敏感型锁存器设计实例一(assign语句)。

module latch1( q,data,clk); //模块声明
output q;
input data,clk; //端口声明
assign q = clk ? data : q; //通过assign语句,实现的是一个锁存器
endmodule

例4.18:带置位和复位端的电平敏感型锁存器设计实例二(assign语句)。

module latch2( q,data,clk,set,reset); //模块声明
output q;
input data,clk,set,reset; //端口声明
assign q= reset ? 0 : ( set? 1:(clk? data : q ) );
//通过assign语句,实现的是一个锁存器
//其中,set为置位端,reset为复位端
//在clk为高电平时,锁存data,否则保持q值
endmodule

例4.19:电平敏感型锁存器设计实例三(always块)。

module latch3( q, data, clk); //模块声明
output q;
input data,clk; //端口声明
reg q;
always @(clk or data) begin //电平检测
if(clk) //clk为高电平时,q锁存data值
q = data;
end
endmodule

注意 有的综合器会产生一个警告信息,提示将产生了一个电平敏感型锁存器。因为此例中设计的就是一个电平敏感型锁存器,所以这个警告信息是没有问题的。

例4.20:移位寄存器设计实例。

module shifter( din,clk,clr,dout); //模块声明
input din,clk,clr;
output [7:0] dout; //端口声明
reg [7:0] dout;
always @(posedge clk) begin
if(clr) //清零
dout = 8b0;
else begin
dout = dout1; //左移一位
dout[0] = din; //把输入信号放入寄存器的最低位
end
end
endmodule

例4.21:8位计数器设计实例一。

module counter1( out, cout, data, load, cin, clk); //模块声明
output [7:0] out;
output cout;
input [7:0] data;
input load, cin, clk; //端口声明
reg [7:0] out;
always @(posedge clk) begin //边缘检测
if( load ) //加载信号检测
out = data;
else
out = out + cin;
end
assign cout= out cin; //只有当out[7:0]的所有各位都为1
//并且进位cin也为1时才能产生进位cout
endmodule

例4.22:8位计数器设计实例二。

module counter2( out, cout, data, load, cin, clk); //模块声明
output [7:0] out;
output cout;
input [7:0] data;
input load, cin, clk; //端口声明
reg [7:0] out;
reg cout;
reg [7:0] preout; //寄存器声明
always @(posedge clk) begin //边缘检测
out = preout; //触发器
end
//计算计数器和进位的下一个状态,为提高性能,load不应影响进位
always @( out or data or load or cin ) begin
{cout, preout} = out + cin; //进位操作
if(load) preout = data; //判断加载信号
end
endmodule

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top