目录
Verilog编程基础练习
3—8译码器
理论学习
3-8译码器的输入信号共有3个,也就是可以输入8种不同的二进制编码,分别是000、001、010、011、100、101、110和111。对于每一种输入信号,3-8译码器都会产生对应的输出信号,输出信号共有8个,分别标识为Y0到Y7。
真值表
logisim仿真图
verilog编程仿真实现
根据功能分析,该工程只需实现一个3-8译码器的功能,所以设计一个模块即可。模块命名a38decoder,模块的输入为3个bit信号,输出为1个8bit信号,实现通过输入3个信号组成的二进制的8种情况来对应输出8bit的8种不同状态,根据上面分析可得出visio框图如图:
得出电路:
代码实现:
module a38decoder
(
input wire in1,
input wire in2,
input wire in3,
output reg [7:0] out
);
always@(*)
if({in1,in2,in3} == 3'b000)
out = 8'b0000_0001;
else if({in1,in2,in3} == 3'b001)
out = 8'b0000_0010;
else if({in1,in2,in3} == 3'b010)
out = 8'b0000_0100;
else if({in1,in2,in3} == 3'b011)
out = 8'b0000_1000;
else if({in1,in2,in3} == 3'b100)
out = 8'b0001_0000;
else if({in1,in2,in3} == 3'b101)
out = 8'b0010_0000;
else if({in1,in2,in3} == 3'b110)
out = 8'b0100_0000;
else if({in1,in2,in3} == 3'b111)
out = 8'b1000_0000;
else
out = 8'b0000_0001;
endmodule
分析
(1)代码生成的电路更为复杂,更为完整。
(2)不可以把reg换成wire。
从仿真分析角度来说wire对应于连续赋值,如assignreg对应于过程赋值,如always,initial。
全加器
一位全加器
logisim 实现
VERILOG实现
代码:
module Fulladder(
input ain,bin,cin,
output reg cout,sum
);
reg s1,s2,s3;
always @(ain or bin or cin) begin
sum=(ain^bin)^cin;
s1=ain&cin;
s2=bin&cin;
s3=ain&bin;
cout=(s1|s2)|s3;
end
endmodule
生成电路:
功能仿真:
四位全加器
logisim实现
verilog实现
代码:
module fourFulladder (
num1,
num2,
cin,
cout,
sum
);
input [3:0] num1;
input [3:0] num2;
input cin;
output cout;
output [3:0] sum;
reg cout;
reg [3:0] sum;
reg add;
always @(num1 or num2 or cin)
begin
// 第一位
sum[0] = (num1[0] ^ num2[0]) ^ cin;
cout = (num1[0] & num2[0]) | (num2[0] & cin) | (num1[0] & cin);
add = cout;
// 第二位
sum[1] = (num1[1] ^ num2[1]) ^ add;
cout = (num1[1] & num2[1]) | (num2[1] & add) | (num1[1] & add);
add = cout;
// 第三位
sum[2] = (num1[2] ^ num2[2]) ^ add;
cout = (num1[2] & num2[2]) | (num2[2] & add) | (num1[2] & add);
add = cout;
// 第四位
sum[3] = (num1[3] ^ num2[3]) ^ add;
cout = (num1[3] & num2[3]) | (num2[3] & add) | (num1[3] & add);
add = cout;
end
endmodule
仿真实现: