语言设计思想和可综合特性、组合电路设计
Verilog语言设计思想和可综合特性
8bit计数器:
module counter(count,clk,reset)
output count;
input clk,reset;
reg[7:0] count;
reg out;
always @(posedge clk)
if (!reset) count<=0;
else if(count==8'b11111111) count<=0
else count<=count+1; //不能用循环语句
endmodule
4选1数据选择器:
真值表形式:
module MUX(sel,data,out)
input[3:0] data;
input[1:0] sel;
reg out;
always @(data or sel)
case(sel)
2'b00:out<=data[0]
2'b01:out<=data[1]
2'b10:out<=data[2]
2'b11:out<=data[3]
endcase
endmodule
对真值表进行化简后的逻辑表达式形式:
module MUX(out,data,sel)
output out;
input[3:0] data;
input[1:0] sel;
wire w1,w2,w3,w4;
assign w1=(~sel[1])&(~sel[0])&data[0];//00时选data[0]
assign w2=(~sel[1])&(sel[0])&data[1];//01时选data[1]
assign w3=(sel[1])&(~sel[0])&data[2];//10时选data[2]
assign w4=(sel[1])&(sel[0])&data[3];//11时选data[3]
endmodule
结构型描述方式:
Verilog HDL组合电路设计
组合电路:电路中任意时刻的稳态输出仅仅取决于该时刻的输入,而与电路原来的状态无关。
例:设计3裁判表决电路,当两个或两个以上裁判同意时,判决器输出1,否则输出0。
A | B | C | OUT |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
抽象型描述方式:
module biaojue(out,in1,in2,in3)
input in1,in2,in3;
output out;
wire[1:0] sum;
reg out;
assign sum=in1+in2+in3;
always @(sum)
if (sum>=1)
out=1;
else
out=0;
endmodule
例:
2输入1bit信号全加器(考虑来自低位的进位):
A | B | C_IN | SUM | C_OUT |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
利用行为描述实现:
module fulladder(SUM,C_OUT,A,B,C_IN);
input A,B,C_CIN
output SUM,C_OUT;
assign SUM=(A^B)^C_IN;
assign{C_OUT,SUM}=A+B+C_IN;
endmodule
2输入8bit全加器:
module eight_bit_fulladder(SUM,C_OUT,A,B,C_IN)
output[7:0] SUM
output C_OUT;
input[7:0] A,B;
input C_IN;
assign{C_OUT,SUM}=A+B+C_IN;
endmodule
超前进位加法器:每级进位由附加的组合电路产生,高位的运算不需等待低位运算完成,因此可以提高运算速度。
对于Nbit全加器,其进位信号是:C_OUT=CN
输出的加法结果是:SUM_OUTn-1=Pn-1
⨁
\bigoplus
⨁Cn-1 n
∈
\in
∈[N,1]
例:数据比较器
4为数值比较器:由高位到低位逐位比较,只有在高位相等时,才进行低位比较。
module four_bits_comp1(F,A,B,C);
parameter comp_width=4;
output[2:0] F;
input[2:0] C;
input[comp_width-1:0] A;
input[comp_width-1:0] B;
reg[2:0] F;
always@(A or B or C)
if (A>B)
F=3'b100;
else if(A<B)
F=3'b001;
else
F=C;
endmodule
例:数据选择器
8选1数选: