Verilog实现74LS194芯片设计程序

嵌入式设计应用

132人已加入

描述

  Verilog介绍

  Verilog一般指Verilog HDL。Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。

  Verilog特点

  1.能够在不同的抽象层次上,如系统级、行为级、RTL(Register Transfer Level)级、 门级和开关级,对设计系统进行精确而简练的描述;

  2.能够在每个抽象层次的描述上对设计进行仿真验证,及时发现可能存在的设计错误, 缩短设计周期,并保证整个设计过程的正确性;

  3.由于代码描述与具体工艺实现无关,便于设计标准化,提高设计的可重用性。如果 有C语言的编程经验,只需很短的时间内就能学会和掌握Verilog HDL,因此,Verilog HDL可以作为学习HDL设计方法的入门和基础。

  Verilog用途

  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.

  Verilog实现74LS194芯片

  [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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分