首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

VHDL设计进阶:逻辑综合的原则以及可综合的代码设计风格

VHDL设计进阶:逻辑综合的原则以及可综合的代码设计风格

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? 1clk? 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 = 8'b0;
else begin
dout = dout<<1; //左移一位
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
返回列表