Verilog语言描述常见电路结构范例
- 格式:doc
- 大小:46.50 KB
- 文档页数:7
systemverilog的例子SystemVerilog的例子SystemVerilog是一种硬件描述语言(HDL),用于描述数字系统和硬件电路。
下面是一些SystemVerilog的例子,让我们逐个详细讲解。
1. 信号的声明与使用SystemVerilog中,我们可以使用wire或reg关键字声明信号。
下面是一个例子:module example_module;wire a, b, c;// 逻辑运算assign c = a & b;// 分配初始值reg d = 1'b1;// always块,条件控制always @(posedge clk)d <= a | b;endmodule在这个例子中,我们声明了3个信号a,b和c,分别用于存储输入信号和输出信号。
使用assign关键字可以将逻辑运算结果赋值给c。
我们还声明一个reg类型的信号d,并在声明时给它一个初始值。
使用always块可以在时钟上升沿触发时对d进行赋值操作。
2. 模块的实例化与连接在SystemVerilog中,可以通过实例化模块来构建更复杂的电路。
下面是一个例子:module adder #(parameter WIDTH = 8) (input [WIDTH-1:0] a,input [WIDTH-1:0] b,output [WIDTH-1:0] sum);assign sum = a + b;endmodulemodule top_module;wire [7:0] a, b;wire [7:0] sum;// 模块实例化与连接adder #(.WIDTH(8)) adder_inst (.a(a),.b(b),.sum(sum));endmodule在这个例子中,我们首先定义了一个adder模块,可实现两个宽度为WIDTH的输入信号相加并输出结果。
然后,在top_module中,我们声明了3个信号a、b和sum,并实例化了adder模块。
文章标题:深入探讨Verilog中的for循环电路设计1. 引言Verilog作为一种硬件描述语言,广泛应用于数字电路设计和硬件描述。
其中,for循环是Verilog语言中常用的一种结构,可以用于迭代、控制和优化电路设计。
本文将深入探讨Verilog中for循环的电路设计,探讨其原理、应用和优化方法。
2. Verilog中的for循环在Verilog中,for循环是一种用于重复执行一定次数的语句块的控制结构。
它可以帮助设计者更高效地实现电路功能、减少代码量和提高设计灵活性。
在数字电路设计中,for循环可以应用于生成多路复用器、计数器、同步电路等模块,极大地方便了电路设计者。
3. for循环电路设计原理在Verilog中,for循环可以通过控制参数、计数器和条件判断来实现电路设计。
在生成多路复用器时,可以利用for循环依次控制各路输出的选择信号,从而实现多路复用功能。
通过对for循环的内部原理和电路结构进行深入理解,设计者可以更好地优化电路设计,提高电路的速度、面积和功耗等性能指标。
4. 应用实例以计数器为例,可以利用for循环来实现计数器的功能。
通过循环控制计数器的计数次数和输出信号,可以快速、灵活地实现各种计数器类型,如同步计数器、异步计数器等。
for循环还可以用于实现状态机、逻辑电路等模块,提高了Verilog在数字电路设计中的应用范围和灵活性。
5. 优化方法在实际电路设计中,for循环的设计和应用需要注意一些优化方法。
可以适当选择循环变量的范围和步进值,避免过多的嵌套循环和复杂的逻辑设计,以提高电路的性能和可维护性。
合理使用for循环可以减少冗余代码,提高设计的模块化和可扩展性。
6. 总结与展望Verilog中的for循环在数字电路设计中具有重要的作用,可以帮助设计者实现高效、灵活的电路设计。
通过深入理解for循环的原理和应用,设计者可以更好地优化电路设计,提高设计效率和质量。
未来,随着数字电路设计的需求不断增加,for循环在Verilog中的应用将会更加广泛,也需要不断进行优化和改进。
Ve r ilog HD L电路设计指导书V er ilog—X L资源组Verilog HDL电路设计指导书(仅供内部使用)文档作者verilog group日期I I贞目经理日期I I矶究部日期I I总体组日期I I文档管理员日期I I深圳市华为技术有限公司版权所有不得复制修订记录日期修订版本描述作者2000/04/04 1.00初稿完成Ve r ilog—g r oup目录1典型电路的设计 (4)1.1全加器的设计 (4)1.2数据通路: (4)1.2.1四选一的多路选择器 (4)1.2.2译码器 (5)1.2.3优先编码器 (6)1.3计数器 (7)1.4算术操作 (7)1.5逻辑操作 (8)1.6移位操作 (9)1.7时序器件 (9)1.7.1上升沿触发的触发器 (10)1.7.2带异步复位上升沿触发的触发器 (10)1.7.3带异步置位上升沿触发的触发器 (11)1.7.4带异步复位和置位上升沿触发的触发器 (11)1.7.5带同步复位上升沿触发的触发器 (12)1.7.6带同步置位上升沿触发的触发器 (12)1.7.7带异步复位和时钟使能上升沿触发的触发器 (13)1.8ALU (14)1.9有限状态机FSM 的设计 (15)1.9.1概述 (16)1.9.2One-hot 编码 (19)1.9.3Binary 编码 (22)2常用电路设计 (26)2.1CRC校验码产生器的设计 (26)2.1.1概述 (26)2.1.2CRC校验码产生器的分析与硬件实现 (26)2.1.3并行CRC-16校验码产生器的Verilog HDL编码 (27)2.1.4串行CRC-16校验码产生器的Verilog HDL编码 (29)2.1随机数产生电路设计 (31)2.1.1概述 (31)2.1.1伪随机序列发生器的硬件实现 (31)2.1.28位伪随机序列发生器的Verilog HDL编码 (31)2.2双端口RAM仿真模型 (33)2.3同步FIFO的设计 (34)2.3.1功能描述 (34)2.3.2设计代码 (34)2.4异步FIFO设计 (38)2.4.1概述 (38)2.4.2设计代码 (38)关键词摘要缩略语清单参考资料清单名称作者编号发布日期查阅地点或渠道1 典型电路的设计在本章节中主要讲述触发器锁存器多路选择器解码器编码器饱和/非饱和计数器FSM等常用基本电路的设计如果你是初学者我们建议你从典型电路学起如果你已经非常熟悉电路设计我们建议你从第2章看起1.1 全加器的设计/*********************************************************************\Filename Author Description :::fulladd.vVerilog—gruopExample of a one-bit full add.Revision:2000/02/29Company:Verilog—group\*********************************************************************/ module FULLADDR(Cout, Sum, Ain, Bin, Cin);input Ain, Bin, Cin;output Sum, Cout;wire Sum;wire Cout;assign Sum = Ain /\ Bin /\ Cin;assign Cout = (Ain & Bin) I (Bin & Cin) I (Ain & Cin);endmodule1.2 数据通路:1.2.1四选一的多路选择器/*********************************************************************\Filename Author Description :::mux.vVerilog—gruopExample of a mux4-1.Revision:2000/02/29Company:Verilog—group\*********************************************************************/ module MUX(C,D,E,F,S,Mux—out);input C,D,E,F ; //inputinput[1:0]S;//select controloutput Mux—out;//resultreg Mux—out;//muxalways@(C or D or E or F or S)begincase (S)2'b00 :Mux—out = C ;2'b01 :Mux—out = D ;2'b10 :Mux—out = E ;default :Mux—out = F ;endcaseendendmodule1.2.2译码器/*********************************************************************\Filename Author Description :::decode.vVerilog—gruopExample of a 3-8 decoder.Revision:2000/02/29Company:Verilog—group\*********************************************************************/ module DECODE(Ain,En,Yout);input inputEn ;[2:0]Ain;//enable//input codeoutput[7:0]Yout; reg[7:0]Yout;always@(En or Ain)beginend endmodule if(!En)elseYout = 8'b0 ;case (Ain)3'b000 :Yout = 8'b0000—0001 ;3'b001 :Yout = 8'b0000—0010 ;3'b010 :Yout = 8'b0000—0100 ;3'b011 :Yout = 8'b0000—1000 ;3'b100 :Yout = 8'b0001—0000 ;3'b101 :Yout = 8'b0010—0000 ;3'b110 :Yout = 8'b0100—0000 ;3'b111 :Yout = 8'b1000—0000 ;default :Yout = 8'b0000—0000 ;endcase1.2.3优先编码器/********************************************************************\Filename Author Description :::Prio-encoder.vVerilog—gruopExample of a Priority Encoder.Revision:2000/02/29Company:Verilog—group\*********************************************************************/ module PRIO_ENCODER (Cin, Din,Ein, Fin, Sin, Pout);input Cin, Din, Ein, Fin; //input signalsinput [1:0] outputreg Sin;Pout;Pout;//input select control//output select result//Pout assignmentalways @(Sin or Cin or Din or Ein or Fin) beginif (Sin == 2'b 00)Pout = Cin;else if (Sin == 2'b01)Pout = Din;else if (Sin == 2'b10 ) Pout = Ein;end elsePout = Fin;endmodule // module prio_encode1.3 计数器/********************************************************************\Filename Author Description :::count—en.vVerilog—gruopExample of a counter with enable.Revision:2000/02/29Company:Verilog—group\*********************************************************************/ module COUNT—EN(En,Clock,Reset,Out);parameter Width =8 ;parameter U—DLY =1;input Clock , Reset , En ;output[Width-1:0]O ut;reg[Width-1:0]Out;always@(posedge Clock or negedge Reset)if (!Reset)Out <= 8'b0 ;else if (En)Out <= #U—DLY Out + 1 ;endmodule1.4 算术操作/********************************************************************\ Filename:arithmetic.vAuthor:Verilog—gruopDescription:Example of a arithmetic include +, -, *, /.Revision:2000/02/29Company:Verilog—group\*********************************************************************/ module ARITHMETIC (A , B, Q1, Q2 ,Q3, Q4 );input output output output [3:0][4:0][3:0][3:0]A, B ;Q1 ;Q2;Q3 ;//input operator//output sum, with carry bit//output sutract result//output quotionoutput[7:0]Q4 ;//productreg reg reg [4:0][3:0][7:0]Q1 ;Q2 , Q3 ;Q4 ;//arithmetic operatealways@(A or B)beginQ1 = A+B ;Q2 = A-B ;Q3 = A/2 ;Q4 = A*B ;endendmodule1.5 逻辑操作/********************************************************************\Filename Author Description :::relational.vVerilog—gruopExample of a relational operateRevision:2000/02/29Company:Verilog—group\*********************************************************************/ module RELATIONAL(A, B,Q1,Q2,Q3,Q4) ;input[3:0]A,B;//operatoroutput Q1 , Q2 , Q3 , Q4 ; //resultreg Q1 , Q2 , Q3 , Q4 ;//comparealways@(A or B)beginQ1 = A > B ;Q2 = A < B ;Q3 = A>= B ;if (A <= B)Q4 = 1 ;elseendendmoduleQ4 = 0 ;1.6 移位操作/********************************************************************\Filename Author Description :::shifter.vVerilog—gruopExample of a shifterRevision:2000/02/29Company:Verilog—group\*********************************************************************/ module SHIFT (Data ,Q1, Q2) ;input[3:0]Data;output[3:0]Q1,Q2;parameter B = 2 ;reg[3:0]Q1,Q2;always@(Data)beginend Q1 = Data << B ; Q2 = Data >> B ;endmodule1.7 时序器件一个时序器件指触发器或锁存器就是一个一位存储器锁存器是电平敏感存储器件触发器是沿触发存储器件触发器也被称为寄存器在程序中体现为对上升沿或下降沿的探测VERILOG中采用如下方法表示posedge Clk) -------------------------------- 上升沿(negedge Clk) ------------------------------ 下降沿下面给出各种不同类型触发器的描述1.7.1上升沿触发的触发器/*********************************************************************\Filename Author Description :::dff.vVerilog—gruopExample of a Rising Edge Flip-Flop.Revision:2000/03/30Company:Verilog—group\*********************************************************************/ module DFF (Data, Clk, Q);input Data, Clk;output Q;reg Q;always @ (posedge Clk)Q <= Data;endmodule1.7.2带异步复位上升沿触发的触发器/*********************************************************************\Filename Author Description :::dff—async—rst.vVerilog—gruopExample of a Rising Edge Flip-Flop with Asynchronous Reset.Revision:2000/03/30Company:Verilog—group\*********************************************************************/ module DFF—ASYNC—RST(Data,Clk,Reset,Q);input Data, Clk, Reset;output Q;parameter U—DLY =1;reg Q;always @ (posedge Clk or negedge Reset)if ( ~Reset)Q <= #U—DLY 1'b0 ;elseendmuduleQ <= #U—DLY Data ;1.7.3带异步置位上升沿触发的触发器/*********************************************************************\Filename Author Description :::dff—async—pre.vVerilog—gruopExample of a Rising Edge Flip-Flop with Asynchronous Preset.Revision:2000/03/30Company:Verilog—group\*********************************************************************/ module DFF—ASYNC—PRE(Data,Clk,Preset,Q);input Data, Clk, Preset;output Q;parameter U—DLY =1;reg Q;always @ (posedge Clk or negedge Preset)if ( ~Preset)Q <= #U—DLY 1'b1 ;elseendmuduleQ <= #U—DLY Data ;1.7.4带异步复位和置位上升沿触发的触发器/*********************************************************************\ Filename:dff—async.vAuthor:Verilog—gruopDescription:Example of a Rising Edge Flip-FlopRevision:with Asynchronous Reset and Preset. 2000/03/30Company:Verilog—group\*********************************************************************/ module DFF—ASYNC(Data,Clk,Reset,Preset,Q);input Data, Clk, Reset, Preset ;output Q;parameter U—DLY = 1;reg Q;always @ (posedge Clk or negedge Reset or posedge Preset)if ( ~Reset)Q <= 1'b0 ;else if (preset )Q <= 1'b1;elseendmuduleQ <= #U—DLY Data ;1.7.5带同步复位上升沿触发的触发器/*********************************************************************\Filename Author Description :::dff—sync—rst.vVerilog—gruopExample of a Rising Edge Flip-Flop with Synchronous Reset.Revision:2000/03/30Company:Verilog—group\*********************************************************************/ module DFF—SYNC—RST(Data,Clk,Reset,Q);input Data, Clk, Reset;output Q;parameter U—DLY = 1;reg Q;always @ (posedge Clk )if ( ~Reset)Q <= #U—DLY 1'b0 ;elseendmuduleQ <= #U—DLY Data ;1.7.6带同步置位上升沿触发的触发器/*********************************************************************\Filename Author Description :::dff—sync—pre.vVerilog—gruopExample of a Rising Edge Flip-Flop with Synchronous Preset.Revision:2000/03/30Company:Verilog—group\*********************************************************************/module DFF—SYNC—PRE(Data,Clk,Preset,Q);input Data, Clk, Preset;output Q;parameter U—DLY = 1;reg Q;always @ (posedge Clk )if ( ~Preset)Q <= #U—DLY 1'b1 ;elseendmuduleQ <= #U—DLY Data ;1.7.7带异步复位和时钟使能上升沿触发的触发器/*********************************************************************\ Filename:dff—ck—en.vAuthor:Verilog—gruopDescription:Example of a Rising Edge Flip-Flop with Asynchronous ResetRevision:and Clock Enable. 2000/03/30Company:Verilog—group\*********************************************************************/ module DFF—CK—EN(Data,Clk,Reset,En,Q);input Data, Clk, Reset, En;output Q;parameter U—DLY = 1;reg Q;always @ (posedge Clk or negedge Reset)if ( ~Reset)Q <= 1'b0 ;else if (En)Q <= #U—DLY Data ;endmudule1.8 ALU/********************************************************************\Filename Author Description :::alu.vVerilog—gruopExample of a 4-bit Carry Look Ahead ALURevision:2000/02/29Company:Verilog—group\*********************************************************************/module ALU(A, B, Cin, Sum, Cout, Operate, Mode);//input signalsinput [3:0] A, B; // two operands of ALUinput Cin; //carry in at the LSBinput [3:0] Operate; //determine f(.) of sum = f(a, b)input Mode; //arithmetic(mode = 1'b1) or logic operation(mode = 1'b0) output [3:0] Sum; //result of ALUoutput Cout; //carry produced by ALU operation// carry generation bits and propogation bits.wire [3:0] G, P;// carry bits;reg [2:0] C;// function for carry generation:function geninput A, B;input [1:0] Oper;begincase(Oper) 2'b00:gen = A;2'b01: gen = A & B;2'b10: gen = A & (~B);2'b11: gen = 1'b0;endcase;endendfunction// function for carry propergation:function propinput A, B;input [1:0] Oper;begincase(Oper)2'b00: prop = 1;2'b01: prop = A I (~B);2'b10: prop = A I B;2'b11: prop = A;endcase;endendfunction// producing carry generation bits;assign G[0] = gen(A[0], B[0], Oper[1:0]);assign G[1] = gen(A[1], B[1], Oper[1:0]);assign G[2] = gen(A[2], B[2], Oper[1:0]);assign G[3] = gen(A[3], B[3], Oper[1:0]);// producing carry propogation bits;assign P[0] = por(A[0], B[0], Oper[3:2]);assign P[1] = por(A[1], B[1], Oper[3:2]);assign P[2] = por(A[2], B[2], Oper[3:2]);assign P[3] = por(A[3], B[3], Oper[3:2]);// producing carry bits with carry-look-ahead;always @(G or P or Cin, Mode)beginif (Mode) beginC[0] = G[0] I P[0] & Cin;C[1] = G[1] I P[1] & G[0] I P[1] & P[0] & Cin;C[2] = G[2] I P[2] & G[1] I P[2] & P[1] & G[0] I P[2] & P[1] & P[0] & Cin;Cout = G[3] I P[3] & G[2] I P[3] & P[2] & G[1] I P[3] & P[2] & P[1] & G[0] I P[3] & P[2] & P[1] & P[0] & Cin;endelse beginC[0] = 1'b0;C[1] = 1'b0;C[2] = 1'b0;Cout = 1'b0;endend// calculate the operation results; assignSum[0] = (~G[0] & P[0]) /\ Cin;assign Sum[1] = (~G[1] & P[1]) /\ C[0];assign Sum[2] = (~G[2] & P[2]) /\ C[1];assign Sum[3] = (~G[3] & P[3]) /\ C[2];endmodule1.9 有限状态机FSM 的设计1.9.1 概述有限状态机 FSM 是一种常 见的电路 由时序电路和组合电路组成 设计有限状态机的第一步是确定采用Moore 状态机还是采用Mealy 状态机Mealy 型 状态的转变不仅和当前状态有关 而且跟各输入信号有关 Moore 型 状态的转变只和当前状态有关 从实现电路功能来讲任何一种都可以实现同样的功能 但他们的输出时序不同 所以 在选择使 用那种状态机时要根据具体情况而定 在此 把他们的主要区别介绍一下1. Moore 状态机 在时钟脉冲的有限个门延时之后 输出达到稳定 输出会在一个完整的时钟周期内保持稳定值 即使在该时钟内输入信号变化了 输出信号也不会变化 输入对输出的影响要到下一个时钟周期才能反映出来 把输入和输出分开 是Moore 状态机的重要特征2. Mealy 状态机 由于输出直接受输入影响 而输入可以在时钟周期的任一时刻变化 这就使得输出状态比Moore 状态机的输出状态提前一个周期到达 输入信号的噪声可能会出现在输出信号上3. 对同一电路 使用Moore 状态机设计可能会比使用Mealy 状态机多出一些状态根据他们的特征和要设计的电路的具体情况 就可以确定使用那种状态机来实现功能 一旦确定状态机 接下来就要构造状态转换图 现在还没有一个成熟的系统化状态图构造算法 所以 对于实现同一功能 可以构造出不同的状态转换图 但一定要遵循结构化设计 在构造电路的状态转换图时 使用互补原则可以帮助我们检查设计过程中是否出现了错误 互补原则是指离开状态图节点的所有支路的条件必须是互补的 同一节点的任何2个或多个支路的条件不能同时为真 同时为真是我们设计不允许的在检查无冗余状态和错误条件后 就可以开始用verilog HDL 来设计电路了图1 状态机电路逻辑图在设计的过程中要注意一下方面 1. full —case spec定义完全状态 即使有的状态可能在电路中不会出现 目的是避免综合出不希望的Latch 因为Latch 可能会带来 a. 额外的延时 b. 异步Timing 问题always @(Curr —st) beginNext_stReset ClockNext_stLogicCurr_stCombi & syncLogicCurr_st LogicCombi LogicDDcase(Curr —st)ST0 : Next —st = ST1; ST1 : Next —st = ST2; ST2 : Next —st = ST0; endcase endCurr_stNext_st图2 没有采用full-casealways @(Curr —st) begincase(Curr —st) //synthesis full —caseST0 : Next —st = ST1; ST1 : Next —st = ST2; ST2 : Next —st = ST0; default : Next —st = ST0; endcase endCurr_stNext_st图3 采用full-case2. parallel —case spec 确保不同时出现多种状态QDDQcase({En3, En2, En1})3'b??1 :Out = In1;3'b?1? :Out = In2;3'b1?? :Out = In3;endcaseEn1In1En2OutIn2En3In3图4 没采用parallel-casecase({En3, En2, En1}) //synthesis parallel—case3'b??1 :Out = In1;3'b?1? :Out = In2;3'b1?? :Out = In3;endcaseEn1In1En2OutIn2En3In3图5 采用parallel-case3.禁止使用casexcasex在综合时认为Z X为Dont cares 会导致前仿真和后仿真不一致如果电路中出现X 一定要分析是否会传递4.推荐在模块划分时把状态机设计分离出来便于使用综合根据对状态机优化5.在条件表达式或附值语句中要注意向量的宽度适配否则前仿真和后仿真不一致RTL级的功能验证很难找出问题所在下图是一个状态机的状态转换图在Verilog HDL中我们可以用如下方法设计该状态机图4 状态转换图1.9.2 One-hot 编码/*********************************************************************\Filename Author Description : : : one —hot —fsm.v Verilog —gruopExample of a one-hot encoded state machine. Revision : 2000/02/29 Company:Verilog —group\*********************************************************************/ module ONE —HOT —FSM (Clock, Reset, A, B, C, D, E,Single, Multi, Contig);input input Clock; Reset; //system Clock//async Reset, active high input A, B, C, D, E; //FSM input signals outputSingle, Multi, Contig;//FSM output signals//define output signals type reg Single; reg Multi; regContig;// Declare the symbolic names for states parameter[6:0]// enum STATE —T YPE one-hotS1 = 7'b0000001, S2= 7'b0000010,Multi = 0 Contig = 1Singal = 0 s3A&B&(!C) Multi = 1Contig = 0 Singal = 0S5S6Multi = 0 Contig = 1 Singal = 1 Singal = 1Singal = 0s2D !D A|Ds4!E Multi = 0Contig = 1 A&B&(!C) Multi = 1Contig = 1 Singal = 0S7 A&(!B)&C Multi = 1 Contig = 0Singal = 0s1Multi = 0 Contig = 0EResetS3 = 7'b0000100,S4 = 7'b0001000,S5 = 7'b0010000,S6 = 7'b0100000,S7 = 7'b1000000; parameter U—DLY = 1;// Declare current state and next state variablesreg[2:0]Cu rr—st;reg[2:0]Nex t—st;//Curr—st assignment,sequential logicalways @ (posedge Clock or posedge Reset) beginif (Reset)Curr—st <= S1;elseCurr—st<=#U—D LY Next—st; end//combinational logicalways @ (Curr—st or A or B or C or D or D or E) begincase(Curr—st)//full—caseS1 :S2 :beginMulti = 1'b0; Contig = 1'b0; Single = 1'b0; if (A & ~B & C) Next—st=S2; else if (A & B & ~C) Next—st=S4; elseNext—st=S1; endS3 :S4 :S5 :S6 :Multi = 1'b1; Contig = 1'b0; Single = 1'b0; if (!D)Next—st = S3; elseNext—st = S4; endbeginMulti = 1'b0; Contig = 1'b1; Single = 1'b0; if (A I D)Next—st=S4; elseNext—st=S3; endbeginMulti = 1'b1; Contig = 1'b1; Single = 1'b0; if (A & B & ~C) Next—st = S5; elseNext—st=S4; endbeginMulti = 1'b1; Contig = 1'b0; Single = 1'b0; Next—st=S6; endendS7 :endcaseMulti = 1'b0;Contig = 1'b1;Single = 1'b1;if (!E)Next—st=S7;elseNext—st=S6;endbeginMulti = 1'b0;Contig = 1'b1;Single = 1'b0;if (E)Next—st=S1;elseNext—st=S7;endendmodule1.9.3Binary 编码/*********************************************************************\ Filename:binary—fsm.vDescription :Example of a binary encoded state machine.Revision :2000/02/29Company :Huawei Ltd.\*********************************************************************/ 'timescale 1ns / 10psmodule binary (Clock, Reset, A, B, C, D, E,Single, Multi, Contig);input input Clock;Reset;//system Clock//async Reset, active highinput A, B, C, D, E;//FSM input signals output Single, Multi, Contig;//FSM output signals//define output signals typereg Single;reg Multi;reg Contig;// Declare the symbolic names for statesparameter[2:0]//enum STATE—TYPE binaryS1 = 3'b001,S2 = 3'b010,S3 = 3'b011,S4 = 3'b100,S5 = 3'b101,S6 = 3'b110,S7 = 3'b111;parameter U—DLY = 1;// Declare current state and next state variablesreg[2:0]Cu rr—st;reg[2:0]Nex t—st;//Curr—st assignment,sequential logicalways @ (posedge Clock or posedge Reset)beginif (Reset)Curr—st <= S1;elseCurr—st<=#U—D LY Next—st;end//combinational logicalways @ (Curr—st or A or B or C or D or D or E)begincase(Curr—st)//full—caseS1 :beginMulti = 1'b0;Contig = 1'b0;S2 :S3 :S4 :Single = 1'b0; if (A & ~B & C) Next—st=S2; else if (A & B & ~C) Next—st=S4; elseNext—st=S1; endbeginMulti = 1'b1; Contig = 1'b0; Single = 1'b0; if (!D)Next—st = S3; elseNext—st = S4; endbeginMulti = 1'b0; Contig = 1'b1; Single = 1'b0; if (A I D)Next—st=S4; elseNext—st=S3; endbeginMulti = 1'b1; Contig = 1'b1; Single = 1'b0; if (A & B & ~C) Next—st = S5; elseNext—st=S4;endS5 :S6 :S7 :endcaseendbeginMulti = 1'b1;Contig = 1'b0;Single = 1'b0;Next—st=S6;endbeginMulti = 1'b0;Contig = 1'b1;Single = 1'b1;if (!E)Next—st=S7;elseNext—st=S6;endbeginMulti = 1'b0;Contig = 1'b1;Single = 1'b0;if (E)Next—st=S1;elseNext—st=S7;endendmodule以上介绍的用Verilog HDL设计来实现的FSM电路可用下面的逻辑图来表现图5 FSM 逻辑框图2 常用电路设计2.1 CRC 校验码产生器的设计 2.1.1 概述冗余编码是在二进制通信系统中常用的差错检测方法 它是通过在原始数据后加冗余校验码来检测差错 冗余位越多 检测出传输错误的机率越大 循环冗余编码 Cyclic Redundancy Codes 简称CRC 是一种常用的冗余编码 CRC 校验的基本原理是 CRC 可由一称为生成多项式 的常数去除该数据流的二进制数值而得 商数被放弃 余数作为冗余编码追加到数据流尾 产生新的数据流进行发送 在接收端 新的数据流被同一常数去除 检查余数是否为零 如果余数为零 就认为传输正确 否则就认为传输中已发生差错 该数据流重发2.1.2 CRC 校验码产生器的分析与硬件实现在产生CRC 校验码时 需要用到除法运算 一般说来 非常大的数字进行除法时 用数字逻辑实现时是比较麻烦的 因此 把二进制信息预先转换成一定的格式 这就是CRC 的多项式表示 二进制数表示为生成多项式的系数 如下例所示1,0001,0000,0010,0001 = x 16 + x 12 +x 5 + 1在多项式表示中 所有的二进制数均被表示成一个多项式 多项式的系数就是二进制中的对应值 D 为数据流多项式 G 为生成多项式 Q 为商数多项式 R 为余数多项式 在生成CRC 校验码时 数据流多项式D 被乘以X n 这里n 为生成多项式G 的最高次数也就是CRC 的长度 这个操作是通过将左移n 位得到的 我们可以用CRC 来代替多项式最后的n 个0 组成新的数据流多项式 由于二进制的加法和减法是等价的 所以产生新的数据流多项式应能被生成多项式G 除尽用以下公式表示为X n DRQ GReset ClockCombi LogicNext_stNext_st LogicCurr_stCombi & syncLogicCurr_st Logic在接收端传输信息的前一部分为原始数据流D 后一部分最后n位数为余数R 整个数据流多项式被同一生成多项式G去除商数被丢弃余数应为0 如果余数不为0 说明传输数据时发生错误数据需要重传不同的生成多项式有不同的检错能力为了得到优化的结果我们必须根据需要选择合适的生成多项式 CRC-16的生成多项式为G(x) = x16 + x12 +x 5 + 1CRC校验码产生器分两种串行CRC校验码产生器和并行CRC校验码产生器本文用到的是并行CRC校验码产生器由于计算并行CRC时用到了串行CRC的一些思想所以在此先讲一下串行CRC的产生通常 CRC校验码的值可以通过线性移位寄存器和异或门求得线性移位寄存器一次移一位完成除法功能异或门完成不带进位的减法功能如果商数为'1' 则从被除数的高阶位减去除数同时移位寄存器右移一位准备为被除数的较低位进行运算如果商数为'0' 则移位寄存器直接右移一位串行CRC-16校验码产生器的原理图如图2所示图2 串行CRC-16校验码产生器原理图在设计并行CRC校验码产生器的时候我们可以采用串行CRC校验码的思想用线性移位寄存器的方法产生并行CRC校验码与串行CRC校验码产生器不同的是并行CRC校验码产生器16位CRC同时输出所以要求在一个时钟周期内移位寄存器一次需要移16位实际上移位寄存器不可能在一个时钟周期内移16位所以这部分电路是用组合逻辑来完成整个CRC校验码产生器由组合逻辑和16个输出寄存器组成通过仿真和综合满足设计要求2.1.3并行CRC-16校验码产生器的Verilog HDL编码/**************************************************************************Filename : crc16—para.v*Auther : Verilog group*Description : This module is used to check CRC—16 of 8-bits cell*data, the generator polynomial is x/\16+x/\12+x/\5+1.*Called by :*Revision History : 2000-5-5 Revision 1.0*Email : zhangnb@*Company : Huawei Technology Inc.*Copyright(c) 1999,Huawei Technology Inc.,All right reserved.*************************************************************************///----------------------------// TOP MODULEmo dule CRC16—PARA(Reset , //Reset signalGclk , //Clock signalSoc , //Start of cellData—in , //input data of cellCrc—out //output CRC signal) ;//----------------------------// SIGNAL DECLARATIONS//----------------------------input Reset ;input Gclk ;input Soc ;input [7:0] Data—in ;output [15:0] Crc—out ;//----------------------------// SIGNAL DECLARATIONS//----------------------------wire Reset ;wire Gclk ;wire Soc ;wire [7:0] Data—in ;reg [15:0] Crc—out ;reg [15:0] Crc—tmp ;reg Temp ;integer i,j,k,l ;//----------------------------// PARAMETERS//----------------------------parameter U—DLY=1 ;//----------------------------// Crc—out signal//----------------------------always @(posedge Reset or posedge Gclk) beginif (Reset)Crc—out <= #U—DLY 16'b0 ;else if (Soc == 1'b1)Crc—out <= #U—DLY 16'b0 ;elseCrc—out <= #U—DLY Crc—tmp ; end// Crc—tmp signal//----------------------------always @(Crc—out or Data—in)beginCrc—tmp = Crc—out ;for (i=7;i>=0;i=i-1)beginTemp = Data—in[i] /\ Crc—tmp[15] ;for (j=15;j>12;j=j-1)Crc—tmp[j] = Crc—tmp[j-1] ; Crc—tmp[12] = Temp /\ Crc—tmp[11] ;for (k=11;k>5;k=k-1) Crc—tmp[k]= Crc—tmp[k-1] ;Crc—tmp[5] = Temp /\ Crc—tmp[4] ;end end for (l=4;l>0;l=l-1)Crc—tmp[l] = Crc—tmp[l-1] ; Crc—tmp[0] = Temp ;endmodule2.1.4串行CRC-16校验码产生器的Verilog HDL编码/************************************************************************** *Filename : crc16—ser.v*Auther : Verilog group*Description : This module is used to check CRC—16 of serial data,*the generator polynomial is x/\16+x/\12+x/\5+1.*Called by :*Revision History : 2000-5-5 Revision 1.0*Email : zhangnb@*Company : Huawei Technology Inc.*Copyright(c) 1999,Huawei Technology Inc.,All right reserved.**************************************************************************/ //----------------------------// TOP MODULE//----------------------------mo dule CRC16—S ER(Reset , //Reset signalGclk , //Clock signalSoc , //Start of cellData—in , //input data of cellCrc—out //output CRC signal) ;//----------------------------// SIGNAL DECLARATIONS//----------------------------input Reset ;input Gclk ;input Soc ;input Data—in ;output [15:0] Crc—out ;//----------------------------// SIGNAL DECLARATIONS//----------------------------wire Reset ;wire Gclk ;wire Soc ;wire Data—in ;reg [15:0] Crc—out ;reg Temp ;integer i,j,k,l ;//----------------------------// PARAMETERS//----------------------------parameter U—DLY=1 ;//----------------------------// Crc—out signal//----------------------------always @(posedge Reset or posedge Gclk)beginif (Reset)Crc—out <= #U—DLY 16'b0 ;else if (Soc == 1'b1)Crc—out <= #U—DLY 16'b0 ;elsebeginTemp = Data—in /\ Crc—out[15] ;for (j=15;j>12;j=j-1)Crc—out[j] <= #U—DLY Crc—out[j-1] ;Crc—out[12] <= #U—DLY Temp /\ Crc—out[11] ;for (k=11;k>5;k=k-1)Crc—out[k] <= #U—DLY Crc—out[k-1] ;Crc—out[5] <= #U—DLY Temp /\ Crc—out[4] ;for (l=4;l>0;l=l-1)endendCrc—out[l] <= #U—DLY Crc—out[l-1] ;Crc—out[0] <= #U—DLY Temp ;endmodule2.1 随机数产生电路设计2.1.1 概述伪随机序列又称为伪随机码是一组人工生成的周期序列它不仅具有随机序列的一些统计特性和高斯噪声所有的良好的自相关特征而且具有某种确定的编码规则同时又便千重复产生和处理因而在通信领域应用广泛伪随机序列的产生方式很多通常产生的伪随机序列的电路为一反馈移位寄存器它又可分为线性反馈移位寄存器和非线性反馈移位寄存器两类由线性反馈移位寄存器产生出的周期最长的二进制数字序列称为最大长度线性反馈移位寄存器序列简称m序列移位寄存器的长度为n 则m序列的周期为2n-1 没有全0状态其中伪随机数发生器的初始状态由微处理器通过SEED寄存器给出2.1.1伪随机序列发生器的硬件实现伪随机序列发生器的初始状态是由微处理器中SEED寄存器提供的而SEED寄存器的位数为8位所以需要设计一种8位的伪随机序列发生器它的本原多贞式为F(x) = x8 + x4 + x3 + x2 + 1伪随机序列发生器结构如图1所示图2 伪随机序列发生器结构框图图中Ci代表本原多贞式F(x)中各贞的系数2.1.28位伪随机序列发生器的Verilog HDL编码/************************************************************************** *Filename : rangen.v*Auther : Verilog groupC0C1C2 C n-1C n输出a n-1a n-2a1a0*Description : This module is used to generate 8-bits random n umber,*the polynomial is x/\8+x/\4+x/\3+x/\2+1.*Called by :*Revision History : 2000-5-5*Revision 1.0*Email : zhangnb@*Company : Huawei Technology Inc.*Copyright(c) 1999,Huawei Technology Inc.,All right reserved.**************************************************************************/ //----------------------------// TOP MODULE//----------------------------module RANGEN (Reset, //Reset signalGclk , //Clock signalLoad , //Load seed to Ran—numSeed , //initialize Ran—numRan—num //output random n umber) ;//----------------------------// SIGNAL DECLARATIONS//----------------------------input Reset ;input Gclk ;input Load ;input [7:0] Seed ;output [7:0] Ran—num ;//----------------------------// SIGNAL DECLARATIONS//----------------------------wire Reset ;wire Gclk ;wire Load ;wire [7:0] Seed ;reg[7:0]Ran—nu m;integer i ;//----------------------------// PARAMETERS//----------------------------parameter U—DLY=1 ;//----------------------------//Ran—nu m signal//----------------------------。
veriloga语法electrical摘要:一、Veriloga语法概述1.Veriloga简介2.Veriloga与Verilog的区别3.Veriloga的基本语法结构二、Veriloga中的electrical 关键字1.electrical 关键字的含义2.electrical 关键字在Veriloga中的使用方法3.electrical 关键字的作用及应用场景三、Veriloga语法electrical 关键字的具体应用1.电源描述2.信号描述3.逻辑描述4.实例分析四、Veriloga语法electrical 关键字的优缺点1.优点2.缺点五、总结1.Veriloga语法electrical 关键字的重要性2.Veriloga语法electrical 关键字在电路设计中的应用前景正文:一、Veriloga语法概述Veriloga是一种硬件描述语言,主要用于描述数字电路和模拟混合信号电路。
它具有简洁、易读、易懂的特点,广泛应用于电路设计领域。
Veriloga与Verilog具有相似的语法结构,但Veriloga在一些方面进行了优化和改进,使其更加便于使用。
Veriloga的基本语法结构包括:模块定义、信号声明、逻辑描述、功能描述等。
通过这些语法结构,设计人员可以方便地描述和实现电路功能。
二、Veriloga中的electrical 关键字1.electrical 关键字的含义electrical关键字是Veriloga中用于描述电路电气特性的关键字。
它可以用来定义电源、信号、传输线等电路元件的电气特性。
2.electrical 关键字在Veriloga中的使用方法在Veriloga中,使用electrical关键字的方法如下:```electrical <参数> = <值>;```其中,<参数>是electrical关键字所描述的电气特性,如电压、电流、阻抗等;<值>是该特性的具体数值。
常用Verilog 语法3.1 模块的结构Verilog 的基本设计单元是“模块”(block )。
一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能。
上面的设计中,模块中的第二、三行说明接口的信号流向,第四、五行说明了模块的逻辑功能。
从这一例子可以看出,Verilog 结构位于module 和endmodule 声明语句之间,每个Verilog 程序包括4个主要部分:端口定义、I/O 说明、内部信号声明和功能定义。
3.1.1模块的端口定义模块的端口声明了模块的输入输出口,格式如下:module 模块名(口1,口2,口3,口4,……);在引用模块时其端口可以用两种方法连接:(1)在引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义的端口名,例如:模块名(连接端口1信号名。
连接端口2信号名,连接端口3信号名,……,);(2)在引用时用“.”符号,标明原模块是定义时规定的端口名,例如:模块名(.端口1名(连接信号1名),端口2名(连接信号2名),……,);这样表示的好处在于可以用端口名与被引用模块的端口相对应,而不必严格按端口顺序对应,提高了程序的可读性和可移植性。
3.1.2 模块内容模块的内容包括I/O 说明,内部信号声明和功能定义。
1. I/O 说明的格式输入口: input[信号位宽-1:0] 端口名1;输出口: output[信号位宽-1:0] 端口名1;输入/输出口:inout[信号位宽-1:0] 端口名1;I/O 说明也可以写在端口声明语句里,格式如下:module module_name(input port1,input port2,…output port1,output port2…);2. 内部信号说明在模块内用到的和与端口有关的wire 和reg 类型变量的声明。
如:reg[width-1:0] R 变量1,R 变量2…;wire[width-1:0] W 变量1,W 变量2…;3. 功能定义模块中最重要的部分是逻辑功能定义部分,有3种方法可在模块中产生逻辑。
Verilog语言描述常见电路结构范例 组合逻辑 常见的组合逻辑有:算术逻辑部件、多路选择器、编码器、优先编码器、译码器和比较器等。
逻辑结构控制 使用括号可以改变组合逻辑的结构。虽然EDA工具可以对组合逻辑设计进行重新优化组合,但在Verilog描述中使用括号可以降低EDA工具的压力,并且减少工具的综合时间。
在下面的例子中,虽然y2和y1的功能是一样的,但y1会使用三级加法器,使用括号的y2只使用二级加法器。
always @ (a1 or a2 or b1 or b2 or c1 or c2 or d1 or d2) begin y1 = a1 + b1 + c1 + d1; y2 = (a2 + b2) + (c2 + d2); end
二选一多路选择器 下面给出了三种描述2:1 MUX 的方法。y1是通过条件赋值语句实现的,y2和y3都是通过if语句实现的。
wire y1 = sel1? a1: b1; always @ (a2 or a3 or b2 or b3 or sel2 or sel3) begin y2 = b2; if (sel2) y2 = a2; if (sel3) y3 = a3; else y3 = b3; end
四选一多路选择器 用Verilog描述4:1 MUX 可以有如下方法: 一个if语句加多个else if从句 嵌套 if 语句 case 语句 always @ (a or b or c or d or sel) begin if (sel == 2'b00) y = a; else if (sel == 2'b01) y = b; else if (sel == 2'b10) y = c; else y = d; end
always @ (a or b or c or d or sel) begin if (sel[1] == 0) if (sel[0] == 0) y = a; else y = b; else if (sel[0] == 0) y = c; else y = d; end
always @ ( a or b or c or d or sel) begin case (sel) 2'b00: y = a; 2'b01: y = b; 2'b10: y = c; 2'b11: y = d; default: y = a; endcase end
八选一多路选择器 描述8:1 MUX 最好使用case 语句
always @ ( a0 or a1 or a2 or a3 or a4 or a5 or a6 or a7 or sel) begin case (sel) 0: y = a0; 1: y = a1; 2: y = a2; 3: y = a3; 4: y = a4; 5: y = a5; 6: y = a6; 7: y = a7; default: y = a0; endcase end
8:3编码器 编码器可以将多个离散的信号用编码表示出来,比如3位的编码可以表示8个信号。下面的例子给出了三种8:3编码器的描述方法。
always @ (a) begin if (a == 8'b00000001) y = 0; else if (a == 8'b00000010) y = 1; else if (a == 8'b00000100) y = 2; else if (a == 8'b00001000) y = 3; else if (a == 8'b00010000) y = 4; else if (a == 8'b00100000) y = 5; else if (a == 8'b01000000) y = 6; else if (a == 8'b10000000) y = 7; else y = 3'bX; end
always @ (a) begin case (a) 8'b00000001: y = 0; 8'b00000010: y = 1; 8'b00000100: y = 2; 8'b00001000: y = 3; 8'b00010000: y = 4; 8'b00100000: y = 5; 8'b01000000: y = 6; 8'b10000000: y = 7; default: y = 3'bX; endcase end
always @ ( a) begin test = 8'b00000001; y = 3'bX; for (i=0; i<8; i=i+1) begin if ( a == test ) y = i; test = test << 1; end end
优先级编码器 优先级编码器是一种特殊的编码器,就是当多个输入信号同时有效时,它只输出优先级最高的信号的编码。下面的例子给出了8:3优先级编译器的描述方法。
always @ (a) begin valid = 1; if (a[7]) y = 7; else if (a[6]) y = 6; else if (a[5]) y = 5; else if (a[4]) y = 4; else if (a[3]) y = 3; else if (a[2]) y = 2; else if (a[1]) y = 1; else if (a[0]) y = 0; else begin valid = 0; y = 3'bx; end end
always @ (a) begin valid = 1; casez(a) 8'b1: y = 7; 8'b01: y = 6; 8'b001: y = 5; 8'b0001: y = 4; 8'b00001: y = 3; 8'b000001??: y = 2; 8'b0000001?: y = 1; 8'b00000001: y = 0; default: begin valid = 0; y = 3'bx; end endcase end
always @ ( a or n) begin valid = 0; y = 3'bx; for (i=8; i<8; i=i+1) begin if (a[i]) begin valid = 1; y = i; end end end
译码器 译码器的作用恰好与编码器相反,它从编好的码中把原始信号还原出来。下面的例子给出了三种3:8译码器的描述方法:
always @ (a) begin if (a == 0) y = 8'b00000001; else if (a == 1) y = 8'b00000010; else if (a == 2) y = 8'b00000100; else if (a == 3) y = 8'b00001000; else if (a == 4) y = 8'b00010000; else if (a == 5) y = 8'b00100000; else if (a == 6) y = 8'b01000000; else y = 8'b10000000; end
always @ (a) begin case (a) 0: y = 8'b00000001; 1: y = 8'b00000010; 2: y = 8'b00000100; 3: y = 8'b00001000; 4: y = 8'b00010000; 5: y = 8'b00100000; 6: y = 8'b01000000; 7: y = 8'b10000000; default: y = 8'bX; endcase end
always @ (a or n) begin for (i=0; i<8; i=i+1) begin if ( a == n ) y[i] = 1; else y[i] = 0; end end
比较器 比较器用于比较两个或多个输入的关系,如相等、不等、大小等。
下面的例子给出了三种6位比较器的描述方法。 always @ ( a1 or a2 or a3 or b1 or b2 or b3) begin y1 = 1; for (n=0; n<6; n=n+1) if (a1[n] != b1[n]) y1 = 0;
y2 = 0; if (a2 == b2) y2 = 1; if (a3 == b3) y3 = 1; else y3 = 0; end 时序逻辑 时序逻辑包括latch、触发器、计数器等,latch产生的主要原因是if或case语句中的条件不完整,这是要努力避免的。
D触发器 always @ (posedge clk) begin if (!rst_syn) y1 <= 0; else y1 <= d1; end
always @ (posedge clk or negedge rst_n) begin if (!rst_n) y2 <= 0; else y2 <= d2; end
always @ (posedge clk or negedge rst_n) begin if (!rst_n) y3 <= 0; else if (rst_syn) y3 <= 0; else y3 <= d3; end
always @ (posedge clk) if (en) y4 <= d4;
always @ (posedge clk) if (rst_syn) y5 <= 0; else if (en) y5 <= d5;
always @ (posedge clk or negedge rst_n) if (rst_n) y6 <= 0; else if (en) y6 <= d6;
计数器 always @ ( posedge clk or negedge rst_n ) begin if (!rst_n) counter = 0; else begin case ({up,down}) 2'b10: counter <= counter + 1; 2'b01: counter <= counter - 1; endcase end end