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

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

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

ways块描述组合逻辑
{va,vb,vc,vd}={a,b,c,d};
sort2(va,vc); //信号重组
sort2(vb,vd);
sort2(va,vb);
sort2(vc,vd);
sort2(vb,vc);
{ra,rb,rc,rd}={va,vb,vc,vd};
end

task sort2; //x与y互换任务
inout [t:0] x,y;
reg [t:0] tmp;
if(x > y) begin
tmp = x; //使用临时变量tmp保存x的值
x = y;
y = tmp;
end
endtask
endmodule

例4.9:比较器的设计实例(利用赋值语句设计组合逻辑)。

module compare(equal,a,b); //模块声明
output equal;
input [size-1:0] a,b; //端口声明
parameter size=1; //参数声明
assign equal =(a==b)? 1 : 0; //比较器
endmodule

例4.10:3-8译码器设计实例(利用赋值语句设计组合逻辑)。

module decoder(out,in); //模块声明
output [7:0] out;
input [2:0] in; //端口声明
assign out = 1b1in; //把最低位的1左移 in(根据从in口输入的值)位
//将移位结果赋予out
endmodule

例4.11:3-8编码器的设计实例。
编码器设计方案一。

module encoder1(none_on,out,in); //模块声明
output none_on;
output [2:0] out;
input [7:0] in; //端口声明
reg [2:0] out;
reg none_on; //寄存器声明
always @(in) begin: local //in有变化时,触发
integer i; //变量声明
out = 0;
none_on = 1; //初始化
for( i=0; i8; i=i+1 ) begin //for循环语句
if( in[i] ) begin //将in中值为1的位编码
out = i;
none_on = 0;
end
end
end
endmodule

编码器设计方案二。

module encoder2 ( none_on,out2,out1,out0,h,g,f,e,d,c,b,a); //模块声明
input h,g,f,e,d,c,b,a;
output none_on,out2,out1,out0; //端口声明
wire [3:0] outvec; //向量声明
assign outvec = //使用assign语句实现输出向量赋值
h ? 4b0111 : g ? 4b0110 : f ? 4b0101:
e ? 4b0100 : d ? 4b0011 : c ? 4b0010 :
b ? 4b0001 : a ? 4b0000 : 4b1000;
assign none_on = outvec[3]; //使用assign语句进行编码
assign out2 = outvec[2];
assign out1 = outvec[1];
assign out0 = outvec[0];
endmodule

编码器设计方案三。

module encoder3 ( none_on,out2,out1,out0,h,g,f,e,d,c,b,a); //模块声明
input h,g,f,e,d,c,b,a;
output none_on,out2,out1,out0; //端口声明
wire [3:0] outvec; //向量声明
assign {none_on,out2,out1,out0} = outvec; //与上例的编码方式一致
always @( a or b or c or d or e or f or g or h) begin
if(h) outvec=4b0111; //使用if_else语句实现向量赋值
else if(g) outvec=4b0110; //共9个分支,其中向量的低3位有8种编码方式
else if(f) outvec=4b0101;
else if(e) outvec=4b0100;
else if(d) outvec=4b0011;
else if(c) outvec=4b0010;
else if(b) outvec=4b0001;
else if(a) outvec=4b0000;
else outvec=4b1000;
end
endmodule

例4.12:多路器的设计实例。

使用assign赋值语句、case语句或if-else语句可以生成多路器电路。如果条件语句(case或if-else)中分支条件是互斥的话,综合器能自动地生成并行的多路器。
多路器设计方案一。

modul emux1(out,a,b,sel); //模块声明
output out;
input a,b,sel; //端口声明
//使用assign语句检查输入信号sel的值
assign out = sel ? a : b; //当sel为1时,out为a;否则为b
endmodule

多路器设计方案二。

module mux2( out,a,b,sel); //模块声明
output out;
input a,b,sel; //端口声明
reg out;
always @(a or b or sel) begin //用电平触发的always块来设计多路器的组合逻辑
case( sel ) //使用case语句检查输入信号sel的值
1b1: out = a; //如果为1,输出out为a
1b0: out = b; //如果为0,输出out为b
default: out = bx; //默认状态
endcase
end
endmodule

多路器设计方案三。

module mux3( out,a,b sel); //模块声明
output out;
input a, b, sel; //端口声明
reg out;
always @( a or b or sel ) begin
if( sel ) //使用if_else语句检查输入信号sel的值
out = a; //如果为1,输出out为a
else
out = b; //如果为0,输出out为b
end
endmodule

例4.13:奇偶校验位生成器设计实例。

module parity( even_numbits,odd_numbits,input_bus); //模块声明
output even_numbits, odd_numbits;
input [7:0] input_bus; //端口声明
assign odd_numbits = ^input_bus; //当input_bus中1的个数为奇数时,输出为1
assign even_numbits = ~odd_numbits; //此时输出even_numbits为0
endmodule

例4.14:三态输出驱动器设计实例(用连续赋值语句建立三态门模型)。
三态输出驱动器设计方案一。

module trist1( out,in,enable); //

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

网站地图

Top