第十三章 例题
[例1] 宇宙飞船控制器的状态机
module statemachine ( launch_shuttle, land_shuttle, start_countdown, start_trip_meter,
clk, all_systems_go, just_launched, is_landed, cnt, abort_mission);
output launch_shuttle, land_shuttle, start_countdown, start_trip_meter;
input clk, just_launched, is_landed, abort_mission, all_systems_go;
input [3:0] cnt;
reg launch_shuttle, land_shuttle, start_countdown, start_trip_meter;
//设置独热码状态的参数
parameter HOLD=5'b00001, SEQUENCE=5'b00010, LAUNCH=5'b00100;
parameter ON_MISSION=5'b01000, LAND=5'b10000;
reg [4:0] state;
always @(negedge clk or posedge abort_mission)
begin
//检查异步reset的值,即abort_mission的值
if(abort_mission)
{launch_shuttle, land_shuttle, start_trip_meter, start_countdown}<= 4'b0000;
state<=LAND;
else
begin
/* 主状态机,状态变量state */
case ( state )
HOLD: if (all_systems_go)
begin
state <= SEQUENCE;
start_countdown <= 1;
end
else
state <= HOLD;
SEQUENCE: if (cnt = = 0 )
state <= LAUNCH;
else
state <= SEQUENCE;
LAUNCH:
begin
state <= ON_MISSION;
launch_shuttle <= 1;
end
ON_MISSION:
//取消使命前,一直留在使命状态
if (just_launched)
start_trip_meter <= 1;
else
state <= ON_MISSION;
LAND:
if (is_landed)
state <= HOLD;
else
begin
land_shuttle <= 1;
state <= LAND;
end
default:
state = 5'bxxxxx;
endcase
end
end
//end of always
endmodule
[例1] 八位带进位端的加法器的
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
实例(利用简单的算法描述)
module adder_8(cout,sum,a,b,cin);
output cout;
output [7:0] sum;
input cin;
input[7:0] a,b;
assign {cout,sum}=a+b+cin;
endmodule
[例2]指令译码电路的设计实例
(利用电平敏感的always块来设计组合逻辑)
//操作码的宏定义
`define plus
3'd0
`define minus
3'd1
`define band
3'd2
`define bor
3'd3
`define unegate 3'd4
module alu (out,opcode,a,b);
output [7:0] out;
input [2:0] opcode;
input [7:0] a,b;
reg [7:0] out;
always @(opcode or a or b)
//用电平敏感的always块描述组合逻辑
begin
case(opcode)
//算术运算
`plus: out=a+b;
`minus: out=a-b;
//位运算
`band: out=a&b;
`bor: out=a|b;
//单目运算
`unegate: out=~a;
default: out=8'hx;
endcase
end
endmodule
[例3].利用task和电平敏感的always块设计比较后重组信号的组合逻辑.
module sort4(ra,rb,rc,rd,a,b,c,d);
parameter t=3;
output [t:0] ra, rb, rc, rd;
input [t:0] a, b, c, d;
reg [t:0] ra, rb, rc, rd;
always @(a or b or c or d)
//用电平敏感的always块描述组合逻辑
begin : local //此处begin - end块必须有一模块名因为块中定义了局部变量
reg [t:0] va, vb, vc, vd;
{va,vb,vc,vd}={a,b,c,d};
sort2(va,vc);
sort2(vb,vd);
sort2(va,vb);
sort2(vc,vd);
sort2(vb,vc);
{ra,rb,rc,rd}={va,vb,vc,vd};
end
task sort2;
inout [t:0] x, y;
reg [t:0] tmp;
if( x > y )
begin
tmp = x;
x = y;
y = tmp;
end
endtask
endmodule
[例4]. 比较器的设计实例(利用赋值语句设计组合逻辑)
module compare(equal,a,b);
parameter size=1;
output equal;
input [size-1:0] a, b;
assign equal =(a==b)? 1 : 0;
endmodule
[例5]. 3-8译码器设计实例(利用赋值语句设计组合逻辑)
module decoder(out,in);
output [7:0] out;
input [2:0] in;
assign out = 1'b1<
设计方案
关于薪酬设计方案通用技术作品设计方案停车场设计方案多媒体教室设计方案农贸市场设计方案
之一:
module encoder1(none_on,out,in);
output none_on;
output [2:0] out;
input [7:0] in;
reg [2:0] out;
reg none_on;
always @(in)
begin: local //此处begin - end块必须有一模块名因为块中定义了局部变量
integer i;
out = 0;
none_on = 1;
/*returns the value of the highest bit
number turned on*/
for( i=0; i<8; i=i+1 )
begin
if( in[i] )
begin
out = i;
none_on = 0;
end
end
end
endmodule
// 编码器设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
之二:
module encoder2 ( none_on, out2, out1, out0, h, g, f,
e, d, c, b, a);
input h, g, f, e, d, c, b, a;
output none_on, out2, out1, out0;
wire [3:0] outvec;
assign outvec= h? 4'b0111 : g? 4'b0110 : f? 4'b0101:
e? 4'b0100 : d? 4'b0011 :c? 4'b0010 : b? 4'b0001:
a? 4'b0000 : 4'b1000;
assign none_on = outvec[3];
assign out2 = outvec[2];
assign out1 = outvec[1];
assign out0 = outvec[0];
endmodule
// 编码器设计方案之三:
module encoder3 (none_on, out2, out1, out0, h, g,
f, e, d, c, b, a);
input h, g, f, e, d, c, b, a;
output out2, out1, out0;
output none_on;
reg [3:0] outvec;
assign {none_on,out2,out1,out0} = outvec;
always @( a or b or c or d or e or f or g or h)
begin
if(h)
outvec = 4'b0111;
else if(g)
outvec = 4'b0110;
else if(f)
outvec = 4'b0101;
else if(e)
outvec = 4'b0100;
else if(d)
outvec = 4'b0011;
else if(c)
outvec = 4'b0010;
else if(b)
outvec = 4'b0001;
else if(a)
outvec = 4'b0000;
else
outvec = 4'b1000;
end
endmodule
[例7]. 多路器的设计实例。
使用连续赋值、case语句或if-else语句可以生成多路器电路,如果条件语句(case或if-else)中分支条件是互斥的话,综合器能自动地生成并行的多路器。
//多路器设计方案之一:
modul emux1(out, a, b, sel);
output out;
input a, b, sel;
assign out = sel? a : b;
endmodule
//多路器设计方案之二:
module mux2( out, a, b, sel);
output out;
input a, b, sel;
reg out;
//用电平触发的always块来设计多路器的组合逻辑
always @( a or b or sel )
begin
/*检查输入信号sel的值,如为1,输出out为a,如为0,
输出out为b.*/
case( sel )
1'b1: out = a;
1'b0: out = b;
default: out = 'bx;
endcase
end
endmodule
//多路器设计方案之三:
module mux3( out, a, b, sel);
output out;
input a, b, sel;
reg out;
always @( a or b or sel )
begin
if( sel )
out = a;
else
out = b;
end
endmodule
[例8]. 奇偶校验位生成器设计实例
module parity( even_numbits,odd_numbits,input_bus);
output even_numbits, odd_numbits;
input [7:0] input_bus;
assign odd_numbits = ^input_bus;
assign even_numbits = ~odd_numbits;
endmodule
[例9]. 三态输出驱动器设计实例
(用连续赋值语句建立三态门模型)
三态输出驱动器设计方案之一:
module trist1( out, in, enable);
output out;
input in, enable;
assign out = enable? in: 'bz;
endmodule
三态输出驱动器设计方案之二:
module trist2( out, in, enable );
output out;
input in, enable;
//bufif1是 一个 Verilog门级原语(primitive)
bufif1 mybuf1(out, in, enable);
endmodule
[例10]. 三态双向驱动器设计实例
module bidir(tri_inout, out, in, en, b);
inout tri_inout;
output out;
input in, en, b;
assign tri_inout = en? In : 'bz;
assign out = tri_inout ^ b;
endmodule
13.5.2. 时序逻辑电路设计实例
[例1]触发器设计实例
module dff( q, data, clk);
output q;
input data, clk;
reg q;
always @( posedge clk )
begin
q <= data;
end
endmodule
[例2]. 电平敏感型锁存器设计实例之一
module latch1( q, data, clk);
output q;
input data, clk;
assign q = clk? data : q;
endmodule
[例3]. 带置位和复位端的电平敏感型锁存器设计实例之二
module latch2( q, data, clk, set, reset);
output q;
input data, clk, set, reset;
assign q= reset? 0 : ( set? 1:(clk? data : q ) );
endmodule
[例4]. 电平敏感型锁存器设计实例之三
module latch3( q, data, clk);
output q;
input data, clk;
reg q;
always @(clk or data)
begin
if(clk)
q=data;
end
endmodule
注意:有的综合器会产生一警告信息 告诉你产生了一个电平敏感型锁存器。因为我们设计的就是一个电平敏感型锁存器,就不用管这个警告信息。
[例5]. 移位寄存器设计实例
module shifter( din, clk, clr, dout);
input din, clk, clr;
output [7:0] dout;
reg [7:0] dout;
always @(posedge clk)
begin
if(clr)
//清零
dout <= 8'b0;
else
begin
dout <= dout<<1; //左移一位
dout[0] <= din; //把输入信号放入寄存器的最低位
end
end
endmodule
[例6]. 八位计数器设计实例之一
module counter1( out, cout, data, load, cin, clk);
output [7:0] out;
output cout;
input [7:0] data;
input load, cin, clk;
reg [7:0] out;
always @(posedge clk)
begin
if( load )
out <= data;
else
out <= out + cin;
end
assign cout=( & out) & cin;
//只有当out[7:0]的所有各位都为1
//并且进位cin也为1时才能产生进位cout
endmodule
[例7]. 八位计数器设计实例之二
module counter2( out, cout, data, load, cin, clk);
output [7:0] out;
output cout;
input [7:0] data;
input load, cin, clk;
reg [7:0] out;
reg cout;
reg [7:0] preout;
//创建8位寄存器
always @(posedge clk)
begin
out <= preout;
end
/****计算计数器和进位的下一个状态,注意:为提高性能不希望加载影响进位****/
always @( out or data or load or cin )
begin
{cout, preout} = out + cin;
if(load)
preout = data;
end
endmodule
带异步高电平有效的置/复位端的D触发器实例
module dff1( q, qb, d, clk, set, reset );
input d, clk, set, reset;
output q, qb;
//声明q和qb为reg类型,因为它需要在always块内赋值
reg q, qb;
always @( posedge clk or posedge set or posedge reset )
begin
if(reset)
begin
q <= 0;
qb <= 1;
end
else
if (set)
begin
q <= 1;
qb <= 0;
end
else
begin
q <= d;
qb <= ~d;
end
end
endmodule
//同步的具有高电平有效的置位与复位端的always块样板
always @(posedge clk)
begin
if(reset)
begin
/*置输出为0*/
end
else
if(set)
begin
/*置输出为1*/
end
else
begin
/*与时钟同步的逻辑*/
end
end
4) 同步的具有高电平有效的置位/复位端的D触发器
module dff2( q, qb, d, clk, set, reset);
input d, clk, set, reset;
output q, qb;
reg q, qb;
always @(posedge clk)
begin
if(reset)
begin
q<=0;
qb<=1;
end
else
if(set)
begin
q<=1;
qb<=0;
end
else
begin
q<=d;
qb<=~d;
end
end
endmodule
PAGE
9