verilog编程之路
assign
assgin a = b&c;//assign语句一般用于组合逻辑的赋值。
always
always@(posedge cp)
begin if(clr) a<=0;
else q<=d;
end
always 用于描述组合逻辑,也可以用于描述时序逻辑。
用行为描述2——4线译码器
module _2to4decoder(Y,A1,A2,E);
input A1,A0,E;
output [3:0] Y;
reg[3:0]Y;//在非阻塞赋值时候,被赋值的变量必须是reg类型。
//2.时序逻辑大多数情况是并行执行,用非阻塞赋值,此时begin···end语句的作用只是相当于函数的花括号,
//将一段语句划分成块,但是在块里语句依然是并行执行的,在一个模块完成时会同时执行,
//所以在非阻塞赋值中begin···end语句并非顺序执行的。
always@(*)
if(~E)Y = 4'b1111;//如果不使能,则4个引脚均无效
else
begin
case{(A1,A0)}//位拼接运算符
2'b00:Y<=4'b1110;
2'b01:y<=4'b1101;
2‘b10:y<=4'b1011;
b'b11:y<=4'b0111;
default:y<=4'bx;//高阻态
endcase
end
endmodule
//行为描述实现4选一数据选择器
module mux4_1(out,in0,in1,in2,in3,s0,s1);
input in0,in1,in2,in3;
output out;
reg out;
always@(*)
case{(s1,s0)}
2'b00;out <= in0;
2'b01:out <= in1;
2'b10:out <= in2;
2'b11:out <= in3;
default:out<=1'bx;
endcase
endmodule
//数据流描述,多用于组合逻辑电路,他由assign开始,后面跟着由操作数和运算符组成的逻辑表达式
//数据流描述的四选一数据选择器
module mux4_1(out,in0,in1,in2,in3,s0,s1);
input in0,in1,in2,in3,s0,s1;
output out;
assign out = (in0&~s1&~s0)|(in1&~s1&s0)|(in2&s1&~s2)|(in3&s1&s2);
endmodule
//数据流描述2——4线译码器
module _2to4(Y,A1,A0,E)
input A1,A0,E;
output [3:0] Y;
assign Y[0] = ~(~A0&~A1&~E);
assign Y[1] = ~(~A0&A1&~E);
assign Y[2] = ~(A0&~A1&~E);
assign Y[3] = ~(A0&A1&~E);
endmodule
//组合逻辑电路的verilog建模
//采用行为描述语言编写3——8译码器
module _3to8(Y,E,A)
input [2:0] E,A;
output [7:0] Y;
reg [7:0]Y;
wire B;
assign B = E[2]&~E[1]&~E[0];
always@(*)
begin
if(~B)Y = 8'b11111111;
else
case{(A}
3b'000:Y = 8b'11111110;
3b'001:Y = 8b'11111101;
3b'010:Y = 8b'11111011;
3b'011:Y = 8b'11110111;
3b'100:Y = 8b'11101111;
3b'101:Y = 8b'11011111;
3b'110:Y = 8b'10111111;
3b'111:Y = 8b'01111111;
default:Y = 8b'11111111;
endcase
end
endmodule
//数据选择器(8选一)
module mux8_1(Y,E,S,D)
input [7:0]D;
input [2:0]S;
input E;
output reg Y;
always@(*)
begin
if(~E)Y = 0;
else
case(S)
3'b000:Y = D[0];
3'b001:Y = D[1];
3'b010:Y = D[2];
3'b011:Y = D[3];
3'b100:Y = D[4];
3'b101:Y = D[5];
3'b110:Y = D[6];
3'b111:Y = D[7];
default:Y = 0;
endcase
end
endmodule