1.组合逻辑:全加器2.组合逻辑:四选一选择器3.组合逻辑:38译码器4.组合逻辑:逻辑操作5.组合逻辑:移位操作6.时序逻辑:计数器7.时序逻辑:异步复位D触发器8.时序逻辑:同步复位D触发器9.时序逻辑电路:复杂D触发器
1.组合逻辑:全加器
module fulladd(
input wire a,
input wire b,
input wire c,
output wire sum,
output wire count
);
assign sum = a ^ b ^ c;
assign count = (a & b) | (b & c) | (a & c);
endmodule
- assign 中赋值的变量类型必须为wire类型;
- always中或者initial中赋值必须为reg类型;
2.组合逻辑:四选一选择器
modulde mux4_1(
input wire c,
input wire d,
input wire e,
input wire f,
input wire [1:0] s,
output reg MUX_out,
);
always@(c or d or e or f or s)
begin
case(s)
2'b00 : MUX_out = c;
2'b01 : MUX_out = d;
2'b10 : MUX_out = e;
2'b11 : MUX_out = f;
default:MUX_out = f;
endcase
end
endmodule3.组合逻辑:38译码器
always@(enable or a)
begin
if(!enable)
yout = 8'b0;
else
case(a)
3'b000 :yout = 8'b0000_0001;
3'b001 :yout = 8'b0000_0010;
3'b010 :yout = 8'b0000_0100;
3'b011 :yout = 8'b0000_1000;
3'b100 :yout = 8'b0001_0000;
3'b101 :yout = 8'b0010_0000;
3'b110 :yout = 8'b0100_0000;
3'b111 :yout = 8'b1000_0000;
end4.组合逻辑:逻辑操作
always@(a or b)
begin
q1 = a > b;
q2 = a < b;
q3 = a >= b;
end
//q3 = a >= b 与下面代码等价
if(a >= b)
q3 = 1;
else
q3 = 0;
5.组合逻辑:移位操作
module shift(
input wire [3:0] data,
output reg [3:0] q1,
output reg [3:0] q2,
);
parameter a = 2;
always@(data)
begin
q1 = data << a;//左移a位
q2 = data >> a;//右移a位
end
endmodule6.时序逻辑:计数器
module count_en(
input wire clk,
input wire reset,
input wire enable,
output reg [WIDTH-1 : 0] out
);
parameter WIDTH = 8;
parameter U_DLY = 1;
always@(posedge clk or negedge clk )
begin
if(!reset)
out <= 8'b0;
else if(enable)
out <= #U_DLY out + 1;//模仿器件延迟,一般不提倡
end
endmodule时序逻辑赋值使用非阻塞赋值<=
7.时序逻辑:异步复位D触发器
module dff_async_pre(
input wire data,
input wire clk,
input wire preset,
output reg q,
);
parameter U_DLY = 1;
always@(posedge clk or negedge preset) //异步复位
begin
if(~preset)
q <= #U_DLY 1'b1;
else
q <= #U_DLY data;
end
endmoduleif/else存在优先级
8.时序逻辑:同步复位D触发器
module dff_sync_rst(
input wire data,
input wire clk,
input wire reset,
output reg q,
);
parameter U_DLY = 1;
always@(posedge clk )//同步复位
begin
if(!reset)
q <= #U_DLY 1'b0;
else
q <= #U_DLY data;
end
endmodule9.时序逻辑电路:复杂D触发器
module dff_sync(
input wire data,
input wire clk,
input wire reset,
input wire preset,
output reg q,
);
parameter U_DLY = 1;
always@(posedge clk or negedge reset or negedge preset)//同步复位+异步复位
begin
if(!reset)
q <= 1'b0;
else if(~preset)
q <= 1'b1;
else
q <= #U_DLY data;
end
endmodule 
