Verilog程序解析
- 格式:doc
- 大小:45.00 KB
- 文档页数:32
Verilog中的⼀些语法和技巧1、.2、.3、Reg型的数据类型默认初始值为X。
reg型数据可以赋正值也可以赋负值,但是当⼀个reg型数据是⼀个表达式的操作数的时候,他的值被当做⽆符号数及正值。
4、在数据类型中?和Z均表⽰⾼阻态。
5、Reg型只表⽰被定义的信号将⽤在“always”模块内,并不是说reg型⼀定是寄存器或触发器的输出。
虽然reg型信号常常是寄存器或触发器的输出但是并不⼀定总是这样。
6、Verilog语⾔中没有多维数组的存在。
Memory型数据类型是通过扩展reg型数据的弟⼦和范围来⽣成的。
其格式如下reg[n-1:0]存储器名[m-1:0];7、在除法和取余的运算中结果的符号和第⼀个操作数的符号位是相同的。
8、不同长度的数据进⾏运算:两个长度不同的数据进⾏位运算时,系统会⾃动地将两者按有端对齐,位数少的操作数会在相应的⾼位⽤0填满以便连个操作数安慰进⾏操作。
9、= = =与!= = =和= =与!= =的区别:后者称为逻辑等是运算符,其结果是2个操作数的值决定的。
由于操作书中某些位可能不定值x和⾼阻态z结果可能是不定值x。
⽽ = = =和!= = =运算符对操作数的⽐较时对某些位的⾼阻态z和不定值x也进⾏⽐较,两个操作数必须完全⼀致,其结果才是1,否则是0.10、⾮阻塞和阻塞赋值⽅式:⾮阻塞赋值⽅式(如a<=b)上⾯语句所赋得变量值不能⽴即被下⾯语句所⽤,(2)快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常⽤的赋值⽅法。
阻塞赋值(如a=b)赋值语句执⾏完后,块才结束 2 b的值在赋值语句完成后⽴即执⾏ 3在时序逻辑使⽤中,可能产⽣意想不到的结果。
11、模块的描述⽅式:(RTL为寄存器传输级描述)“(1)数据流描述⽅式:数据流⾏描述主要⽤来描述组合功能,具体⽤“assign”连续赋值语句来实现。
分为两种a、显式连续赋值语句;连线型变量类型[连线型变量为快]连线型变量名Assign #(延时量)连线型变量名=赋值表达式;显式连续赋值语句包含了两条语句;第⼀条是对连线型变量的进⾏类型说明的说明语句;第⼆句是对这个已得到声明的连线型变量进⾏连续赋值语句。
verilog教程Verilog是一种硬件描述语言(HDL),用于描述数字系统的行为和结构。
它是一种流行的HDL,广泛用于硬件设计和验证领域。
本教程将介绍Verilog的基本概念和语法,以帮助初学者入门。
一、Verilog的基本概念1.1 什么是VerilogVerilog是一种描述数字系统的语言,它可以用来描述硬件电路、验证设计的正确性以及进行电路仿真。
1.2 Verilog的应用领域Verilog广泛应用于硬件设计和验证领域,包括用于开发ASIC(应用特定集成电路)、FPGA(现场可编程门阵列)以及其他数字系统的设计。
1.3 Verilog的版本Verilog有多个版本,包括Verilog-1995、Verilog-2001以及最新的Verilog-2005、这些版本之间有一些语法和功能上的差异。
二、Verilog的语法结构2.1模块和端口在Verilog中,所有的电路描述都是由模块(module)组成的。
模块是电路的基本组成单元,可以看作是一个黑盒子,它接受一些输入,产生一些输出。
2.2信号声明在Verilog中,我们需要声明所有的输入和输出信号。
可以使用`input`和`output`关键字来声明这些信号。
2.3电路实现Verilog允许使用多种语句和结构来描述电路的行为和结构。
这些语句包括顺序语句、条件语句、循环语句以及层次结构。
2.4实例化模块在一个模块中,我们可以实例化其他的模块。
这样可以将一个大的电路拆分成多个小的模块,方便编写和测试。
三、Verilog的仿真和验证3.1静态验证Verilog语言本身提供了很多语法和语义层面的验证功能,对于语法和类型错误会有相应的提示。
3.2激励设计在进行电路验证时,我们需要为输入信号提供激励。
Verilog提供了一种称为`testbench`的特殊模块,用于生成输入信号并将其应用到待验证的电路中。
3.3波形仿真在Verilog中,我们可以使用仿真器来模拟电路的行为,并生成波形图来验证电路是否按预期工作。
verilog hdl语言100例详解Verilog HDL语言是一种硬件描述语言,用于描述数字电路和系统的行为和结构。
它是硬件设计工程师在数字电路设计中的重要工具。
本文将介绍100个例子,详细解释Verilog HDL语言的应用。
1. 基本门电路:Verilog HDL可以用于描述基本门电路,如与门、或门、非门等。
例如,下面是一个描述与门电路的Verilog HDL代码:```verilogmodule and_gate(input a, input b, output y);assign y = a & b;endmodule```2. 多路选择器:Verilog HDL也可以用于描述多路选择器。
例如,下面是一个描述2:1多路选择器的Verilog HDL代码:```verilogmodule mux_2to1(input a, input b, input sel, output y);assign y = sel ? b : a;endmodule```3. 寄存器:Verilog HDL可以用于描述寄存器。
例如,下面是一个描述8位寄存器的Verilog HDL代码:```verilogmodule register_8bit(input [7:0] d, input clk, input reset, output reg [7:0] q);always @(posedge clk or posedge reset)if (reset)q <= 0;elseq <= d;endmodule```4. 计数器:Verilog HDL可以用于描述计数器。
例如,下面是一个描述8位计数器的Verilog HDL代码:```verilogmodule counter_8bit(input clk, input reset, output reg [7:0] count);always @(posedge clk or posedge reset)if (reset)count <= 0;elsecount <= count + 1;endmodule```5. 加法器:Verilog HDL可以用于描述加法器。
Verilog程序运行原理详解1. 引言Verilog是一种硬件描述语言,用于描述和设计数字电路。
在Verilog程序中,我们可以通过编写逻辑门等硬件元件的描述来实现电路的功能。
Verilog程序的运行原理涉及到编译、仿真和综合等多个步骤。
本文将详细解释这些步骤的基本原理,并对Verilog程序的运行过程进行全面、详细、完整和深入的探讨。
2. 编译编译是将Verilog程序翻译成计算机可以理解和执行的指令的过程。
Verilog程序通常包含模块定义、端口声明、信号声明、逻辑描述等部分。
2.1 模块定义在Verilog程序中,模块是描述电路功能的基本单元。
模块定义由关键字module 开始,后面跟着模块的名称和端口定义。
例如:module my_module(input A, input B, output C);// 逻辑描述endmodule2.2 端口声明模块的端口声明定义了输入和输出信号的名称和类型。
输入信号使用关键字input 声明,输出信号使用关键字output声明。
例如:module my_module(input A, input B, output C);// 逻辑描述endmodule2.3 信号声明信号声明定义了在模块中使用的内部信号的名称和类型。
信号可以是输入信号、输出信号或内部信号。
例如:module my_module(input A, input B, output C);wire D;// 逻辑描述endmodule2.4 逻辑描述逻辑描述部分包含了对电路功能的具体描述,通常使用逻辑门和时序元件的描述来实现。
例如:module my_module(input A, input B, output C);wire D;assign D = A & B;assign C = D;endmodule在编译过程中,编译器将对Verilog程序进行语法分析、词法分析和语义分析,生成对应的语法树和符号表。
verilog hdl应用程序设计实例精讲网上现在有很多关于verilog hdl应用程序设计的资料,但是并没有一个很系统和全面的教程来帮助初学者快速入门。
本文就verilog hdl应用程序设计实例进行了精讲,从基本概念到应用实例一步一步地回答了初学者的问题,帮助大家理解verilog hdl的设计和应用。
一、verilog hdl的基本概念Verilog HDL是一种硬件描述语言,用于描述数字系统,包括逻辑电路、集成电路等等。
它既可以进行仿真验证,也可以直接生成硬件电路。
简单来说,verilog hdl就是一种用来描述数字系统的语言。
1.1 模块与实例化在verilog hdl中,模块是最基本的设计单元,每个模块包含一个或多个端口和内部逻辑电路。
模块可以包含其他模块,这被称为实例化。
实例化可以理解为创建一个模块的实例,并根据实例进行连接。
1.2 端口和内部信号模块的端口是与其他模块或外部电路连接的接口,可以是输入、输出或双向。
内部信号是模块内部产生和使用的信号,只在模块内部可见。
1.3 组合逻辑与时序逻辑组合逻辑是指只有输入信号改变时才会改变输出信号的逻辑电路,而时序逻辑是指输出信号的改变还受到时钟信号的控制。
在verilog hdl中,可以使用逻辑门、逻辑运算符和条件语句来实现组合逻辑和时序逻辑。
二、verilog hdl应用程序设计实例接下来,我们通过一些实例来展示verilog hdl的应用程序设计。
2.1 4位全加器我们首先来实现一个4位全加器。
全加器是用来实现两个二进制数的加法的电路,它能够实现两个输入和一个进位的相加操作,输出结果和进位。
在verilog hdl 中,可以使用逻辑运算符和条件语句来实现全加器。
2.2 4位加法器我们可以使用四个全加器来实现一个4位加法器。
加法器是用来实现两个二进制数的加法的电路,它能够实现多位的相加操作,输出结果和进位。
2.3 4位计数器计数器是一种能够实现计数功能的电路,它能够根据时钟信号进行计数,并在达到一定数值时输出特定信号。
Python解析Verilog代码一、引言Verilog是一种硬件描述语言(Hardware Description Language, HDL),用于描述数字电路。
Verilog代码通常用于设计和验证集成电路和数字系统。
然而,对于较大的设计,手动分析Verilog代码变得非常困难。
许多工程师和研究人员倾向于使用自动化工具,如Python 解析Verilog代码,以提高效率和准确性。
二、Python解析Verilog代码的需求1. Verilog代码的结构复杂。
Verilog代码通常包含模块、端口、连接、内部信号、时序逻辑等,需要一个高效且灵活的工具来处理。
2. 需要快速获取和分析Verilog代码中的特定信息,如模块层次结构、信号连接、时序约束等。
3. 需要进行Verilog代码的静态分析,以检查语法错误、逻辑错误、仿真问题等。
4. 需要将Verilog代码转换为其他格式,如图形表示、仿真模型等。
三、Python解析Verilog代码的实现1. 使用工具库:Python拥有丰富的工具库,如ply、pyverilog等,可以用于解析Verilog代码的词法分析、语法分析、抽象语法树构建等。
2. 定义数据结构:在Python中定义适当的数据结构,如模块类、端口类、信号类等,以便于存储和处理Verilog代码中的各种信息。
3. 编写解析器:利用工具库和数据结构,编写Verilog代码的解析器程序,实现对Verilog代码的快速、准确解析和分析。
四、Python解析Verilog代码的应用1. 设计验证:通过Python解析Verilog代码,可以快速获取Verilog 代码中的模块和信号等信息,用于设计验证和仿真。
2. 时序分析:Python解析Verilog代码可以帮助工程师进行时序分析,包括时序约束的提取和分析,路径延迟的计算和优化等。
3. 自动化生成:利用Python解析Verilog代码,可以自动化生成Verilog代码的图形表示、仿真模型、文档等,提高工作效率和质量。
3-8 译码器module decoder_38(out,in);output[7:0] out;input[2:0] in;reg[7:0] out;always @(in)begincase(in)3'd0: out=8'b11111110;3'd1: out=8'b11111101;3'd2: out=8'b11111011;3'd3: out=8'b11110111;3'd4: out=8'b11101111;3'd5: out=8'b11011111;3'd6: out=8'b10111111;3'd7: out=8'b01111111;endcaseendendmodule3-8优先编码器module encoder8_3(none_on,outcode,a,b,c,d,e,f,g,h); output none_on;output[2:0] outcode;input a,b,c,d,e,f,g,h;reg[3:0] outtemp;assign {none_on,outcode}=outtemp;always @(a or b or c or d or e or f or g or h)beginif(h) outtemp=4'b0111;else if(g) outtemp=4'b0110;else if(f) outtemp=4'b0101;else if(e) outtemp=4'b0100;else if(d) outtemp=4'b0011;else if(c) outtemp=4'b0010;else if(b) outtemp=4'b0001;else if(a) outtemp=4'b0000;else outtemp=4'b1000;end基本D触发器endmodulemodule DFF(Q,D,CLK);output Q;input D,CLK;reg Q;always @(posedge CLK)beginQ <= D;end带异步清0、异步置1 的D 触发器endmodulemodule DFF1(q,qn,d,clk,set,reset);input d,clk,set,reset;output q,qn;reg q,qn;always @(posedge clk or negedge set or negedge reset) beginif (!reset) beginq <= 0; //异步清0,低电平有效qn <= 1;endelse if (!set) beginq <= 1; //异步置1,低电平有效qn <= 0;endelse beginq <= d;qn <= ~d;endendmodule4 位串并转换器module serial_pal(clk,reset,en,in,out);input clk,reset,en,in;output[3:0] out;reg[3:0] out;always @(posedge clk)beginif(reset) out<=4'h0;else if(en) out<={out,in}; //使用连接运算符endendmodule用for 语句描述的七人投票表决器module voter7(pass,vote);output pass;input[6:0] vote;reg[2:0] sum;integer i;reg pass;always @(vote)beginsum=0;for(i=0;i<=6;i=i+1) //for 语句if(vote[i]) sum=sum+1;if(sum[2]) pass=1; //若超过4 人赞成,则pass=1else pass=0;endendmodule模为60 的BCD 码加法计数器module count60(qout,cout,data,load,cin,reset,clk); output[7:0] qout;output cout;input[7:0] data;input load,cin,clk,reset;reg[7:0] qout;always @(posedge clk) //clk 上升沿时刻计数beginif (reset) qout<=0; //同步复位else if(load) qout<=data; //同步置数else if(cin)beginif(qout[3:0]==9) //低位是否为9,是则beginqout[3:0]<=0; //回0,并判断高位是否为5if (qout[7:4]==5) qout[7:4]<=0;elseqout[7:4]<=qout[7:4]+1; //高位不为5,则加1endelse //低位不为9,则加1qout[3:0]<=qout[3:0]+1;endendassign cout=((qout==8'h59)&cin)?1:0; //产生进位输出信号endmoduleCase实现的4选1数据选择器module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input[1:0] sel;reg out;always @(in0 or in1 or in2 or in3 or sel) //敏感信号列表case(sel)2'b00: out=in0;2'b01: out=in1;2'b10: out=in2;2'b11: out=in3;default: out=2'bx;endcaseEndmodule8位计数器module counter8 ( out,cout,data,load, cin,clk );output [7:0] out;output cout;input [7:0] data;input load, cin,clk ;reg[7:0] out;always @(posedge clk)beginif(load)out <= data; // 同步预置数据elseout < = out + 1 + cin; // 加1计数endassign cout = &out & cin; //若out为8‘hFF,cin为1,则cout为1 Endmodule比较器module compare(equal, a, b);input [1:0] a, b;output equal;assign equal =(a= =b)? 1:0;endmodule4位二进制加减计数器module counter(rst, clk, q , m);input rst, clk,m;output [3:0] q;reg [3:0] q;always @( posedge clk)if (!rst)q<=0;else if(m==0)if (q==15) q<=0; else q<=q+1;else if(m==1)if (q==0) q<=15; else q<=q-1;endmodule4位BCD码加减计数器module counter(rst, clk, q , m);input rst, clk,m;output [3:0] q;reg [3:0] q;always @( posedge clk)if (!rst)q<=0;else if(m==0)if (q==9) q<=0; else q<=q+1; else if(m==1)if (q==0) q<=9; else q<=q-1; endmodule。
verilog fopen fwrite 程序
下面是一个以Verilog编写的程序示例,用于打开一个文件并
将一些数据写入该文件。
```verilog
module file_write;
reg [7:0] data;
integer fileHandle;
initial begin
$fopen(fileHandle, "output.txt", "w");
if (fileHandle != 0) begin
data = 8'b01100110; // 数据为102
$fwrite(fileHandle, "%d\n", data);
$fclose(fileHandle);
end
end
endmodule
```
这个Verilog程序会打开一个名为"output.txt"的文件,使用"w"
模式(即写入模式)。
如果文件成功打开(文件句柄不为0),则将数据102以十进制的格式写入文件中。
最后,文件会被关闭。
请注意,Verilog是一种硬件描述语言,其主要用途是描述硬
件电路功能。
因此,文件操作通常不是在Verilog代码中执行
的常见任务。
这个示例仅用于演示如何在Verilog中使用$fopen和$fwrite函数,它们通常用于仿真和调试目的。
如果您需要在FPGA或ASIC设计中进行文件操作,请参考相应的硬件描述语言或集成开发环境的文档和工具。
verilog知识点总结Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统,它广泛应用于数字系统设计和仿真领域。
本文将总结一些Verilog 的重要知识点,以帮助读者更好地理解和应用Verilog。
一、Verilog的基本语法Verilog的基本语法包括模块声明、端口声明、信号声明、数据类型、运算符等。
Verilog中的模块是设计的基本单元,模块声明包括模块名和端口声明。
端口可以是输入、输出或双向的。
信号声明用于定义内部信号,可以是寄存器或线网类型。
Verilog支持多种数据类型,包括整数、浮点数、向量、数组等。
Verilog还提供了丰富的运算符,包括算术运算符、逻辑运算符、位运算符等。
二、组合逻辑电路描述Verilog可以用来描述各种组合逻辑电路,如与门、或门、非门等。
通过使用逻辑运算符和条件语句,可以很方便地描述组合逻辑电路的功能。
Verilog还提供了多种语法结构,如if语句、case语句等,用于描述复杂的逻辑功能。
三、时序逻辑电路描述时序逻辑电路是一种带有状态的电路,Verilog可以用来描述各种时序逻辑电路,如触发器、计数器、状态机等。
通过使用时钟信号和触发器,可以实现电路的时序行为。
Verilog提供了多种触发器类型,如D触发器、JK触发器、T触发器等,可以根据实际需求选择合适的触发器类型。
四、模块实例化和层次化设计Verilog支持模块的实例化和层次化设计,可以将一个模块实例化为另一个模块的一部分。
通过模块实例化,可以方便地实现模块的复用和层次化设计。
层次化设计可以使整个系统更加清晰和模块化,方便调试和维护。
五、仿真和验证Verilog可以用于对设计进行仿真和验证,以确保设计的正确性。
Verilog提供了仿真器,可以对设计进行时序仿真和波形查看。
通过仿真,可以验证设计的功能和时序行为是否符合要求。
Verilog 还支持测试向量的生成和自动验证,可以自动生成测试向量并进行自动验证。
verilog-32位浮点加法器程序及代码解释module flowadd(ix, iy, clk, a_en, ost,oz);input ix, iy, clk, a_en;output oz, ost;wire[31:0] ix,iy;reg[31:0] oz;wire clk,ost,a_en;reg[25:0] xm, ym, zm;reg[7:0] xe, ye, ze;reg[2:0] state;parameter start=3'b000,zerock=3'b001,exequal=3'b010,addm=3'b011,infifl=3'b100,over =3'b110; assign ost = (state == over) ? 1 : 0; /*后端处理,输出浮点数*/always@(posedge ost)beginif(a_en)oz <= {zm[25],ze[7:0],zm[22:0]};endalways@(posedge clk) //状态机begincase(state)start: //前端处理,分离尾数和指数,同时还原尾数beginxe <= ix[30:23];xm <= {ix[31],1'b0,1'b1,ix[22:0]};ye <= iy[30:23];ym <= {iy[31],1'b0,1'b1,iy[22:0]};state <= zerock;endzerock:beginif(ix == 0)begin{ze, zm} <= {ye, ym};state <= over;endelseif(iy == 0)begin{ze, zm} <= {xe, xm};state <= over;endelsestate <= exequal;endexequal: //指数处理,使得指数相等beginif(xe == ye)state <= addm;elseif(xe > ye)beginye <= ye + 1;ym[24:0] <= {1'b0, ym[24:1]};if(ym == 0)beginzm <= xm;ze <= xe;state <= over;endelsestate <= exequal;endelsebeginxe <= xe + 1;xm[24:0] <= {1'b0,xm[24:1]};if(xm == 0)beginzm <= ym;ze <= ye;state <= over;endelsestate <= exequal;endendaddm: //带符号位和保留进位的尾数相加beginif ((xm[25]^ym[25])==0)beginzm[25] <= xm[25];zm[24:0] <= xm[24:0]+ym[24:0];endelseif(xm[24:0]>ym[24:0])beginzm[25] <= xm[25];zm[24:0] <=xm[24:0]-ym[24:0];endelsebeginzm[25] <= ym[25];zm[24:0] <=ym[24:0]-xm[24:0];endze <= xe;state <= infifl;endinfifl: //尾数规格化处理beginif(zm[24]==1)beginzm[24:0] <= {1'b0,zm[24:1]};ze <= ze + 1;state <= over;endelseif(zm[23]==0)beginzm[24:0] <= {zm[23:0],1'b0};ze <= ze - 1;state <= infifl;endelsestate <= over;endover:beginstate<= start;enddefault:beginstate<= start; end endcase end endmodule。
module antitwitter (clock,keyin,keyout; input clock,keyin;output keyout;reg [3:0] count;reg keyout;always @(posedge clockbeginif ( keyin == 1begincount <= count +4'h1;if (count <= 8 keyout<= 1'b0;elsebeginkeyout <= keyin;count <= 4'h9;endendelsebegincount <= 4'h0;keyout <= 1'b0;endendendmodulemodule 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 // 当输入信号有变化时,执行块语句beginif ( (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;3'b110 : y <=8'b10111111;3'b111 : y <=8'b01111111;default: y <=8'b11111111;endcaseendelse y <=8'b11111111;endendmodulemodule fredevider2(clockin,clockout; input clockin; output clockout;reg clockout;always@(posedge clockinbeginclockout <= ~clockout;endendmodulemodule fredevider3(clockin,clockout; input clockin; output clockout;reg temp1,temp2;reg [1:0] count;always@(posedge clockinbeginif(count==2begincount <= 0;temp1 <= ~temp1;endelsecount <= count +1;endalways@(negedge clockinbeginif(count==1temp2 <= ~temp2;endassign clockout = temp1 ^ temp2; endmodule module fredevider4(clockin,clockout;input clockin;output clockout;reg [1:0]count;reg clockout;parameter N=0;always@(posedge clockinbeginif(count== N // 每计到2个上升沿(从0开始时,输出信号翻转一次begin count <= 2'b00;clockout <= ~clockout;endcount <= count +2'b01;endendmodulemodule fredevider6(clockin,clockout;input clockin;output clockout;reg [2:0]count;reg clockout;parameter N=2;always@(posedge clockinbeginif(count== N // 每计到2个上升沿(从0开始时,输出信号翻转一次begin count <= 3'b000;clockout <= ~clockout;endelsecount <= count +3'b001;endendmodulemodule seg_7(code,discode;input [3:0] code;output [6:0] discode;reg [6:0] discode;always @(code // 如果输入发生变化,则执行下面块语句begincase (code4'b0001: discode <= 7'b0110000;4'b0010: discode <= 7'b1101101;4'b0011: discode <= 7'b1111001;4'b0100: discode <= 7'b0110011;4'b0101: discode <= 7'b1011011;4'b0110: discode <= 7'b0011111;4'b0111: discode <= 7'b1110000;4'b1000: discode <= 7'b1111111;4'b1001: discode <= 7'b1110011; default discode <= 7'b0000000; endcaseendendmodulemodule seg_flash(clock,code,discode; input clock;input [3:0] code;output [6:0] discode;reg [6:0] discode;reg [7:0] count;always @(posedge clockbeginif(count==128count <= 0;elsecount <= count +1;endalways @(posedge clockbeginif(count <= 64 //计数值小于64,显示输出begin case (code4'b0000: discode <= 7'b1111110;4'b0001: discode <= 7'b0110000;4'b0010: discode <= 7'b1101101;4'b0011: discode <= 7'b1111001;4'b0100: discode <= 7'b0110011;4'b0101: discode <= 7'b1011011;4'b0110: discode <= 7'b0011111;4'b0111: discode <= 7'b1110000;4'b1000: discode <= 7'b1111111;4'b1001: discode <= 7'b1110011;endcaseendelse discode <= 7'b0000000; //计数值大于64则不显示endendmodulemodule keyboard(key4in,key4out,codeout,clock,reset,count; input[3:0] key4in; input clock,reset;output[3:0] key4out,codeout,count;reg[3:0] key4out,codeout;reg[7:0] count;reg[5:0] state;parameterfirststate=6'b000001,waitst = 6'b000010,scan1 = 6'b000100,scan2 = 6'b001000,scan3 = 6'b010000,scan4 = 6'b100000;always@(posedge clockbeginif(resetbeginstate<=firststate; count<=8'b00000000; codeout<=4'bz;endelsebegincase(state firststate:beginkey4out<=4'b1111; if(|(key4instate<=waitst;elsestate<=firststate;endwaitst:beginif(count<=19beginstate<=waitst;count<=count+1'b1; endelsebegincount<=8'b00000000; state<=scan1;key4out<=4'b0001;endendscan1:beginif(|(key4inbegincase(key4in4'b0001: codeout<=4'h0; 4'b0010: codeout<=4'h1;4'b0100: codeout<=4'h2; 4'b1000: codeout<=4'h3; default: codeout<=4'hz; endcasestate<=firststate;endelsebeginstate<=scan2;key4out=4'b0010;endendscan2:beginif(|(key4inbegincase(key4in4'b0001: codeout<=4'h4; 4'b0010: codeout<=4'h5;4'b0100: codeout<=4'h6; 4'b1000: codeout<=4'h7; default: codeout<=4'hz; endcasestate<=firststate;endelsebeginstate<=scan3;key4out=4'b0100;endendscan3:beginif(|(key4inbegincase(key4in4'b0001: codeout<=4'h8; 4'b0010: codeout<=4'h9;4'b0100: codeout<=4'ha; 4'b1000: codeout<=4'hb; default: codeout<=4'hz; endcasestate<=firststate;endelsebeginstate<=scan4;key4out=4'b1000;endendscan4:beginif(|(key4inbegincase(key4in4'b0001: codeout<=4'hc; 4'b0010: codeout<=4'hd;4'b0100: codeout<=4'he;4'b1000: codeout<=4'hf; default: codeout<=4'bz; endcasestate<=firststate;endelsebeginstate<=firststate;key4out=4'b0010;endendendcaseendendendmodulemodule frediv2 (clockin,clkout; input clockin;output clkout;reg clkout;always @(posedge clockin clkout <= !clkout; endmodulemodule frediv10(clockin,clkout; input clockin;output clkout;reg clkout;reg [3:0] counter;always @(posedge clockin beginif ( counter == 4beginclkout <= !clkout;counter <= 0;endelse counter <= counter +1; endendmodulemodule mmcount(clockmmin,reset,mmouta,mmoutb,clockmout,alarm; input clockmmin,reset;output clockmout,alarm;output [3:0] mmouta,mmoutb;reg clockmout,alarm;reg [3:0] mmouta,mmoutb;reg [7:0] countnum;always @(posedge clockmminbeginif (resetbegincountnum <=0;mmouta <= 0;mmoutb <= 0;endelsebeginif (countnum ==29clockmout <= !clockmout;if (countnum ==59beginclockmout <= !clockmout; alarm <= 1;countnum <= 0;mmouta <= 0;mmoutb <= 0;endelsebegincountnum <= countnum+1; if (mmouta == 9beginmmouta <= 0;mmoutb <= mmoutb +1; endelsebeginmmouta <= mmouta +1;endendendendendmodulemodule mscount(clockmsin,reset,msouta,msoutb,clocksout; input clockmsin,reset; output clocksout;output [3:0] msouta,msoutb;reg clocksout;reg [3:0] msouta,msoutb;reg [7:0] countnum;always @(posedge clockmsinbeginif (resetbegincountnum <=0;msouta <= 0;msoutb <= 0;endelsebeginif (countnum ==49 clocksout <= !clocksout; if (countnum ==99beginclocksout <= !clocksout; countnum <= 0;msouta <= 0;msoutb <= 0;endelsebegincountnum <= countnum+1; if (msouta == 9beginmsouta <= 0;msoutb <= msoutb +1; endelsebeginmsouta <= msouta +1;endendendendendmodulemodule startcontroller(start,stop,clock,dataout; input start,stop,clock; output dataout;reg dataout1;wire dataout;always @( posedge start or posedge stop beginif (stop dataout1 <= 0;else dataout1 <= 1;endassign dataout = dataout1 & clock; endmodulemodule suosun(start,clear,clock,dataout; input start,clear,clock; output dataout;reg dataout1;wire dataout;always @( posedge start or posedge clear begin if (clear dataout1 <= 0;else dataout1 <= 1;endassign dataout = dataout1 & clock; endmodule module display1 (clock,code,discode;input clock;input [3:0] code;output [6:0] discode;reg [6:0] discode;always @(posedge clockbegincase (code4'b0000: discode <= 7'b1111110;4'b0001: discode <= 7'b0110000;4'b0010: discode <= 7'b1101101;4'b0011: discode <= 7'b1111001;4'b0100: discode <= 7'b0110011; 4'b0101: discode <= 7'b1011011; 4'b0110: discode <= 7'b0011111; 4'b0111: discode <= 7'b1110000; 4'b1000: discode <= 7'b1111111; 4'b1001: discode <= 7'b1110011; default discode <= 7'b0000000; endcaseendendmodule分频10module fenpin10(clockin,clkout; input clockin;output clkout;reg clkout;reg [3:0] counter;always @(posedge clockin beginif ( counter == 4beginclkout <= !clkout;counter <= 0;endelse counter <= counter +1;endendmodule分频100module fenpin100(clockin,clkout; input clockin;output clkout;reg clkout;reg [7:0] counter;always @(posedge clockin beginif ( counter == 49beginclkout <= !clkout;counter <= 0;endelse counter <= counter +1;endendmodule[hcounter]:module hcounter (clock,dcodea,dcodeb,reset; input clock,reset; output [3:0] dcodea,dcodeb;reg clkout;reg [3:0] dcodea,dcodeb;reg [7:0] countnum;always @(posedge clockbeginif (resetbegincountnum <=0;dcodea <= 0;dcodeb <= 0;endelsebeginif (countnum ==11begincountnum <= 0;dcodea <= 0;dcodeb <= 0;endelsebegincountnum <= countnum+1; if (dcodea == 9begindcodea <= 0;dcodeb <= dcodeb+1;endelsebegindcodea <= dcodea +1; endendendendendmodule[ledlat]:module ledlat (clock,clkin,codein,codeout,selout,clkout; input clock,clkin; input [7:0] codein;output [7:0] codeout,selout;output clkout;reg [7:0] codeout,selout;reg clkout;reg [7:0] mymemory [7:0];reg [4:0] count1,count2;always @ ( posedge clkinbeginif (count1 == 7 count1 <= 0;elsebeginmymemory [count1] <= codein;count1 <= count1 + 1;endendalways @(posedge clockbeginif (count2 == 7begincount2 <= 0;selout <= 7'b11111110;endelsebegincodeout <= mymemory [count2]; selout <= selout << 1;count2 <= count2 +1;endendendmodule[mcounter]:module mcounter (clock,clkout,dcodea,dcodeb,reset; input clock,reset; output clkout;output [3:0] dcodea,dcodeb;reg clkout;reg [3:0] dcodea,dcodeb;reg [7:0] countnum;always @(posedge clockbeginif (resetbegincountnum <=0;dcodea <= 0;dcodeb <= 0;endelsebeginif (countnum ==0clkout <= 0;if (countnum ==59beginclkout <= !clkout; countnum <= 0;dcodea <= 0;dcodeb <= 0;endelsebegincountnum <= countnum+1; if (dcodea == 9begindcodea <= 0;dcodeb <= dcodeb+1;endelsebegindcodea <= dcodea +1; endendendendendmodule[scounter]:module scounter (clock,clkout,dcodea,dcodeb,reset; input clock,reset; output clkout;output [3:0] dcodea,dcodeb;reg clkout;reg [3:0] dcodea,dcodeb;reg [7:0] countnum;always @(posedge clockbeginif (resetbegincountnum <=0;dcodea <= 0;dcodeb <= 0;endelsebeginif (countnum ==0 clkout <= 0; if (countnum ==59 begin clkout <= !clkout; countnum <= 0; dcodea <= 0; dcodeb <= 0; end else begin countnum <= countnum+1; if (dcodea == 9 begin dcodea <= 0; dcodeb <= dcodeb+1; end else begin dcodea <= dcodea +1; end end end end endmodule。