verilog逻辑电路设计实训头歌(怎样做好Verilog HDL语言设计实验)

2026-03-12 05:00:02 0

verilog逻辑电路设计实训头歌(怎样做好Verilog HDL语言设计实验)

大家好,今天小编来为大家解答以下的问题,关于verilog逻辑电路设计实训头歌,怎样做好Verilog HDL语言设计实验这个很多人还不知道,现在让我们一起来看看吧!

本文目录

怎样做好Verilog HDL语言设计实验

计算机系统(PC机)
系统配置的基本需求:
CPU: Intel奔腾系列,或AMD Athlon/XP;
操作系统:Windowns NT/2000/XP;
内存:256M或以上;
显卡:支持256色的8位显卡或以上;
硬盘:20G以上。
Altera:registered: Quartus:registered: II设计软件提供完整的多平台设计环境,它可以轻易满足
特定设计的需要。它是可编程片上系统 (SOPC) 设计的综合性环境。Quartus
II 软件拥有 FPGA 和 CPLD 设计的所有阶段的解决方案。
简单的组合逻辑和时序逻辑的设计
实验目的 1、掌握基本组合逻辑电路的实现方法,掌握连续赋值语句和条件赋值语句的使用方法; 2、掌握基本时序逻辑电路的实现,掌握always语句的使用方法。
简单组合逻辑设计 描述组合逻辑电路通常利用assign连续赋值语句的数据流方式。连续赋值语句将值赋给线网(连续赋值不能为寄存器赋值)。连续赋值语句只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算,如果结果值有变化,新结果就赋给左边的线网。 连续赋值的目标类型如下:1) 标量线网;2) 向量线网;3) 向量的常数型位选择;4) 向量的常数型部分选择;5) 上述类型的任意的拼接运算结果。 组合逻辑设计示例:可综合的数据比较器。它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。描述组合逻辑时常使用assign结构。注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。 模块源代码: //--------------- 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 仿真波形(部分):
简单时序逻辑设计 在Verilog HDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。在可综合的Verilog HDL模型,我们通常使用always块和 @(posedge clk)或 @(negedge clk)的结构来表述时序逻辑。
时序逻辑设计示例: 可综合的1/2分频器模型。
// half_clk.v:
module half_clk(reset,clk_in,clk_out);
input clk_in,reset;
output clk_out;
reg clk_out;
always @(posedge clk_in)
begin
if(!reset) clk_out=0;
else
clk_out=~clk_out;
end
endmodule
在always块中,被赋值的信号都必须定义为reg型,这是由时序逻辑电路的特点所决定的。对于reg型数据,如果未对它进行赋值,仿真工具会认为它是不定态。为了能正确地观察到仿真结果,在可综合风格的模块中我们通常定义一个复位信号reset,当reset为低电平时,对电路中的寄存器进行复位。
仿真波形:
复杂时序逻辑电路的设计
实验目的 1、掌握条件语句if…else在复杂时序逻辑设计中的应用; 2、掌握阻塞赋值与非阻塞赋值的概念和区别,掌握阻塞赋值的使用情况。
条件语句在Verilog HDL中的使用 与常用的高级程序语言一样,为了描述较为复杂的时序关系,Verilog HDL提供了条件语句供分支判断时使用。在可综合风格的Verilog HDL模型中常用的条件语句有if…else和case…endcase两种结构,用法和C程序语言中类似。两者相较,if…else用于不很复杂的分支关系,实际编写可综合风格的模块、特别是用状态机构成的模块时,更常用的是case…endcase风格的代码。 条件语句示例:可综合风格的分频器。它的功能是将10M的时钟分频为500K的时钟。基本原理与1/2分频器是一样的,但是需要定义一个计数器,以便准确获得1/20分频。 模块源代码: // --------------- fdivision.v ----------------------------- module fdivision(RESET,F10M,F500K); input F10M,RESET; output F500K; reg F500K; reg j; always @(posedge F10M) if(!RESET) //低电平复位。 begin F500K = 0; j = 0; end else begin if(j==19) //对计数器进行判断,以确定F500K信号是否反转。 begin j = 0; F500K = ~F500K; end else j = j+1; end endmodule 仿真波形:
设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别 非阻塞赋值语句(=)右端表达式计算完后并不立即赋值给左端,而是同时启动下一条语句继续执行,而阻塞赋值语句(=)在每个右端表达式计算完成后立即赋值给左端变量。非阻塞赋值不能用于assign语句中,而只能用于对寄存器型变量进行赋值,只能在intial和always等过程过程块中。阻塞赋值既能用于assign语句,也能用于intial和always等过程赋值中。对于时序逻辑的描述和建模,应尽量使用非阻塞赋值方式。若在同一个always过程块中描述时序和组合逻辑混合电路时也最好使用非阻塞赋值方式。 在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。实际的时序逻辑设计中,一般的情况下非阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值语句。 可综合设计中阻塞赋值和非阻塞赋值设计要点: 1)非阻塞赋值不能用于assign持续赋值中,一般只出现在initial和always等过程块中,对reg型变量进行赋值; 2)当用always块来描述组合逻辑时,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值; 3)在向函数funtion的返回值赋值时,应使用阻塞赋值;
4)不能在一个以上的always过程块中对同一个变量赋值,这样会引起冲突,在综合时会报错;
5)在一个模块中,严禁对同一个变量既进行阻塞赋值,又进行非阻塞赋值,这样会在综合时报错;
6)对时序逻辑的描述和建模,应尽量使用非阻塞赋值方式,此外,若在同一个always过程块中描述时序和组合逻辑混合电路时,最好使用非阻塞赋值方式。
阻塞赋值与非阻塞赋值示例:分别采用阻塞赋值语句和非阻塞赋值语句的两个看上去非常相似的两个模块blocking.v和non_blocking.v来阐明两者之间的区别。
模块源代码:
// ------------- blocking.v ---------------
module blocking(clk,a,b,c);
output b,c;
input a;
input clk;
reg b,c;
always @(posedge clk)
begin
b = a;
c = b;
$display("Blocking: a = %d, b = %d, c = %d.",a,b,c);
end
endmodule
仿真波形(部分):
//------------- non_blocking.v -------------------
module non_blocking(clk,a,b,c);
output b,c;
input a;
input clk;
reg b,c;
always @(posedge clk)
begin
b = a;
c = b;
$display("Non_Blocking: a = %d, b = %d, c = %d.",a,b,c);
end
endmodule
仿真波形(部分):
函数和任务的应用设计
实验目的 1、掌握函数在模块设计中的使用; 2、掌握任务在结构化Verilog HDL设计中的应用。
函数在模块设计中的使用 函数可以在模块不同位置执行共同代码。函数只能返回一个值,它不能包含任何时延或时序控制(必须立即执行),并且它不能调用其它的任务。 函数必须带有至少一个输入,在函数中允许没有输出或输入输出说明。函数可以调用其它的函数。 函数说明部分可以在模块说明中的任何位置出现,函数的输入是由输入说明指定。如果函数说明部分中没有指定函数取值范围,则其缺省的函数值为1位二进制数。函数定义在函数内部隐式地声明一个寄存器变量,该寄存器变量与函数同名并且取值范围相同。函数通过在函数定义中显式地对该寄存器赋值来返回函数值。对这一寄存器的赋值必须出现在函数定义中。 函数调用是表达式的一部分。与任务相似,函数定义中声明的所有局部寄存器都是静态的,即函数中的局部寄存器在函数的多个调用之间保持它们的值。 下例是函数调用的一个简单示范,采用同步时钟触发运算的执行,每个clk时钟周期都会执行一次运算。并且在测试模块中,通过调用系统任务$display在时钟的下降沿显示每次计算的结果。 模块源代码: module tryfunct(clk,result,reset); output index; begin factorial = operand ? 1 : 0; for(index = 2; index = operand; index = index + 1) factorial = index * factorial; end endfunction endmodule 上例中函数factorial(n)实际上就是阶乘运算。必须提醒大家注意的是,在实际的设计中,我们不希望设计中的运算过于复杂,以免在综合后带来不可预测的后果。经常的情况是,我们把复杂的运算分成几个步骤,分别在不同的时钟周期完成。
任务在结构化设计中的应用 一个任务就像一个过程,它可以从描述的不同位置执行共同的代码段。共同的代码段用任务定义编写成任务,这样它就能够从设计描述的不同位置通过任务调用被调用。任务可以包含时序控制,即时延控制,并且任务也能调用其它任务和函数。 任务可以没有或有一个或多个参数。值通过参数传入和传出任务。除输入参数外(参数从任务中接收值),任务还能带有输出参数(从任务中返回值)和输入输出参数。任务的定义在模块说明部分中编写。 任务调用:  一个任务由任务调用语句调用。任务调用语句给出传入任务的参数值和接收结果的变量值;
 任务调用语句是过程性语句,可以在always 语句或initial 语句中使用;
 任务调用语句中参数列表必须与任务定义中的输入、输出和输入输出参数说明的顺序匹配。此外,参数要按值传递,不能按地址传递;
 任务能够包含定时控制,任务可在被调用后再经过一定时延才返回值;
 任务调用语句是过程性语句,所以任务调用中的输出和输入输出参数必须是寄存器类型的;
 任务可以带有时序控制,或等待特定事件的发生。但是,输出参数的值直到任务退出时才传递给调用参数。
实例应用:利用task和电平敏感的always块设计比较后重组信号的组合逻辑。可以看到,利用task非常方便地实现了数据之间的交换,如果要用函数实现相同的功能是非常复杂的;另外,task也避免了直接用一般语句来描述所引起的不易理解和综合时产生冗余逻辑等问题。
模块源代码:
//----------------- sort4.v ------------------
module sort4(ra,rb,rc,rd,a,b,c,d);
output ra,rb,rc,rd;
input a,b,c,d;
reg ra,rb,rc,rd;
reg va,vb,vc,vd;
always @ (a or b or c or d)
begin
{va,vb,vc,vd}={a,b,c,d};
sort2(va,vc); //va 与vc互换。
sort2(vb,vd); //vb 与vd互换。
sort2(va,vb); //va 与vb互换。
sort2(vc,vd); //vc 与vd互换。
sort2(vb,vc); //vb 与vc互换。
{ra,rb,rc,rd}={va,vb,vc,vd};
end
task sort2;
inout x,y;
reg tmp;
if(xy)
begin
tmp=x; //x与y变量的内容互换,要求顺序执行,所以采用阻塞赋值方式。
x=y;
y=tmp;
end
endtask
endmodule
值得注意的是task中的变量定义与模块中的变量定义不尽相同,它们并不受输入输出类型的限制。如此例,x与y对于task sort2来说虽然是inout型,但实际上它们对应的是always块中变量,都是reg型变量。
仿真波形(部分):
有限状态机(FSM)的设计
实验目的 1、了解FSM的应用范围和两种类型的不同特点; 2、掌握FSM的电路结构和设计要点。
FSM相关概念和设计要点 FSM适合于设计数字系统的控制模块。用Verilog HDL的case/if-else等语句能很好地描述基于状态机的设计。状态机可以认为是组合逻辑和时序逻辑的特殊组合。时序逻辑部分用于存贮状态,组合电路用于状态译码和产生输出信号。状态机的下一个状态不仅与输入信号有关,还与状态寄存器当前所处的状态有关。 状态机分为Mealy和Moore两种类型,前者的输出只是当前状态的函数,也就是状态的转换与输入信号无关,后者的输出则是当前状态和当前输入的函数,即状态的转换与输入信号有关。 状态机的表示方法:状态图、状态表和流程图。 状态机设计要点  一般采用同步时序方式,在时钟信号的触发下完成状态转移;  起始状态是指电路复位后所处的状态,选择一个合理的起始状态将使整个系统简洁、高效,有的综合器会自动为状态机的设计选择一个最佳的起始状态;  状态编码的方式主要有二进制编码、格雷编码和一位热码编码等: • 二进制编码(Binary State Machine):采用普通的二进制数代表每个状态,如4个状态state0/state1/state2/state3对应编码为00/01/10/11。这种编码的缺点是相邻状态的转换有可能有多个比特发生变化(如01-10),瞬变次数多,容易产生毛刺,引起逻辑错误; • 格雷编码(Gray Code State Machine): 4个状态state0/state1/state2/state3对应编码为00/01/11/10即为格雷编码方式。格雷码节省逻辑单元,而且在状态的顺序转换中相邻状态每次只有一个比特发生变化,这样减少了瞬变的次数,也减少了产生毛刺和一些暂态的可能。 • 一位热码编码(One-Hot State Machine Encoding):采用n位来编码具有n个状态的状态机 。如4个状态state0/state1/state2/state3对应编码为1000/0100/0010/0001。采用一位热码编码,虽然多用了触发器,但可以有效节省和简化组合电路。对于寄存器数量多而门逻辑相对缺乏的FPGA来说,采用一位热码编码可以有效地提高电路地速度和可靠性,也有利于提高器件资源的利用率。因此,对于FPGA器件,建议采用这种编码方式。采用这种编码会出现一些多余的状态,即一些无效的状态,需要增加default分支项,以便这些状态下能自动回到起始状态。  状态编码的定义可以用parameter或者`define语句。建议采用前者。尽量采用同步电路设计; `define state0 2’b00 //不要加分号 `define state1 2’b01 …. case (state) `state0: …; //不能少“`” …. 状态转换一般使用case/casex/casez描述。Case语句比if-else语句更清晰明了。此外,case语句的最后不要忘了default分支语句以避免锁存器的产生。
状态机设计实例 功能是检测一个5位二进制序列“10010”。考虑到序列重叠的可能,有限状态机共提供8个状态(包括初始状态IDLE)。 模块源代码: //seqdet.v module seqdet(x,z,clk,rst,state); input x,clk,rst; output z; output state; wire z; parameter IDLE=’d0, A=’d1, B=’d2,C=’d3, D=’d4,E=’d5, F=’d6,G=’d7; assign z = ( state==E x==0 )? 1 : 0; //当x=0时,状态已变为E, //状态为D时,x仍为1。因此 //输出为1的条件为( state==E x==0 )。 always @(posedge clk) if(!rst) begin state = IDLE; end else casex(state) IDLE : if(x==1) begin state = A; end A: if(x==0) begin state = B; end
B: if(x==0)
begin
state = C;
end
else
begin
state = F;
end
C: if(x==1)
begin
state = D;
end
else
begin
state = G;
end
D: if(x==0)
begin
state = E;
end
else
begin
state = A;
end
E: if(x==0)
begin
state = C;
end
else
begin
state = A;
end
F: if(x==1)
begin
state = A;
end
else
begin
state = B;
end
G: if(x==1)
begin
state = F;
end
default:state=IDLE; //缺省状态为初始状态。
endcase
endmodule
仿真波形:
基于模块多层次引用的结构化电路设计
实验目的 1、了解复杂电路与系统的“top-down”设计思想; 2、掌握简单多层次电路的描述方法。
多层次结构电路的设计 复杂数字系统可采用“top-down”的方法进行设计:首先把系统分为几个模块,每个模块在分为几个子模块,依次类推,知道易于实现为止。 这种“top-down”的方法能够把复杂的设计分为许多简单的设计来实现,同时也适合于多人进行合作开发。 多层次结构电路的描述既可以采用文本方式,也可以采用图形和文本混合设计的方式。 被调用模块的指定方式:1)文件复制方式;2)使用`include语句;3)库管理方式。
设计实例分析 这个实例的功能是将并行数据转化为串行数据送交外部电路编码,并将解码后得到的串行数据转化为并行数据交由CPU处理。显而易见,这实际上是两个独立的逻辑功能,分别设计为独立的模块,然后再合并为一个模块显得目的明确、层次清晰。 模块源代码 // ---------------- p_to_s.v --------------------------------- module p_to_s(D_in,T0,data,SEND,ESC,ADD_100); output D_in,T0; // D_in是串行输出,T0是移位时钟并给 // CPU中断,以确定何时给出下个数据。 input ; //给出串行数据。 always @(posedge T0 or negedge ADD_100) //ADD_100下沿置数,T0上沿移位。 begin if(!ADD_100) DATA_Q = data; else begin DATA_Q_buf = DATA_Q1; //DATA_Q_buf作为中介,以令综合器 DATA_Q = DATA_Q_buf; //能辨明。 end end endmodule 仿真波形: 在p_to_s.v中,由于移位运算虽然可综合,但是不是简单的RTL级描述,直接用DATA_Q=DATA_Q1的写法在综合时会令综合器产生误解。另外,在该设计中,由于时钟T0的频率较低,所以没有象以往那样采用低电平置数,而是采用ADD_100的下降沿置数。 //--------------------- s_to_p.v ---------------------------
module s_to_p(T1, data, D_out,DSC,TAKE,ADD_101);
output T1; //给CPU中断,以确定CPU何时取转化
//得到的并行数据。
output data;
input D_out, DSC, TAKE, ADD_101; //D_out提供输入串行数据。DSC、TAKE
//共同决定何时取数。
wire data;
wire T1,clk2;
reg data_latch, data_latch_buf;
assign clk2 = DSC TAKE ; //提供移位时钟。
assign T1 = !clk2;
assign data = (!ADD_101) ? data_latch : 8’bz;
always @(posedge clk2)
begin
data_latch_buf = data_latch 1; //data_latch_buf作缓冲
data_latch = data_latch_buf; //,以令综合器能辩明。
data_latch = D_out;
end
endmodule
仿真波形:
将上面的两个模块合并起来的sys.v的源代码:
//------------------- sys.v ---------------------------
`include "./p_to_s.v"
`include "./s_to_p.v"
module sys(D_in,T0,T1, data, D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101);
input D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101;
inout data;
output D_in,T0,T1;
p_to_s p_to_s(.D_in(D_in),.T0(T0),.data(data),.SEND(SEND),.ESC(ESC),.ADD_100(ADD_100));
s_to_p s_to_p(.T1(T1),.data(data),.D_out(D_out),.DSC(DSC),.TAKE(TAKE),.ADD_101(ADD_101));
endmodule
仿真波形:

如何编写和验证简单的纯组合逻辑模块——《Verilog数字系统设计教程》读书笔记(二)

  每个模块的设计工作包括3个部分:1,电路模块的设计;2,测试模块的设计;3,设计文档的编写和整理。测试模块的设计和文档编写是比电路模块设计更为重要的设计环节,测试是否严密和完整决定了系统设计的成败,设计文档的完整和准确也是系统设计成败的关键,缺少完整的设计说明文件,就不能维持设计工作的连续性,为今后的调试和维护带来困难。组合电路逻辑在数字系统中起着基本组件的作用,也可以说,如果不了解组合逻辑的构成,就不可能对数字逻辑电路系统有任何了解。采用Verilog或VHDL高层次设计方法,也是以基本组合逻辑电路为基础的。如果没有基本组合逻辑电路知识,即使对Verilog 或 VHDL 语法了如指掌,也不可能设计出结构合理的复杂系统。  
  在实现算法时(如卷积运算和快速傅里叶变换),常常会用到加运算。由于多位并行加法器是由多层组合逻辑构成的,加上超前进位形成的逻辑虽然减少了延时,但还是有多级门和布线的延迟,而且随着位数的增加延迟还会积累,这样就使加法器的使用频率受到限制,这里是指计算的节拍(即时钟)必须大于运算电路的延迟,只有在输出稳定后才能输入新的数据进行下一次运算。如果设计的是32位或者是64位的加法器,延迟就会更大。为了加快计算速度,可以在运算的组合逻辑层中加入多个寄存器组来暂存中间结果。也就是采用数字逻辑设计中常用的流水线(pipe-line)办法,来提高运算速度。
  这样设计的加法器在行为仿真时是没有延时的。借助综合器,可以将以上代码自动将其综合成典型的加法器结构。综合器有许多选项可供设计者选择,以便来控制自动生成的电路性能。设计者可以考虑提高电路的速度或者是节省电路元件以减少电路占用硅片的面积。综合器会自动根据你的选项为你挑选一种基本加法器的结构,有的综合器还可以根据用户对运算速度的要求插入流水线结构。  

组合逻辑电路的设计方法

组合逻辑电路的设计:是根据给定的实际逻辑问题,求出实现其逻辑功能的最简单的逻辑电路。

一、组合逻辑电路的设计方法

组合逻辑电路的设计可以按以下步骤进行:

1、分析设计要求,设置输入和输出变量

2、列真值表

3、写出逻辑表达式,并化简

4、画逻辑电路图

二、组合逻辑电路的设计方法的例示:有一火灾报警系统,设有烟感、温感和紫外光感3种类型的火灾探测器。为了防止误报警,只有当其中2种或2种以上类型的探测器发出火灾探测信号时,报警系统才产生报警控制信号。试设计一个产生报警控制信号的电路。

解:令A,B,C分别代表烟感,温感和紫外光感三种火灾探测器发出的控制信号,用1表示发生火灾,用0表示无火灾;令Y代表报警控制信号,用1表示发出火灾报警控制信号,用0表示不发出火灾报警控制信号。

根据以上分析可以列出如表所示的真值表。

由表可以写出逻辑表达式为:

如果作以下变换:Y=AB+AC+BC,则可利用一个与或非门加一个非门实现,其逻辑电路图如图所示:

三、组合逻辑电路的分析:根据给定的逻辑电路图,求出电路的逻辑功能。

组合逻辑电路分析的主要步骤如下:

(1) 用逻辑图写表达式:可以从输入到输出逐级推导,写出电路输出端的逻辑表达式。

(2) 化简表达式:在需要时,用分式化简法或者卡诺图化简法将逻辑表达式化为最简式。

(3) 列真值表:将输入信号所有可能的取值组合代入化简后的逻辑表达式中进行计算,列出真值表。

(4) 描述逻辑功能:根据逻辑表达式和真值表,对电路进行分析,最后确定电路的功能。

verilog中有哪几种方法描述逻辑功能

Verilog HDL 有多中描述风格,具体可以分为:结构描述,数据流描述,行为描述,混合描述。
结构描述是指通过调用逻辑原件,描述它们之间的连接来建立逻辑电路的verilog HDL模型。这里的逻辑元件包括内置逻辑门、自主研发的已有模块、商业IP模块。所以结构描述也分为门级结构描述和模块级结构描述。通过观察是否有功能模块或原语的实例化可以判断是否有结构描述。
数据流描述是指根据信号之间的逻辑关系,采用持续赋值语句描述逻辑电路的方式。通过观察是否使用assign赋值语句可以判断是否有数据流描述。
行为描述是指只注重实现的算法,不关心具体的硬件实现细节。这与C语言编程非常类似。通过观察是否使用initial 或always语句块可以判断是否有行为描述。
混合描述是指以上几种描述方法都存在的一种描述方式。具体在一个工程中,不可能只是用单独哪一种描述方式,一般都是各种描述方式的混合。
逻辑电路的结构描述侧重于表示一个电路由哪些基本元件组成,以及这些基本元件的相互连接关系。逻辑电路的数据流描述侧重于逻辑表达式以及Verilog HDL中运算符的灵活运用。逻辑电路的行为描述侧重于电路的输入输出的因果关系(行为特性),即在何种输入条件下,产生何种输出(进行何种操作),并不关心电路的内部结构。EDA综合工具能自动将行为描述转换成电路结构,形成网表文件。当电路规模较大货时序关系较为复杂时,通常采用行为描述方式进行设计。
在数字电路设计中,寄存器传输级(RTL)描述在很多情况下时钟能够被逻辑综合工具接受的行为级和数据流级的混合描述。因此RTL级描述的目标就是可综合,而行为级描述的目标就是实现特定的功能而没有可综合的限制。并不是所有的行为级描述都可以被综合。同样是for语句,如果循环条件是常数,就是RTL的,如果是变量,就是行为级的。

用verilog设计一个4位4输入最大数值检测电路拜托大神帮下忙

module Maximum_value_detection(baimostlarge,a,b,c,d);

outputMostlarge;

input a b,c,d;

wiresum1,sum2,sum3;

assign sum1=(a>daob)?a:b;

assign sum2=(c>d)?c:d;

assign Mostlarge=(sum1>sum2)?sum1:sum2;

endmodule

module (clk,rstn,n1,n2,n3,n4,max)

input clk,rstn;

input n1;

input n2;

input n3;

input n4;

output max;

reg max12;

reg max34;

扩展资料:

使用Verilog描述硬件的基本设计单元是模块(module)。构建复杂的电子电路,主要是通过模块的相互连接调用来实现的。模块被包含在关键字module、endmodule之内。实际的电路元件。Verilog中的模块类似C语言中的函数,它能够提供输入、输出端口,可以实例调用其他模块,也可以被其他模块实例调用。模块中可以包括组合逻辑部分、过程时序部分。

例如,四选一的多路选择器,就可以用模块进行描述。它具有两个位选输入信号、四个数据输入,一个输出端,在Verilog中可以表示为:

module mux (out, select, in0, in1, in2, in3);

output out;

input select;

input in0, in1, in2, in3;

//具体的寄存器传输级代码

如何用verilog描述组合逻辑电路

以4位二进制A3,A2,A1,A0作为输入变量,输出变量为L3,L2,L1,L0,把4位二进制当作无符号数,列出真值表,如输入 0000 时,输出0000,输入0001时,输出1111,输入0010时,输出1110,……然后写出L3,L2,L1,L0的逻辑式,用卡诺图化简L3,L2,L1,L0的逻辑式,最后画出逻辑图。

电路排队设计的Verilog程序

module traffic(clk,urgency,east_west,south_north,led);
input clk;
input urgency;
output east_west,south_north;
output led;
reg east_west,south_north;
reg led;
initial begin
east_west《=8’b0;
south_north《=8’b0;
led《=6’b100001;end
always @(posedge clk)
begin if(urgency==1) led《=6’b100100;
else if(east_west==8’b0 && south_north==8’b0) begin
east_west《=8’b00101101;
south_north《=8’b00101000;
led《=6’b100001;end
else if(east_west==8’b00000110 && south_north==8’b1) begin
east_west《=8’b00000101;
south_north《=8’b00000101;
led《=6’b100010; end
else if(east_west==8’b1 && south_north==8’b1 && led==1’b1) begin
east_west《=8’b00101000;
south_north《=8’b00101101;
led《=6’b001100; end
else if(east_west==8’b1 && south_north==8’b00000110) begin
east_west《=8’b00000101;
south_north《=8’b00000101;
led《=6’b010100;end
else if(east_west==8’b1 && south_north==8’b1 && led==1’b1) begin
east_west《=8’b00101101;
south_north《=8’b00101000;
led《=6’b100001; end
else if(east_west==4’b0000) begin
east_west《=east_west-8’b111;
south_north《=south_north-1’b1; end
else if(south_north==4’b0000) begin
east_west《=east_west-1’b1;
south_north《=south_north-8’b111; end
else begin
east_west《=east_west-1’b1;
south_north《=south_north-1’b1;
end
end
endmodule
上面是我前一段时间写的交通灯控制器设计代码,相应的英文字母对应相应的信号

Verilog设计流程问题

1. 设计规划阶段(Design Specification)
一个Design Specification的建立有赖于市场人员对所设计芯片的大致功能和成本提出要求,市场人员和工程师互相合作提出芯片的功能
2. 架构与设计划分阶段(Architecture and Design Partition)
拟订开发部门的工程规格(Engineering spec),必须决定系统的架构
3. 编程有测试环境阶段
完成基本的设计和仿真。在初期,设计人员就应该考虑个信号的走线问题!在高速电路和多信号设计中,必须考虑到将产生的串扰(Cross Talk)。
4. 集成和仿真阶段(Integration and Simulation)
l 文件对比验证:预计输出(Expected Value)文件和电路真正的输出结果(Exact Result)的对比。
l 穿越整个CHIP:测试向量(Test Vector)要求能穿越整个CHIP到达外部。
l 合并测试向量:合理的合并测试向量并适度地打散激励(EXCIATION)
l 共享测试环境:在各模块已做整合的前提之下,各模块应该共享测试环境。
l 对模拟器件的处理:需要针对模拟器件做特殊的仿真。
5. 综合阶段(Synthesis)
综合阶段对程序代码的逻辑做部分简化,并从标准单元中选取合适的单元组合成最佳的实际电路。而这个原则就是约束(CONSTRAINT FILE),这个文件决定了最后CHIP的SIZE和功能的实现。基本上综合就是Timing与Area之间求得一个平衡。
这个时候最好完成功耗分析(POWER ANALYSIS)
6. 布局前仿真
待测对象:由逻辑门(GATE-LEVEL)所组成的网表文件(NETLIST)。这个阶段的仿真结果必须和INTEGRATION AND SIMULAION阶段一致。
特点:这个阶段仿真时间一般比较长,利用操作系统所提供的工具程序来做自动化的批处理就显得重要,例如UNIX提供的MAKE等工具程序
7. 布局与布线阶段(AUTO PLACEMENT AND ROUTE ,AP&R)
利用netlist和SYNTHESIS产生的CONSTRAINT FILE文件
目的:将实体的单元(CELL)组合成芯片上真正的电路。
l FloorPlan:决定管脚的排列和IP,MACRO等在IC内部摆放的位置。
l Placement:布局,将元件摆到适当的位置。何谓合适的位置,就要根据具体电路的功能,工程师的经验和不断地对结果的分析了。
l CTS(Clock Tree Synthesis):将时序器件所需要的时钟所需要的缓冲器放在合适的位置,避免产生CLOCK SKEW。
l ROUTE:将各元件(包括时钟缓冲器)正确地走线。
l SDF(Standard Delay Format):此文件的目的在于描述确切地元件及布线时间延迟,以作为前端设计者再仿真的延迟计算,或作为静态时序分析之用。这些Timing 数值的前提是必须将线路的负载的R,C值提取出来。
8. 布局后仿真/静态时序分析/形式验证阶段(Post-Sim/STA/Formal Verification)
l Post-sim: 和前仿真必须的结果必须完全相同,但是因为有了更精确的TIMING数据,所以花费更大量的时间
l STA:仿真本身可分为动态和静态
动态性:从仿真的起始至结束有许多个时间(EVENT)发生来校验其功能。耗时长
静态时序分析:它并不管其待分析电路的功能如何,只要给定Constraint,静态时序分析就会分析电路结构,检查所有时序上不满足的地方。
l Formal Verification:?
9.DRC/LVS检查阶段
DRC(Design Rule Check):针对最后的LAYOUT结果做检查,以校验其是否违反元件本身的性能限制。
LVS(Layout VS Schematics):针对电路图和LAYOUT图做一致性验证。
10.Design sign-off阶段
即掩膜生产之用,就是一般所称的Tape-Out.
11.手动修正(Engineering Change Order,ECO)
如果最后阶段发现了BUG,如果不大的话,那么如果从头改起将十分耗时,比较经济的做法是以手动的方式对电路进行修改,或者对布局修改。
因为手动修改非常容易出错,所以需要非常深厚的基本电路知识和经验!
如果已经TAPE-OUT才发现设计上的错误,则最后的补救只能在金属层的掩膜上修改

组合逻辑电路设计步骤

组合逻辑电路设计步骤如下:

组合逻辑电路设计:从给定的逻辑要求出发,求出最简逻辑电路图。

一、组合逻辑电路设计的一般步骤

在数字电路中,根据逻辑功能的不同,我们可以将数字电路分成两大类,一类叫做组合逻辑电路、另一类叫做时序逻辑电路。本次主要讲解组合逻辑电路的原理、应用和Verilog实现。

二、组合逻辑电路特征:

(1)特定逻辑问题对应的真值表是唯一的;

(2)特定逻辑问题对应的逻辑表达式和逻辑电路可能由多种实现形式;

(3)设计原则是采用最简逻辑函数表达式,可得最简逻辑电路图;

(4)如果由于某些原因无法获得某些门电路,可以通过变换逻辑表达式来改变电路,从而能够使用已有的器件。

组合逻辑电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。而时序逻辑电路在逻辑功能上的特点是任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关。

分析组合逻辑电路是根据给定的组合电路逻辑图,分析出其逻辑功能。首先要根据逻辑功能建立真值表,通过真值表写出逻辑函数表达式,再进行表达式化简,再根据化简后的函数表达式画出逻辑电路图。

但这样做,却往往会花费不少时间在化简上。利用无关项,无关项,指所对应的变量取值并不会出现在实际情况中的项。一般情况下,因为缺少定义,这些变量的值对应的输出无论是0还是1,都是合法的。利用无关项取变量不仅可以节省时间,而且有可能更优设计。

在verilog设计中,给时序逻辑电路清零,有哪两种方法,如何实现

verilog可以利用同步复位和异步复位来给时序逻辑电路清零,同步复位是需要有时钟,在时钟沿来的时候检测复位信号的值,如果复位信号有效,则对电路清零。异步复位比较简单,复位信号直接连到d触发器的复位端,一旦复位信号有效就对电路清零。

OK,关于verilog逻辑电路设计实训头歌和怎样做好Verilog HDL语言设计实验的内容到此结束了,希望对大家有所帮助。

verilog逻辑电路设计实训头歌(怎样做好Verilog HDL语言设计实验)

本文编辑:admin

更多文章:


setint(PreparedStatement setString与setInt效果是否一样)

setint(PreparedStatement setString与setInt效果是否一样)

大家好,今天小编来为大家解答以下的问题,关于setint,PreparedStatement setString与setInt效果是否一样这个很多人还不知道,现在让我们一起来看看吧!本文目录PreparedStatement setStri

2026年7月20日 22:15

spring用英语怎么说(spring怎么读英语 spring英文解释)

spring用英语怎么说(spring怎么读英语 spring英文解释)

本篇文章给大家谈谈spring用英语怎么说,以及spring怎么读英语 spring英文解释对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录

2026年2月23日 15:30

throwstones怎么读(stones怎么读)

throwstones怎么读(stones怎么读)

今天给各位分享stones怎么读的知识,其中也会对stones怎么读进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录stones怎么读石头英文怎么念石用英文怎么读Don’t throw stonesstones

2025年6月18日 11:45

hash是什么(hash算法是什么呢)

hash是什么(hash算法是什么呢)

大家好,关于hash是什么很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于hash算法是什么呢的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录hash算

2026年9月17日 16:30

eclipse怎么安装汉化包(eclipse怎么安装)

eclipse怎么安装汉化包(eclipse怎么安装)

大家好,eclipse怎么安装汉化包相信很多的网友都不是很明白,包括eclipse怎么安装也是一样,不过没有关系,接下来就来为大家分享关于eclipse怎么安装汉化包和eclipse怎么安装的一些知识点,大家可以关注收藏,免得下次来找不到哦

2025年9月8日 00:45

j2ee三层架构(基于J2EE的WEB开发中如何分层)

j2ee三层架构(基于J2EE的WEB开发中如何分层)

大家好,今天小编来为大家解答以下的问题,关于j2ee三层架构,基于J2EE的WEB开发中如何分层这个很多人还不知道,现在让我们一起来看看吧!本文目录基于J2EE的WEB开发中如何分层请问软件三层架构是如何架构的,用什么工具开发J2EE开发中

2026年7月8日 23:00

property prices(spillover effect是什么意思)

property prices(spillover effect是什么意思)

“property prices”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看property prices(spillover effect是什么意思)!本文目录spillover effect是什么意思harden是什

2026年9月23日 18:00

免费主题大全(vivo免费全局主题名字)

免费主题大全(vivo免费全局主题名字)

大家好,今天小编来为大家解答以下的问题,关于免费主题大全,vivo免费全局主题名字这个很多人还不知道,现在让我们一起来看看吧!本文目录vivo免费全局主题名字oppo免费全局主题有哪些全部免费的主题壁纸软件是什么主题软件免费主题有哪些viv

2025年9月15日 20:15

c语言求二维数组最大值(C语言求出二维数组中的最大元素值)

c语言求二维数组最大值(C语言求出二维数组中的最大元素值)

大家好,今天小编来为大家解答以下的问题,关于c语言求二维数组最大值,C语言求出二维数组中的最大元素值这个很多人还不知道,现在让我们一起来看看吧!本文目录C语言求出二维数组中的最大元素值c语言编程:找出二维数组中的最大值最小值及其所在行号列号

2026年8月10日 01:15

update的过去式和过去分词(Update翻译成汉语是什么意思)

update的过去式和过去分词(Update翻译成汉语是什么意思)

“update的过去式和过去分词”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看update的过去式和过去分词(Update翻译成汉语是什么意思)!本文目录Update翻译成汉语是什么意思update英文怎么读windows

2025年8月29日 13:00

jquery在哪里写(如何写一个jquery 插件)

jquery在哪里写(如何写一个jquery 插件)

本篇文章给大家谈谈jquery在哪里写,以及如何写一个jquery 插件对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录如何写一个jquer

2026年4月30日 06:45

学生eclipse安装教程(哪位大神可以手把手教我怎么在eclipse中安装PHP啊,我是学生,刚刚开始学习,不会装呀..)

学生eclipse安装教程(哪位大神可以手把手教我怎么在eclipse中安装PHP啊,我是学生,刚刚开始学习,不会装呀..)

今天给各位分享哪位大神可以手把手教我怎么在eclipse中安装PHP啊,我是学生,刚刚开始学习,不会装呀..的知识,其中也会对哪位大神可以手把手教我怎么在eclipse中安装PHP啊,我是学生,刚刚开始学习,不会装呀..进行解释,如果能碰巧

2026年7月2日 16:30

进制转换器代码(C语言,使用数组,编写一个十进制正整数转换为二进制数的转换工具)

进制转换器代码(C语言,使用数组,编写一个十进制正整数转换为二进制数的转换工具)

本篇文章给大家谈谈进制转换器代码,以及C语言,使用数组,编写一个十进制正整数转换为二进制数的转换工具对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录C语言,使用数组,编写一个十进制正整数转换为二进制数的转换工具求c++各进制转

2025年10月4日 05:30

idea写的代码eclipse能用吗(怎么把Intelij IDEA的工程变为Eclipse工程,希望有人解答)

idea写的代码eclipse能用吗(怎么把Intelij IDEA的工程变为Eclipse工程,希望有人解答)

本篇文章给大家谈谈idea写的代码eclipse能用吗,以及怎么把Intelij IDEA的工程变为Eclipse工程,希望有人解答对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决

2025年6月9日 15:00

values英文(价值观的英语定义有谁知道麻烦告之谢谢)

values英文(价值观的英语定义有谁知道麻烦告之谢谢)

大家好,今天小编来为大家解答以下的问题,关于values英文,价值观的英语定义有谁知道麻烦告之谢谢这个很多人还不知道,现在让我们一起来看看吧!本文目录价值观的英语定义有谁知道麻烦告之谢谢三观用英文怎么说我个人想了个views英文翻译一道题谢

2026年6月5日 17:15

关系数据库系统的特点(数据库关系模型的主要特点是什么)

关系数据库系统的特点(数据库关系模型的主要特点是什么)

“关系数据库系统的特点”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看关系数据库系统的特点(数据库关系模型的主要特点是什么)!本文目录数据库关系模型的主要特点是什么关系数据库系统的主要特点是什么关系数据库系统的特点是什么数据

2026年3月22日 03:00

易语言源代码及模块大全1500(求一个小工具的易语言源代码 悬赏100分)

易语言源代码及模块大全1500(求一个小工具的易语言源代码 悬赏100分)

其实易语言源代码及模块大全1500的问题并不复杂,但是又很多的朋友都不太了解求一个小工具的易语言源代码 悬赏100分,因此呢,今天小编就来为大家分享易语言源代码及模块大全1500的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分

2026年1月17日 23:15

plsql打开多个窗口列表(plsql多窗口切换)

plsql打开多个窗口列表(plsql多窗口切换)

各位老铁们,大家好,今天由我来为大家分享plsql打开多个窗口列表,以及plsql多窗口切换的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录plsq

2026年8月7日 14:00

mmap的实现原理(Android跨进程通信-mmap函数)

mmap的实现原理(Android跨进程通信-mmap函数)

大家好,mmap的实现原理相信很多的网友都不是很明白,包括Android跨进程通信-mmap函数也是一样,不过没有关系,接下来就来为大家分享关于mmap的实现原理和Android跨进程通信-mmap函数的一些知识点,大家可以关注收藏,免得下

2026年5月3日 00:15

stunted(t,u,s,t,e,n,d能组成什么单词)

stunted(t,u,s,t,e,n,d能组成什么单词)

今天给各位分享t,u,s,t,e,n,d能组成什么单词的知识,其中也会对t,u,s,t,e,n,d能组成什么单词进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录t,u,s,t,e,n,d能组成什么单词stunt

2025年12月15日 05:00

近期文章

char ch用法(c语言char ch)
2026-09-24 18:45:02
本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索