嵌入式设计应用
Verilog一般指Verilog HDL。Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
1.能够在不同的抽象层次上,如系统级、行为级、RTL(Register Transfer Level)级、 门级和开关级,对设计系统进行精确而简练的描述;
2.能够在每个抽象层次的描述上对设计进行仿真验证,及时发现可能存在的设计错误, 缩短设计周期,并保证整个设计过程的正确性;
3.由于代码描述与具体工艺实现无关,便于设计标准化,提高设计的可重用性。如果 有C语言的编程经验,只需很短的时间内就能学会和掌握Verilog HDL,因此,Verilog HDL可以作为学习HDL设计方法的入门和基础。
Verilog HDL就是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,它是由GDA(Gateway Design Automation)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年Moorby推出它的第三个商用仿真器Verilog-XL,获得了巨大的成功,从而使得Verilog HDL迅速得到推广应用。1989年CADENCE公司收购了GDA公司,使得VerilogHDL成为了该公司的独家专利。1990年CADENCE公司公开发表了Verilog HDL,并成立LVI组织以促进Verilog HDL成为IEEE标准,即IEEE Standard 1364-1995.
[plain] view plain copymodule reg_74LS194 (
input wire CR_n,
input wire CP,
input wire S0,S1,
input wire Dsl,Dsr,
input wire D0,D1,D2,D3,
output wire Q0,Q1,Q2,Q3
);
reg [0:3] q_reg=4‘b0000;
wire [1:0] s_reg;
assign s_reg={S1,S0};
always @(posedge CP or posedge CR_n) begin
if (!CR_n) begin
q_reg《=4’b0000;
end else begin
case (s_reg)
2‘b00 :q_reg《=q_reg;
2’b01 :q_reg《={Dsr,q_reg[0:2]};
2‘b10 :q_reg《={q_reg[1:3],Dsl};
2’b11 :q_reg《={D0,D1,D2,D3};
default:q_reg《=4‘b0000;
endcase
end
end
assign Q0=q_reg[0];
assign Q1=q_reg[1];
assign Q2=q_reg[2];
assign Q3=q_reg[3];
endmodule
[plain] view plain copymodule reg_74LS194_tb ();
reg clk;
wire CR_n;
reg[1:0] S;
reg Dsl,Dsr;
wire[3:0] D;
wire[3:0] Q;
wire [4:0] duty=2;
wire [4:0] period=7;
wire [4:0] duty1=3;
wire [4:0] period1=4;
reg [4:0] count=0;
reg [4:0] count1=0;
reg_74LS194 ut(.CR_n(CR_n),
.CP(clk),
.S0(S[0]),
.S1(S[1]),
.Dsl(Dsl),
.Dsr(Dsr),
.D0(D[0]),
.D1(D[1]),
.D2(D[2]),
.D3(D[3]),
.Q0(Q[0]),
.Q1(Q[1]),
.Q2(Q[2]),
.Q3(Q[3])
);
always @(posedge clk) begin
if (count==period-1) begin
count《=0;
end else begin
count《=count+1;
end
end
always @(posedge clk) begin
if (count《duty) begin
Dsl《=1’b0;
Dsr《=1‘b1;
end else begin
Dsl《=1’b1;
Dsr《=1‘b0;
end
end
always @(posedge clk) begin
if (count1==period1-1) begin
count1《=0;
end else begin
count1《=count1+1;
end
end
always @(posedge clk) begin
if (count1《duty1) begin
S[0]《=1’b0;
S[1]《=1‘b1;
end else begin
S[1]《=1’b0;
S[0]《=1‘b1;
end
end
initial begin
clk=1’b0;
forever #50 clk=~clk;
end
assign D=4‘b1111;
initial begin
#2000 $stop;
end
endmodule
全部0条评论
快来发表一下你的评论吧 !