verilog常用例子

verilog常用例子
verilog常用例子

2.6.1 Verilog基本模块

1.触发器的Verilog实现

时序电路是高速电路的主要应用类型,其特点是任意时刻电路产生的稳定输出不仅与当前的输入有关,而且还与电路过去时刻的输入有关。时序电路的基本单元就是触发器。下面介绍几种常见同步触发器的Verilog 实现。

同步RS触发器

RS触发器分为同步触发器和异步触发器,二者的区别在于同步触发器有一个时钟端clk,只有在时钟端的信号上升(正触发)或下降(负触发)时,触发器的输出才会发生变化。下面以正触发为例,给出其Verilog 代码实现。

例2-15 正触发型同步RS触发器的Verilog实现。

module sy_rs_ff (clk, r, s, q, qb);

input clk, r, s;

output q, qb;

reg q;

assign qb = ~ q;

always @(posedge clk) begin

case({r, s})

2'b00: q <= 0;

2'b01: q <= 1;

2'b10: q <= 0;

2'b11: q <= 1'bx;

endcase

end

endmodule

上述程序经过综合Synplify Pro后,其RTL级结构如图2-2所示。

图2-2 同步RS触发器的RTL结构图

在ModelSim 6.2b中完成仿真,其结果如图2-3所示

图2-3 同步RS触发器的仿真结果示意图

同步T触发器

T触发器也分为同步触发器和异步触发器,二者的区别在于同步T触发器多了一个时钟端。同步T触发器的逻辑功能为:当时钟clk沿到来时,如果T=0,则触发器状态保持不变;否则,触发器输出端反转。R 为复位端,当其为高电平时,输出Q与时钟无关,Q=0。

例2-16 同步T触发器的Verilog实现。

module sy_t_ff(clk, r, t, q, qb);

input clk, r, t;

output q, qb;

reg q;

assign qb = ~q;

always @(posedge clk) begin

if(r)

q <= 0;

else

q <= ~q;

end

endmodule

上述程序经过综合Synplify Pro后,其RTL级结构如图2-4所示。

图2-4 同步T触发器电路的RTL结构图

在ModelSim 6.2b中完成仿真,其结果如图2-5所示

图2-5 同步T触发器的仿真结果示意图

同步D触发器

同步D触发器的功能为:D输入只能在时序信号clk的沿变化时才能被写入到存储器中,替换以前的值,常用于数据延迟以及数据存储模块中。

例2-17 同步D触发器的Verilog实现。

module sy_d_ff(clk, d, q, qb);

input clk, d;

output q, qb;

reg q;

assign qb = ~q;

always @(posedge clk) begin

q <= d;

end

endmodule

上述程序经过综合Synplify Pro后,其RTL级结构如图2-6所示。

图2-6 同步D触发器的RTL结构图

在ModelSim 6.2b中完成仿真,其结果如图2-7所示

图2-7 同步D触发器的仿真结果示意图

同步JK触发器

JK触发器是在RS触发器的基础上发展而来的,常用于实现计数器。当clk=0时,触发器不工作,处于保持状态。当时钟clk=1时,触发器的功能如下:当JK为00、01以及10时实现RS触发器的功能;当JK为11时实现T触发器的功能。

例2-18 同步JK触发器的Verilog实现。

module sy_jk_ff(clk, j, k, q, qb);

input clk, i, k;

output q, qb;

reg q;

assign qb = ~q;

always @(posedge clk) begin

case({j, k})

2'b00: q <= q;

2'b01: q <= 0;

2'b10: q <= 1;

2'b11: q <= ~q;

endcase

end

endmodule

上述程序经过综合Synplify Pro后,其RTL级结构如图2-8所示。

图2-8 同步JK触发器的RTL结构图

在ModelSim 6.2b中完成仿真,其结果如图2-9所示

图2-9 同步JK触发器的仿真结果示意图

2.三态缓冲器的Verilog实现

三态缓冲器也称三态门,其典型应用是双向端口,常用于双向数据总线的构建。在数字电路中,逻辑输出有两个正常态:低电平状态(对应逻辑0)和高电平状态(对应逻辑1);此外,电路还有不属于0和1状态的高组态(对应于逻辑Z)。所谓高阻,即输出端属于浮空状态,只有很小的漏电流流动,其电平随外部电平高低而定,门电平放弃对输出电路的控制。或者可以理解为输出与电路是断开的。最基本的三态缓冲器的逻辑符号如图2-10所示。

图2-10 三态缓冲器的逻辑符号图

当OE为高电平时,Dataout与Datain相连;而OE为低时,Dataout为高阻态,相当于和Datain之间的连线断开。

例2-19 使用Verilog实现三态缓冲器

inout a;

wire z, b;

//当控制信号z为1时,开通三态门,b为输入端口;当z为0时,三态门为高阻,

//a为输出端口

assign a = (z) ? b : 8'bz;

3.38译码器的Verilog实现

38译码器是通过3条线来达到控制8条线的状态,就是通过3条控制线不同的高低电平组合, 一共可以组合出23=8种状态。在电路中主要起到扩展IO资源的作用。当然,可根据实际需求将38译码器扩展到更高级数上。

例2-20 使用Verilog实现38译码器

module decoder3to8(din, reset, dout);

input [2:0] din;

input reset;

output [7:0] dout;

reg [7:0] dout;

always @(din or reset) begin

if(!reset)

dout = 8'b0000_0000;

else

case(din)

3'b000: dout = 8'b0000_0001;

3'b001: dout = 8'b0000_0010;

3'b010: dout = 8'b0000_0100;

3'b011: dout = 8'b0000_1000;

3'b100: dout = 8'b0001_0000;

3'b101: dout = 8'b0010_0000;

3'b110: dout = 8'b0100_0000;

3'b111: dout = 8'b1000_0000;

endcase

end

endmodule

上述程序经过综合Synplify Pro后,其RTL级结构如图2-11所示。

图2-11 38译码器的RTL结构图

在ModelSim 6.2b中完成仿真,其结果如图2-12所示

图2-12 38译码器的仿真结果示意图

2.6.2 基本时序处理模块

1.奇、偶数分频电路

在数字逻辑电路设计中,分频器是一种基本电路。通常用来对某个给定频率进行分频,以得到所需的频率。偶数分频电路

偶数倍分频是最简单的一种分频模式,完全可通过计数器计数实现。如要进行N倍偶数分频,那么可由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数,以此循环下去。这种方法可以实现任意的偶数分频。例2-21给出的是一个16分频电路,其它倍数的分频电路可通过修改计数器的上限值得到。

例2-21 用Verilog实现一个16分频电路。

module clk_div16(clk_in, reset, clk_out);

input clk_in;

input reset;

output clk_out;

reg clk_out;

reg [2:0] cnt;

always @(posedge clk_in) begin

if(!reset) begin

cnt <= 0;

clk_out <= 0;

end

else

if(cnt == 7) begin

cnt <= 0;

clk_out <= !clk_out;

end

else begin

cnt <= cnt + 1;

clk_out <= clk_out;

end

end

endmodule

上述程序经过综合Synplify Pro后,其RTL级结构如图2-13所示。

图2-13 16分频电路的RTL结构图

在ModelSim 6.2b中完成仿真,其结果如图2-14所示,从中可以看出例2-21成功实现了输入时钟的16分频。

图2-14 16分频电路的仿真结果示意图

奇数分频电路

奇数倍分频有多种实现方法,下面介绍常用的错位“异或”法的原理。如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转。比如在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转,即在邻近的1和2时刻进行两次翻转。这样实现的三分频占空比为1/3或者2/3。如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后将下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。

这种错位“异或”法可以推广实现任意的奇数分频:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发的模N计数,计数到某一选定值时进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数N分频时钟。再者同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数N分频时钟。两个占空比非50%的N分频时钟相或运算,得到占空比为50%的奇数N分频时钟。

例2-22 使用Verilog实现3分频电路。

module clk_div3(clk_in, reset, clk_out);

input clk_in;

input reset;

output clk_out;

reg [1:0] cnt, cnt1;

reg clk_1to3p, clk_1to3n;

always @(posedge clk_in) begin

if(!reset) begin

cnt <= 0;

clk_1to3p <= 0;

end

else begin

if(cnt == 2'b10) begin

cnt <= 0;

clk_1to3p <= clk_1to3p;

end

else begin

cnt <= cnt + 1;

clk_1to3p <= !clk_1to3p;

end

end

end

always @(negedge clk_in) begin

if(!reset) begin

cnt1 <= 0;

clk_1to3n <= 0;

end

else begin

if(cnt1 == 2'b10) begin

cnt1 <= 0;

clk_1to3n <= clk_1to3n;

end

else begin

cnt1 <= cnt1 + 1;

clk_1to3n <= !clk_1to3n;

end

end

end

assign clk_out = clk_1to3p | clk_1to3n;

endmodule

上述程序经过综合Synplify Pro后,其RTL级结构如图2-15所示。

图2-15 3分频电路的RTL结构图

在ModelSim 6.2b中完成仿真,其结果如图2-16所示,可以看到输出时钟为占空比为50%的3分频时钟。

图2-16 3分频电路的仿真结果

2.同步采样模块

在实际应用中,外部输入的异步信号需要经过系统时钟的同步化,且将输入的异步信号整形成一个时钟长的脉冲信号,如图2-17所示。这里以例2-23来说明实现的方法。

图2-17 异步信号的同步采样示意图

例2-23 使用Verilog将外部异步信号进行同步整形。

module clk_syn(clk, reset, s_in, s_out);

input clk;

input reset;

input s_in;

output s_out;

reg s_t1, s_t2;

always @(posedge clk) begin

if(!reset) begin

s_t1 <= 0;

s_t2 <= 0;

end

else begin

s_t1 <= s_in;

s_t2 <= s_t1;

end

end

assign s_out = s_t1 & (!s_t2);

endmodule

上述程序经过综合Synplify Pro后,其RTL级结构如图2-18所示。从结果上看,该电路非常简单,但需要一定的时序逻辑能力才能真正理解该段程序。

图2-18 同步电路的RTL结构示意图

在ModelSim 6.2b中完成仿真,其结果如图2-19所示,将不等长的高电平信号整形成宽度为一个时钟周期的脉冲信号。

图2-19 同步电路的仿真结果示意图

其中,如果在时钟的上升沿din="1",则x=1,y=0,dout=x and (not y)=1;如果din="1"超过一个时钟宽度,则x=1,y=1,dout=x and (not y)=0。即使din在时钟周期内出现抖动,也不会影响输出结果,还是被整形成一个时钟宽度。所以不管是长周期信号还是短周期信号,经过同步采样后,有效高电平宽度都等于时钟周期。

3.同步状态机的Verilog实现

状态机一般包括组合逻辑和寄存器逻辑两部分。组合电路用于状态译码和产生输出信号,寄存器用于存储状态。状态机的下一个状态及输出不仅与输入信号有关,还与寄存器当前状态有关。根据输出信号产生方法的不同,状态机可分为米里(Mealy)型和摩尔(Moore)型。前者的输出是当前状态和输入信号的函数,后者的输出仅是当前状态的函数。在硬件设计时,根据需要决定采用哪种状态机。

状态编码

状态编码又称状态分配。通常有多种编码方法,编码方案选择得当,设计的电路可以简单;反之,电路会占用过多的逻辑或速度降低。设计时,须综合考虑电路复杂度和电路性能这两个因素。下面主要介绍二进制编码、格雷编码和独热码。

二进制编码和格雷码都是压缩状态编码。二进制编码的优点是使用的状态向量最少,但从一个状态转换到

相邻状态时,可能有多个比特位发生变化,瞬变次数多,易产生毛刺。格雷编码在相邻状态的转换中,每次只有1个比特位发生变化,虽减少了产生毛刺和一些暂态的可能,但不适用于有很多状态跳转的情况。

独热码是指对任意给定的状态,状态向量中只有1位为1,其余位都为0。n状态的状态机需要n个触发器。这种状态机的速度与状态的数量无关,仅取决于到某特定状态的转移数量,速度很快。当状态机的状态增加时,如果使用二进制编码,那么状态机速度会明显下降。而采用独热码,虽然多用了触发器,但由于状态译码简单,节省和简化了组合逻辑电路。独热编码还具有设计简单、修改灵活、易于综合和调试等优点。对于寄存器数量多、而门逻辑相对缺乏的FPGA器件,采用独热编码可以有效提高电路的速度和可靠性,也有利于提高器件资源的利用率。独热编码有很多无效状态,应该确保状态机一旦进入无效状态时,可以立即跳转到确定的已知状态。

有限状态机的Verilog实现

用Verilog 语言描述有限状态机可使用多种风格,不同的风格会极大地影响电路性能。通常有3种描述方式:单always块、双always块和三always块。

单always块把组合逻辑和时序逻辑用同一个时序always块描述,其输出是寄存器输出,无毛刺。但是这种方式会产生多余的触发器,代码难于修改和调试,应该尽量避免使用。

双always块大多用于描述Mealy状态机和组合输出的Moore状态机,时序always块描述当前状态逻辑,组合逻辑always块描述次态逻辑并给输出赋值。这种方式结构清晰,综合后的面积和时间性能好。但组合逻辑输出往往会有毛刺,当输出向量作为时钟信号时,这些毛刺会对电路产生致命的影响。

三always块大多用于同步Mealy状态机,两个时序always块分别用来描述现态逻辑和对输出赋值,组合always块用于产生下一状态。这种方式的状态机也是寄存器输出,输出无毛刺,并且代码比单always块清晰易读,但是面积大于双always块。随着芯片资源和速度的提高,目前这种方式得到了广泛应用。

下面以三always块模块给出状态机的Verilog模板。

// 构成状态跳转环

always @(posedge clk or negedge rst_n)

current_state <= next_state;

// 完成状态机的内部逻辑

always @ (current_state or ) begin

case(current_state)

S1: next_state = S2;

S2: next_state = S1;

default: next_state = S2;

endcase

end

// 完成状态机的外部逻辑

always @(current_state or ) begin

case(current_state)

S1:

S2:

default:

endcase

end

综合状态机的一般原则

在硬件描述语言中,许多基于仿真的语句虽然符合语法规则,但是不能映射到硬件逻辑电路单元,如果要最终实现硬件设计,必须写出可以综合的程序。通常,综合的原则为:

综合之前一定要进行仿真,仿真会暴露逻辑错误。如果不做仿真,没有发现的逻辑错误会进入综合器,使综合的结果产生同样的逻辑错误。每一次布线之后都要进行仿真,在器件编程或流片之前一定要进行最后的仿真。用Verilog HDL描述的异步状态机是不能综合的,应该避免用综合器来设计。在必须设计异步状态机时,建议用电路图输入的方法状态机应该有一个异步或同步复位端,以便在通电时将硬件电路复位到有效状态。建议使用异步复位以简化硬件开销。时序逻辑电路建模时,用非阻塞赋值。用always块写组合逻辑时,采用阻塞赋值。不要在多个always块中为同一个变量赋值。always块中应该避免组合反馈回路。在赋值表达式右端参与赋值的信号都必须出现在敏感信号列表中,否则在综合时,会为没有列出的信号隐含地产生一个透明锁存器。

verilog数字系统设计教程习题答案

verilog 数字系统设计教程习题答案第二章 HDL 既是一种行为描述语言,也是一种结构描述语言。如果按照一定的规则和风格编写代码,就可以将功能行为模块通过工具自动转化为门级互联的结构模块。这意味着利用Verilog 语言所提供的功能,就可以构造一个模块间的清晰结构来描述复杂的大型设计,并对所需的逻辑电路进行严格的设计。 2.模块的基本结构由关键词module和endmodule构成。 3.一个复杂电路系统的完整Verilog HDL 模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。 HDL和VHDL乍为描述硬件电路设计的语言,其共同的特点在于:能形式化地抽象表示电路的结构和行为、支持逻辑设计中层次与领域的描述、可借用高级语言的精巧结构来简化电路的描述、具有电路仿真与验证机制以保证设计的正确性、支持电路描述由高层到低层的综合转换、硬件描述与实现工艺无关(有关工艺参数可通过语言提供的属性包括进去)、便于文档管理、易于理解和设计重用。 5.不是

6.将用行为和功能层次表达的电子系统转换为低层次的便于具体实现的模块组合装配的过程。 7.综合工具可以把HDL变成门级网表。这方面Synopsys工具占有较大的优势,它的Design Compile 是作为一个综合的工业标准,它还有另外一个产品叫Behavior Compiler ,可以提供更高级的综合。 另外最近美国又出了一个软件叫Ambit ,据说比Synopsys 的软件更有效,可以综合50万门的电路,速度更快。今年初Ambit 被Cadence 公司收购,为此Cade nee放弃了它原来的综合软件Syn ergy。随着FPGA 设计的规模越来越大,各EDA公司又开发了用于FPGA设计的综合软件,比较有名的有:Sy nopsys 的FPGAExpress,Cade nee 的Syn plity ,Mentor的Leonardo,这三家的FPGA综合软件占了市场的绝大部分。 8.整个综合过程就是将设计者在EDA平台上编辑输入的HDL文本、原理图或状态图形描述,依据给定的硬件结构组件和约束控制条件 进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路描述网表文件。用于适配,适配将由综合器产生的网表文件配置于指定的目标器件中,使之产生最终的下载文件,如JEDEC Jam格式的 文件 9.在FPGA设计中,仿真一般分为功能仿真(前仿真)和时序仿真(后仿真)。功能仿真又叫逻辑仿真,是指在不考虑器件延时和布线延时的理想情况下对源代码进行逻辑功能的验证;而时序仿真是在布局布线后进行,它与

AD转换verilog程序

// 16-bit Analogue-Digital Converter // // +-----------------------------+ // | Copyright 1996 DOULOS | // | designer : Tim Pagden | // | opened: 7 Jun 1996 | // +-----------------------------+ `timescale 1 ns / 1 ps module ADC_16bit (analog_in,digital_out); parameter conversion_time = 25.0, // conversion_time in ns // (see `timescale above) charge_limit = 1000000; // = 1 million input[63:0] analog_in; // double-precision representation of a real-valued input port; a fix that enables // analog wires between modules to be coped with in Verilog. // Think of input[63:0] as the equivalent of MAST's electrical. output[15:0] digital_out; reg[15:0] delayed_digitized_signal; reg[15:0] old_analog,current_analog; reg[4:0] changed_bits; reg[19:0] charge; reg charge_ovr; reg reset_charge; /* SIGNALS:- analog_in = 64-bit representation of a real-valued signal analog_signal = real valued signal recovered from analog_in analog_limited = analog_signal, limited to the real-valued input range of the ADC digital_out = digitized 16bit 2's complement quantization of analog_limited */ /* function to convert analog_in to digitized_2s_comp_signal. Takes analog_in values from (+10.0 v - 1LSB) to -10.0 v and converts them to values from +32767 to -32768 respectively */

VerilogHDL经典程序非常适合新手

一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0; 2'b01:y=i1; 2'b10:y=i2; 2'b11:y=i3; default:y=0; 一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0;

Verilog HDL编程举例

设计示范和上机习题 练习一.简单的组合逻辑设计 //(方法一): //---------------文件名compare.v ----------------- module compare(equal,a,b); input a,b; output equal; assign equal = (a==b)? 1 : 0; //a等于b时,equal输出为1;a不等于b时,equal输出为0。endmodule //(方法二): module compare(equal,a,b); input a,b; output equal; reg equal; always @(a or b) if(a==b) //a等于b时,equal输出为1; equal =1; else //a不等于b时,equal输出为0。 equal = 0; //思考:如果不写else 部分会产生什么逻辑?

endmodule //------------------------------------------------------------- //----------测试模块源代码(方法之一): `timescale 1ns/1ns // 定义时间单位。 `include "./compare.v" // 包含模块文件。在有的仿真调试环境中并不需要此语句。 //而需要从调试环境的菜单中键入有关模块文件的路径和名称 module t; reg a,b; wire equal; initial // initial常用于仿真时信号的给出。 begin a=0; b=0; #100 a=0; b=1; #100 a=1; b=1; #100 a=1; b=0; #100 a=0; b=0; #100 $stop; //系统任务,暂停仿真以便观察仿真波

system verilog教程

SystemVerilog Tutorials 下面的手册会帮助你了解一些SystemVerilog中最重要的新特点。手册还提供了一些代码样本和例子使你可以对语言有更好"感觉"。这些辅导假设你们已经了解了一些Verilog语言。如果没有,你可以先去看看Verilog设计者指南(V erilog Designer’s Guide)。 * Data types * RTL design * Interfaces * Clocking * Assertion-based verification * Classes * Testbench automation and constraints * The Direct Programming Interface (DPI) SystemVerilog 的数据类型 这个手册将描述Systemverilog新引进的数据类型。他们大多数都是可以综合的,并且可以使RTL级描述更易于理解和书写。 整型和实型 SystemVerilog引进了几种新的数据类型。C语言程序员会熟悉其中的大多数。引进新的数据类型构思是这样的,如果C语言和SystemVerilog有相同的数据类型可以使C语言算法模型更容易的转化为SystemVerilog模型。 Verilog的变量类型有四态:既是0,1,X,Z。SystemVerilog引进了新的两态数据类型,每一位只可以是0或是1。当你不需要使用的X和Z值时,譬如在写Testbench和做为for语句的循环变量。使用两态变量的RTL级模型,可以使模拟器更有效率。并且使用得当的话将不会对综合结果产生影响。 二态整型 类型描述例子 Bit user-defined size bit [3:0] a_nibble; Byte 8 bits, unsigned byte a, b; Shortint 16 bits, signed shortint c, d; Int 32 bits, signed int i,j; Longint 64 bits, signed longint lword;

verilog程序-60进制计数器

module count60_dongtai_LED ( input clk, input rest_n, output reg [2:0] sel, //位选 output reg [6:0] display ); reg [15:0] count_clk; // 分频计数器,最大2^16=64K分频 reg [5:0] sum_num; //计数缓存器,2^6=64 reg [3:0] g_bit; //个位 reg [3:0] s_bit; //十位 reg [3:0] disp_temp; //分频 always @ (posedge clk or negedge rest_n) begin if(rest_n ==0) begin count_clk=16'b0; end else begin if(count_clk==16'hffff) begin count_clk=16'b0; end else begin count_clk=count_clk+1'b1; end end end // 60进制计数 always @ (negedge count_clk[3] or negedge rest_n) begin // clk_clk[3] 对"clk" 16分频if(rest_n ==0) begin g_bit=4'b0; s_bit=4'b0; sum_num=6'b0; end else begin if (sum_num==6'd59) begin sum_num=6'b0; end else begin sum_num=sum_num+1'b1; end end s_bit=(sum_num/10)%10;

Quartus-II使用教程-完整实例2

Quartus Ⅱ入门教程 (一个Verilog 程序的编译和功能仿真) Quartus Ⅱ 是Altera 公司推出的专业EDA 工具,支持原理图输入、硬件描述语言的输入等多种输入方式。硬件描述语言的输入方式是利用类似高级程序的设计方法来设计出数字系统。接下来我们对这种智能的EDA 工具进行初步的学习。使大家以后的数字系统设计更加容易上手。 ● 快捷工具栏:提供设置(setting ),编译(compile )等快捷方式,方便用户使用,用户也可以在菜单栏的下拉菜单找到相应的选项。 ● 菜单栏:软件所有功能的控制选项都可以在其下拉菜单中找到。 ● 信息栏:编译或者综合整个过程的详细信息显示窗口,包括编译通过信息和报错信息。

1 工程名称: 2添加已有文件(没有已有文件的直接跳过next)

3 选择芯片型号(我们选择cylone II 系列下的EP2C70F896C6芯片) (注:如果不下载到开发板上进行测试,这一步可以不用设置) 4 选择仿真,综合工具(第一次实验全部利用quartus 做,三项都选None ,然后next )

5 工程建立完成(点finish )

第三步:添加文件(file>new> VHDL file),新建完成之后要先保存。 第四步:编写程序 以实现一个与门和或门为例,Verilog描述源文件如下: module test(a,b,out1,out2); input a,b; output out1,out2; assign out1=a&b; assign out2=a | b; endmodule 然后保存源文件; 第五步:检查语法(点击工具栏的这个按钮(start Analysis & synthesis))

Verilog程序(汉字点阵显示

中国石油大学 数电课程设计报告题目: 学院: 班级: 姓名: 学号: 日期: 2012 年 12月

摘要 设计要求: 利用EDA/SOPC 实验开发平台提供的16*16点阵LED以及EPC235核心板,实现循环显示“中国石油大学”这6个汉字(左移或者右移均可)。 (1)手动生成“中国石油大学”这6个汉字在16*16点阵LED 上的6个字模(即控制某些LED亮,某些LED灭)。 (2)实现循环显示“中国石油大学”这6个汉字(左移或者右移均可)。 (3)拓展要求:自主设计(如控制循环速度,方向)。 关键词: 扫描分频,控制速度,点阵,点阵汉字显示,

设计原理及方案: 1、16*16点阵LED内部结构如下图所示。 2、总体设计框图: 3、各子模块的设计: (1)、分频,扫描: module fenpin (clk_50Mhz,clk_4hz,k2,k3); input clk_50Mhz,k2,k3; // 输入端口声明

output clk_4hz; // 输出端口声明reg[24:0] count,ccount; reg clk_4hz; always @(posedge clk_50Mhz) begin if ((k2==0) && (k3==0)) ccount<=500000000; if ((k2==0) && (k3==1)) ccount<=100000000; if ((k2==1) && (k3==0)) ccount<=50000000; if ((k2==1) && (k3==1)) ccount<=10000000; if(count

Verilog的135个经典设计实例

【例3.1】4位全加器 module adder4(cout,sum,ina,inb,cin); output[3:0] sum; output cout; input[3:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; endmodule 【例3.2】4位计数器 module count4(out,reset,clk); output[3:0] out; input reset,clk; reg[3:0] out; always @(posedge clk) begin if (reset) out<=0; //同步复位 else out<=out+1; //计数 end endmodule 【例3.3】4位全加器的仿真程序 `timescale 1ns/1ns `include "adder4.v" module adder_tp; //测试模块的名字 reg[3:0] a,b; //测试输入信号定义为reg型 reg cin; wire[3:0] sum; //测试输出信号定义为wire型 wire cout; integer i,j; adder4 adder(sum,cout,a,b,cin); //调用测试对象 always #5 cin=~cin; //设定cin的取值 initial begin a=0;b=0;cin=0; for(i=1;i<16;i=i+1) #10 a=i; //设定a的取值 end - 1 -

initial begin for(j=1;j<16;j=j+1) #10 b=j; //设定b的取值 end initial//定义结果显示格式 begin $monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum); #160 $finish; end endmodule 【例3.4】4位计数器的仿真程序 `timescale 1ns/1ns `include "count4.v" module coun4_tp; reg clk,reset; //测试输入信号定义为reg型 wire[3:0] out; //测试输出信号定义为wire型 parameter DELY=100; count4 mycount(out,reset,clk); //调用测试对象 always #(DELY/2) clk = ~clk; //产生时钟波形 initial begin//激励信号定义 clk =0; reset=0; #DELY reset=1; #DELY reset=0; #(DELY*20) $finish; end //定义结果显示格式 initial $monitor($time,,,"clk=%d reset=%d out=%d", clk, reset,out); endmodule 【例3.5】“与-或-非”门电路 module AOI(A,B,C,D,F); //模块名为AOI(端口列表A,B,C,D,F) input A,B,C,D; //模块的输入端口为A,B,C,D output F; //模块的输出端口为F - 2 -

ADDA等一些芯片的verilog程序

/* AD0809 module v1.0 work up to 5M sample = 25us 40khz for normal clk = 2.5M sample = 30us 33khz */ module ad0809( clkin, adclk, eoc, st, ale, datain, oe, dataout ); input clkin; input eoc; input [7:0]datain; output st; output ale; output oe; output adclk; output [7:0]dataout; reg adclk; reg [7:0]dataout; reg st; reg oe; reg ale; //frequence divider for AD parameter Div_adclk = 8'd9;//(9+1)*2=20 adclk=2.5M parameter Div_clk_state = 4'd4;//(4+1)*2=10 clk_state=5M

reg [8:0]div_cnt_ad;//frequence div cnt reg [3:0]div_cnt_state; reg clk_state; always@(negedge clkin)begin if(div_cnt_ad != Div_adclk) div_cnt_ad <= div_cnt_ad + 1'b1; else begin div_cnt_ad <= 0; adclk <= ~adclk; end if(div_cnt_state != Div_clk_state) div_cnt_state <= div_cnt_state + 1'b1; else begin div_cnt_state <= 0; clk_state <= ~clk_state; end end /*AD convert*/ reg [3:0]state; reg [7:0]delay; initial begin state <= 4'd0; end always@(negedge clk_state)begin case(state) 4'd0:begin //clear all st <= 1'b0; oe <= 1'b0; ale <= 1'b0;

华为verilog教程

1.0 41 HDL Verilog HDL () 2004.8.3 yyyy/mm/dd

Verilog HDL 2004.8.3 1.00 2004-08-16241

28 5 ..............................................................274.8 case ..........................................................254.7 ..........................................................254.6.6 ....................................................254.6.5 ....................................................244.6.4 ................................................234.6.3 ....................................................224.6.2 ....................................................214.6.1 . (21) 4.6 .....................................................204.5.2 ...................................................204.5.1 (20) 4.5 ..........................................................184.4.2 .........................................................184.4.1 . (18) 4.4 ........................................................184.3 .............................................................174.2 .............................................................174.1.3 ..................................................174.1.2 .......................................................174.1.1 (17) 4.1 (17) 4 Verilog HDL (16) 3.3.4 ..................................................153.3.3 ..................................................143.3.2 ................................................123.3.1 (12) 3.3 ......................................................113.2 .............................................................113.1.3 ......................................................103.1.2 ....................................................93.1.1 . (9) 3.1 (9) 3 Verilog HDL (7) 2.4.2 ..........................................................72.4.1 . (7) 2.4 Verilog HDL .....................................................62.3 .........................................................62.2 .......................................................52.1 . (5) 2 HDL ......................................................51 ................................................................... Verilog HDL 2004-08-16 341

几个常用的Verilog小程序

几个常用的Verilog小程序 (1) 8位串并转换 module haidaoqi(clk,rst,din,dout); input clk,rst,din; output [7:0] dout; reg[7:0] data,dout; reg[2:0] cnt; always@(posedge clk or posedge rst) if(rst) //复位高有效 data <=8'b0; else data<= {data[7:0],din};//din是输入串行数据,假设输入数据高位在前 //这是一个移位寄存器 always@(posedge clk or posedge rst) if(rst) cnt <= 3'b0; else if(cnt == 3'b111) cnt <= 3'b0; else cnt <= cnt +1;//计数器,用来计算移位次数,移位8次在以

后产生一个有效数据 always@(posedge clk or posedge rst) if(rst) dout <= 8'b0; else if(cnt == 3'b111) dout <= data;//如果计数器记到7,那么输出一个有效的8位数据 else dout <= 0; endmodule (2) 8 位数据寄存器 module reg8(out_data,in_data,clk,clr); output[7:0] out_data; input[7:0] in_data; input clk,clr; reg[7:0] out_data; always @(posedge clk or posedge clr) begin

verilog语言基本程序

1.设计一个产生010*******的序列信号发生器。module generator(out,clk,state); output [3:0]state; output out; input clk; reg [3:0]state; reg out; always@(posedge clk) begin if(state==9) state<=0; else state<=state+1; case(state) 4'b0000:out<=0; 4'b0001:out<=1; 4'b0010:out<=0; 4'b0011:out<=0; 4'b0100:out<=1; 4'b0101:out<=0; 4'b0110:out<=0; 4'b0111:out<=1;

4'b1000:out<=1; 4'b1001:out<=1; default:out<=0; endcase end endmodule 2.设计一个8位的加减计数器。时钟信号为clk,同步清零信号为rst。Clk上升沿时刻,当inc=1计数器加二,其他情况计数器保持不变。 module counter(rst,clk,q,inc,dec); input rst,clk,inc,dec; output [7:0]q; reg [7:0]q; always@(posedge clk) if(rst) q<=0; else case({inc,dec}) 2'b10:begin if(q==254) q<=0;else q<=q+2;end// 2'b01:begin if(q==0) q<=254;else q<=q-2;end// default:q<=q; endcase

Verilog程序解析

module antitwitter (clock,keyin,keyout; input clock,keyin; output keyout; reg [3:0] count; reg keyout; always @(posedge clock begin if ( keyin == 1 begin count <= count +4'h1; if (count <= 8 keyout<= 1'b0; else begin keyout <= keyin; count <= 4'h9; end end else begin

count <= 4'h0; keyout <= 1'b0; end end endmodule module discode38(g1,g2a,g2b,a,b,c,y; input g1,g2a,g2b,a,b,c; output [7:0] y; reg [7:0] y; always @(g1 or g2a or g2b or a or b or c // 当输入信号有变化时,执行块语句begin if ( (g1==1&&(g2a==0&&(g2b==0 // 门控信号满足条件时,输出有效begin case ( {c,b,a} 3'b000 : y <=8'b11111110; 3'b001 : y <=8'b11111101; 3'b010 : y <=8'b11111011; 3'b011 : y <=8'b11110111; 3'b100 : y <=8'b11101111; 3'b101 : y <=8'b11011111;

Verilog语言基础教程

Verilog HDL Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象 设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 =============================== 中文版Verilog HDL简明教程:第1章简介 Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 历史 Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模

ADC0809驱动FPGA实现的verilog程序

/*FPGA实现的程序:(verilog) 贴子回复于:2008-4-27 15:26:01*/ module AD0809(clk500K, //脉宽(至少100ns) rst_n, EOC, //约100us后EOC变为高电平转换结束 START, //启动信号,上升沿有效(至少100ns) OE, //高电平打开三态缓冲器输出转换数据 ALE, //高电平有效,选择信道口 ADDA, //因为ADDB,ADDC都接地了,这里只有ADDA为变量 DATA, //转换数据 DATA_R); output START,OE,ALE,ADDA; input EOC,clk500K,rst_n; input[7:0] DATA; output[7:0] DATA_R; reg START,OE,ALE,ADDA; reg[7:0] DATA_R; reg[4:0] CS,NS; parameter IDLE=5'b00001,START_H=5'b00010,START_L=5'b00100,CHECK_END=5'b01000,GET_DATA=5'b100 00; always @(posedge clk500K) case(CS) IDLE: NS=START_H; START_H: NS=START_L; START_L: NS=CHECK_END; CHECK_END: if(EOC) NS=GET_DATA; else NS=CHECK_END; GET_DATA: NS=IDLE; default: NS=IDLE; endcase always @(posedge clk500K) if(!rst_n) CS<=IDLE;

常见面试笔试题-verilog程序库

加减法 module addsub ( input [7:0] dataa, input [7:0] datab, input add_sub, // if this is 1, add; else subtract input clk, output reg [8:0] result); always @ (posedge clk) begin if (add_sub) result <= dataa + datab; //or "assign {cout,sum}=dataa+datab;" else result <= dataa - datab; end endmodule 四位的全加法器. module add4(cout,sum,a,b,cin) input[3:0]a,b;input cin; output [3:0] sum; output cout; assign {cout,sum}=a+b+cin; endmodule 补码不仅可以执行正值和负值转换,其实补码存在的意义,就是避免计算机去做减法的操作。 1101 -3 补 + 1000 8 01015 假设-3 + 8,只要将-3 转为补码形式,亦即0011 => 1101,然后和8,亦即1000 相加 就会得到5,亦即0101。至于溢出的最高位可以无视掉。 乘法器 module mult(outcome,a,b); parameter SIZE=8; input[SIZE:1] a,b; output reg[2*SIZE:1] outcome; integer i; always @(a or b) begin outcome<=0; for(i=0,i<=SIZE;i=i+1) if(b[i]) outcome<=outcome+(a<<(i-1)); end endmodule 另一种乘法器。在初始化之际,取乘数和被乘数的正负关系,然后取被乘数和乘数的正值。输出结果根据正负关系取得。 else if( Start_Sig ) case( i ) 0: begin

(完整word版)Verilog-A30分钟快速入门教程

?Verilog-A 30分钟快速入门教程 进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS Language Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(out)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(out)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如: @(cross(V(sample) -2.0, +1.0)) //指sample的电压超过2.0时触发该事件,将会执行后面的语句,+1.0表示正向越过,-1.0则相反 ddt( expr ) //求导,如: I(n1,n2) <+ C * ddt(V(n1, n2)); //表示了一个电容 idt( expr ,[ ic [, assert [, abstol ]]] ) //积分,如: V(out) <+ gain * idt(V(in) ,0) + gain * V(in); //比例积分,式中的0表示积分的初值 transition( expr [, time_delay [, rise_time [, fall_time [, time_tol ]]]] ) //将expr的值delay一下并指定上升下降沿时间,相当于一个传输门

相关文档
最新文档