赞
踩
逻辑真值表如下:
实现 3-8 译码器功能的 Verilog 代码形式也有很多种,我们这里主要列举两种最容易理解的方法:
1)if-else方法
- 1 module decoder3_8
- 2 (
- 3 input wire in1 , //输入信号 in1
- 4 input wire in2 , //输入信号 in2
- 5 input wire in3 , //输入信号 in3
- 6
- 7 output reg [7:0] out //输出信号 out
- 8 );
- 9
- 10 //out:根据 3 个输入信号选择输出对应的 8bit out 信号
- 11 always@(*)
- 12 //使用"{}"位拼接符将 3 个 1bit 数据按照顺序拼成一个 3bit 数据
- 13 if({in1, in2, in3} == 3'b000)
- 14 out = 8'b0000_0001;
- 15 else if({in1, in2, in3} == 3'b001)
- 16 out = 8'b0000_0010;
- 17 else if({in1, in2, in3} == 3'b010)
- 18 out = 8'b0000_0100;
- 19 else if({in1, in2, in3} == 3'b011)
- 20 out = 8'b0000_1000;
- 21 else if({in1, in2, in3} == 3'b100)
- 22 out = 8'b0001_0000;
- 23 else if({in1, in2, in3} == 3'b101)
- 24 out = 8'b0010_0000;
- 25 else if({in1, in2, in3} == 3'b110)
- 26 out = 8'b0100_0000;
- 27 else if({in1, in2, in3} == 3'b111)
- 28 out = 8'b1000_0000;
- 29 else
- 30 //最后一个 else 对应的 if 中的条件只有一种情况,还可能产生以上另外的 7 种情况
- 31 //如果不加这个 else 综合器会把不符合该 if 中条件的上面另外 7 种情况都考虑进去
- 32 //会产生大量的冗余逻辑并产生 latch(锁存器),所以在组合逻辑中最后一个 if
- 33 //后一定要加上 else,并任意指定一种确定的输出情况
- 34 out = 8'b0000_0001;
2)case方法
- 1 module decoder3_8
- 2 (
- 3 input wire in1 , //输入信号 in1
- 4 input wire in2 , //输入信号 in2
- 5 input wire in3 , //输入信号 in3
- 6
- 7 output reg [7:0] out //输出信号 out
- 8 );
- 9
- 10 //out:根据输入的 3bit in 信号选择输出对应的 8bit out 信号
- 11 always@(*)
- 12 case({in1, in2, in3})
- 13 3'b000 : out = 8'b0000_0001; //输入与输出的 8 种译码对应关系
- 14 3'b001 : out = 8'b0000_0010;
- 15 3'b010 : out = 8'b0000_0100;
- 16 3'b011 : out = 8'b0000_1000;
- 17 3'b100 : out = 8'b0001_0000;
- 18 3'b101 : out = 8'b0010_0000;
- 19 3'b110 : out = 8'b0100_0000;
- 20 3'b111 : out = 8'b1000_0000;
- 21 //因为 case 中列举了 in 所有可能输入的 8 种情况,且每种情况都有对应确定的输出
- 22 //所以此处 default 可以省略,但是为了以后因不能够完全列举而产生 latch
- 23 //所以我们默认一定要加上 default,并任意指定一种确定的输出情况
- 24 default: out = 8'b0000_0001;
- 25 endcase
- 26
- 27 endmodule
RTL视图:
1)1位全加器
Verilog:门级
- module A1bits( //Verilog-2001语法
- input A,B,Cin,
- output Sum,Cout
- );
- wire t1,t2,t3;//电路功能描述
- assign Sum=A^B^Cin;//表达式中的"^"为异或运算符
- assign t1=A&B,//表达式中的"&"为与运算符
- t2=A&Cin,
- t3=B^Cin;
- assign Cout=t1|t2|t3;//表达式中的"|"为或运算符
- endmodule
RTL电路:
Logsim
Verilog:行为级
- module top_module ();
- reg clk=0;
- always #5 clk = ~clk; // Create clock with period=10
- initial `probe_start; // Start the timing diagram
-
- `probe(clk); // Probe signal "clk"
-
- // A testbench
- reg ain,bin,cin;
- initial begin
- ain=0;
- bin=0;
- cin=0;
- #5 ain=1;
- bin=1;
- #5 ain=0;
- bin=0;
- #5 ain=1;
- cin=1;
- #5 bin=1;
- #60 $finish; // Quit the simulation
- end
- full_add add(.ain(ain),.bin(bin),.cin(cin)); // Sub-modules work too.
- endmodule
- module full_add(input ain,bin,cin,output sum,count);
- reg sum,count;
- always @(ain or bin or cin)begin
- sum=ain+cin+bin;//ain^bin^cin
- count=(ain&bin)|(ain&cin)|(bin&cin);
- end
- `probe(sum);
- `probe(ain);
- `probe(bin);
- `probe(cin);
- `probe(count);
- endmodule
2)4位全加器
Verilog
- module A4bit(
- input x,Y,cin
- output f,cout)
- ;
- assign f=x^y^cin;
- assign cout=(x&y)1(x&cin)l(y&cin);
- endmodule
- module CRA(
- input [3:0]x,y
- input cin,
- output [3:0]f,
- output cout;
- )
- wire[4:0]c;
- assign c[0]=cin;
- A4bit fa0(x[0],y[0],c[0],f[0],c[1]);
- A4bit fal(x[1],y[1],c[0],f[1],c[2]);
- A4bit fa2(x[2],y[2],c[0],f[2],c[3]);
- A4bit fa3(x[3],y[3],c[0],f[3],c[4]);
- assign cout=c[4];
- endmodule
RTL电路:
Logsim
Verilog:行为级
- module top_module ();
- reg clk=0;
- always #5 clk = ~clk; // Create clock with period=10
- initial `probe_start; // Start the timing diagram
-
- `probe(clk); // Probe signal "clk"
-
- // A testbench
- reg [3:0] ain,bin;
- reg cin;
- initial begin
- ain=0;
- bin=0;
- cin=0;
- #5 ain=2;
- bin=3;
- #5 ain=4;
- bin=2;
- #5 ain=14;
- cin=1;
- #5 bin=1;
- #60 $finish; // Quit the simulation
- end
- four_add add(.ain(ain),.bin(bin),.cin(cin)); // Sub-modules work too.
- endmodule
-
- module four_add(ain,bin,cin,sum,count);
- input [3:0] ain,bin,cin;
- output reg count;
- output reg [3:0] sum;
-
- always @(*) begin
- {count,sum}=ain+bin+cin;
- end
- `probe(sum);
- `probe(ain);
- `probe(bin);
- `probe(cin);
- `probe(count);
- endmodule
3)8位全加器
采用一位全加器模板实现8位全加器
- module A8bit(
- input x,Y,cin
- output f,cout)
- ;
- assign f=x^y^cin;
- assign cout=(x&y)1(x&cin)l(y&cin);
- endmodule
- module CRA(
- input [7:0]x,y
- input cin,
- output [7:0]f,
- output cout;
- )
- wire[8:0]c;
- assign c[0]=cin;
- A4bit fa0(x[0],y[0],c[0],f[0],c[1]);
- A4bit fal(x[1],y[1],c[0],f[1],c[2]);
- A4bit fa2(x[2],y[2],c[0],f[2],c[3]);
- A4bit fa3(x[3],y[3],c[0],f[3],c[4]);
- A4bit fa4(x[4],y[4],c[0],f[4],c[5]);
- A4bit fa5(x[5],y[5],c[0],f[5],c[6]);
- A4bit fa6(x[6],y[6],c[0],f[6],c[7]);
- A4bit fa7(x[7],y[7],c[0],f[7],c[8]);
- assign cout=c[8];
- endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。