Verilog 描述一位全加器,四选一选择器,计数器
这篇文章比较容易理解,所以直接放参考代码,我还没有综合过,综合之后再来修改,并且附上RTL原理图
1位全加器
此处在于使用assign
连续复制语句来实现。代码中的端口cout
,对应逻辑图中的count
(后有修改);
RTL code
module fulladd(
input ain, bin, cin,
output sum, cout
);
wire sum;
wire cout;
assign sum = ain ^ bin ^ cin;
assign cout = (ain & bin) | (bin & cin) | (ain & cin);
endmodule
逻辑图
四选一选择器
此处需注意,case
一定需要有default。
RTL code
module mux_4_1 (
input C, D, E, F,
input [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;
default : Mux_out = F;
endcase
end
endmodule
逻辑图
计数器
此处需注意可以通过定义parameter
关键字来定义模块的参数,使其具有良好的适配性。
RTL code
module count_en #(
parameter WIDTH = 8,
parameter UDLY = 1
)(
input clock, reset, enable,
output [WIDTH-1:0] out
);
reg [WIDTH-1:0] out;
always @ ( posedge clock or negedge reset) begin
if ( ~reset) begin
out <= 0;
end else if ( enable ) begin
out <= #UDLY out + 1'b1;
end
end
endmodule
逻辑图
更新
2020-03-04:添加逻辑图,程序使用Vivado
编译无Error
;