verilog_FPGA实例
【连载】FPGAVerilogHDL系列实例--------4位二进制加减法计数器

【连载】FPGAVerilogHDL系列实例--------4位⼆进制加减法计数器Verilog HDL 之 4位⼆进制加减法计数器⼀、原理 计数器是数字系统中⽤的较多的基本逻辑器件。
它不仅能记录输⼊时钟脉冲的个数,还可以实现分频、定时等功能。
计数器的种类很多。
按脉冲⽅式可以分为同步计数器和异步计数器;按进制可以分为⼆进制计数器和⾮⼆进制计数器;按计数过程数字的增减,可分为加计数器、减计数器和可逆计数器。
本实验就是设计⼀个4位⼆进制加减法计数器,该计数器可以通过⼀个控制信号决定计数器时加计数还是减计数,另外,该寄存器还有⼀个清零输⼊,低电平有效。
还有⼀个load装载数据的信号输⼊,⽤于预置数据;还有⼀个C的输出,⽤于计数器的级联。
其功能表如表1.1所⽰; 表1.1 4位⼆进制加减法计数器功能表⼆、实现在设计⽂件中输⼊Verilog代码1/****************************** 分频模块 *************************************/23 `timescale 1 ns / 1 ps4 module qu_dou ( clk ,rst , a ,b );56 input clk ;7 wire clk ;8 input rst ;9 input a ;10 wire a ;1112 output b ;13 reg b ;1415 reg [31:0] cnt ;16 reg clkout ;17 always @ ( posedge clk or negedge rst )18 begin19if ( rst == 1'b0 )20 cnt <= 0 ;21else begin if ( a==1'b1 ) begin22if ( cnt >= 32'd3000000 )23 b <= 1 ;24else25 cnt <= cnt + 1'b1 ;2627 end28else begin b <= 1'b0 ;29 cnt <= 0 ;30 end31 end32 end333435 endmodule功能实现1 `timescale 1 ns / 1 ps23 module counter4 ( load ,clr ,c ,DOUT ,clk, up_down ,DIN ,sysclk , rst );45 input load ;6 input clk;7 wire load ;8 input clr ;9 wire clr ;10 input up_down ;11 wire up_down ;12 input [3:0] DIN ;13 wire [3:0] DIN ;14 input sysclk ;15 input rst ;1617 output c ;18 reg c ;19 output [3:0] DOUT ;20 wire [3:0] DOUT ;21 reg [3:0] data_r;2223/***************** 例化去抖模块 *************************************/24 wire clk_r ;25 qu_dou qu_dou (26 .clk (sysclk) ,27 .rst (rst) ,28 .a (clk),29 .b (clk_r));3031//********************************************************************* 323334 assign DOUT = data_r;35 always @ ( posedge clk_r or posedge clr or posedge load)36 begin37if ( clr == 1) //同步清零38 data_r <= 0;39else if ( load == 1) //同步预置40 data_r <= DIN;41else begin if ( up_down ==1)42 begin43if ( data_r == 4'b1111) begin //加计数44 data_r <= 4'b0000;45 c = 1;46 end47else begin //减计数48 data_r <= data_r +1;49 c = 0 ;50 end51 end52else53 begin54if ( data_r == 4'b0000) begin //加计数55 data_r <= 4'b1111;56 c = 1;57 end58else begin //减计数59 data_r <= data_r -1;60 c = 0 ;61 end62 end63 end64 end65 endmodule。
数字闹钟的FPGA实现(Verilog)

闹钟的FPGA实现一.设计目的及总述:本次实验选择用FPGA实现一个闹钟。
它的功能有:1.时钟2.可以用按键快慢调整时钟时间3.可以设定闹钟并在时间到达设定闹钟时间时响起卡农音乐一分钟4.整点报时,响一声来报时系统一共有五个按键,分别命名为switch_mode,switch_enter,switch_pick,switch_down,switch_up。
时钟,调时,设定闹钟通过LCD1602进行显示,整点报时声和闹钟声通过蜂鸣器发出。
其中:本次实验的闹钟用Verilog语言进行设计,由于实验在Xilinx开发板上LCD1602显示模块几经调试显示都有问题,而实验的截止日期又极其接近了故最后选择在我购买的Altera 开发板上进行实现。
由于Altera公司FPGA使用Quartus II软件进行编译下载,所以把原来在ISE软件上以schematic方式实现的顶层原理图对应自动生成的verilog代码更改后添加进Quartus工程中使用。
所需要的修改仅为将顶层原理图中的OR2例化语句改为or(输出,输入1,输入2),并把系统时钟设为50MHZ,其他各模块代码不需进行更改。
二.仿真过程在几经更改之下,更由于在两种系统下的调试,使得仿真变得难以进行,此次试验针对各模块(不包括分频模块:fre_divider)的仿真结果难以找到了而且ISE9.1i十分难用,经常报各种错,因此在这里只选择其中比较重要的控制模块(controller)和时钟模块(timer),调时(快慢)模块(time_adjust)的仿真结果以说明本实验的仿真过程。
Controller:Timer:Time_adjust:三.系统总图即各模块Verilog代码和说明(参考对代码的详细注释):1.各模块之间连线图和对应的Verilog代码:Clock.v:module clock(clk_50m, //在本次实验所用的Altera开发版上,系统时钟为50MHZ rst, //复位键switch_down, //向下调整,设定switch_enter, //确认完成调整,设定switch_mode, //选择系统出于何种模式:时钟,调时,设定闹钟switch_pick, //选择调整,设定的对象:时,分,秒// switch_up, //向上调整,设定beep, //蜂鸣器lcd_d, //lcd1602 d7-d0管脚lcd_e, //lcd1602 en管脚lcd_rs, //lcd1602 rs管脚lcd_rw); //lcd1602 rw管脚input clk_50m;input rst;input switch_down;input switch_enter;input switch_mode;input switch_pick;//input switch_up;output beep;output [7:0] lcd_d;output lcd_e;output lcd_rs;output lcd_rw;//以下声明的线型量用于连接系统各模块 wire [7:0] XLXN_4;wire [7:0] XLXN_5;wire [7:0] XLXN_6;wire [7:0] XLXN_7;wire [7:0] XLXN_8;wire [7:0] XLXN_9;wire [7:0] XLXN_10;wire [7:0] XLXN_11;wire [2:0] XLXN_14;wire XLXN_15;wire XLXN_16;wire XLXN_17;wire XLXN_19;wire [5:0] XLXN_20;wire [5:0] XLXN_21;wire [5:0] XLXN_22;wire XLXN_24;wire [5:0] XLXN_33;wire [5:0] XLXN_34;wire XLXN_36;wire [5:0] XLXN_37;wire [5:0] XLXN_39;wire [5:0] XLXN_40;wire XLXN_50;wire XLXN_51;reg clk_25m;wire switch_up;assign switch_up=1;//由于系统本身是设计在实验室的板子上(25MHZ)上,所以现在把50MHZ系统时钟//二分频得到25MHZ时钟,这样就不用更改各子模块always@(posedge clk_50m)beginif(!rst)clk_25m<=0;elseclk_25m<=~clk_25m;end//控制模块,控制系统出于三种状态之一:时钟,调时,设定闹钟。
简谈FPGA verilog中的function用法与例子

简谈FPGA verilog中的function用法与例子大家好,又到了每日学习的时间了,今天我们来聊一聊FPGA verilog中的function用法与例子。
函数的功能和任务的功能类似,但二者还存在很大的不同。
在Verilog HDL 语法中也存在函数的定义和调用。
1.函数的定义函数通过关键词function 和endfunction 定义,不允许输出端口声明(包括输出和双向端口),但可以有多个输入端口。
函数定义的语法如下:function [range] function_id; input_declaration other_declarations procedural_statementendfunction 其中,function 语句标志着函数定义结构的开始;[range]参数指定函数返回值的类型或位宽,是一个可选项,若没有指定,默认缺省值为 1 比特的寄存器数据;function_id 为所定义函数的名称,对函数的调用也是通过函数名完成的,并在函数结构体内部代表一个内部变量,函数调用的返回值就是通过函数名变量传递给调用语句;input_declaration 用于对函数各个输入端口的位宽和类型进行说明,在函数定义中至少要有一个输入端口;endfunction为函数结构体结束标志。
下面给出一个函数定义实例。
定义函数实例:function AND; //定义输入变量input A, B; //定义函数体begin AND = A endendfunction 函数定义在函数内部会隐式定义一个寄存器变量,该寄存器变量和函数同名并且位宽也一致。
函数通过在函数定义中对该寄存器的显式赋值来返回函数计算结果。
此外,还有下列几点需要注意:(1)函数定义只能在模块中完成,不能出现在过程块中;(2)函数至少要有一个输入端口;不能包含输出端口和双向端口;(3)在函数结构中,不能使用任何形式的时间控制语句(#、wait 等),也不能使用disable中止语句;(4)函数定义结构体中不能出现过程块语句(always 语句);(5)函数内部可以调用函数,但不能调用任务。
FPGA Verilog HDL 系列实例--8-3编码器

Verilog HDL 之直流电机PWM控制一、实验前知识准备在上一篇中总结了步进电机的控制,这次我将学习一下直流电机的控制,首先,我们简要了解下步进电机和直流电机的区别。
(1)步进电机是以步阶方式分段移动,直流电机通常采用连续移动的控制方式。
(2)步进电机采用直接控制方式,它的主要命令和控制变量都是步阶位置;直流电机则是以电机电压为控制变量,以位置或速度为命令变量。
(3)直流电机需要反馈控制系统,他会以间接方式控制电机位置。
步进电机系统多半以“开环方式”进行操作。
1、什么是直流电机输出或输入为直流电能的旋转电机,称为直流电机,它是能实现直流电能和机械能互相转换的电机。
当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。
2、什么是PWMPWM(脉冲宽度调制)是一种模拟控制方式,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
3、开发平台中直流电机驱动的实现开发板中的直流电机的驱动部分如图1.1所示。
利用FPGA设计一个0、1组成的双极性PWM发生器。
图1.1 直流电机的驱动部电路二、实验平台Quartus II 7.2 集成开发环境、SOPC-MBoard板、ByteBlaster II 下载电缆三、实验目标1、了解直流电机PWM的控制方法。
2、具有调速功能。
四、实验实现详细实现步骤请参考【连载】FPGA Verilog HDL 系列实例--------8-3编码器1、在设计文件中输入Verilog代码。
66 endmodule2、分析思考:(1)如何控制顺时针转和逆时针转?(2)速度的大小如何控制的?第38行~第53行:由2个引脚控制生成双极性PWM发生器。
结论:(1)以MA_r[0]为准,当状态0的时间大于状态1的时间时,电机逆时针转动;反之,电机顺时针转动。
FPGA 用Verilog HDL实现三角波,三相方波程序

FPGA——用Verilog HDL进行三角波和三相方波的编写三角波module triangle(inputsys_clk,output [2:0]sda);reg[3:0]a=0;regai=0;always@(posedgesys_clk)beginif(ai==0)begina=a+1;if(a==7)ai<=1;endelsebegina=a-1;if(a==0)ai<=0;endendassignsda[0]=a[0];assignsda[1]=a[1];assignsda[2]=a[2];endmodule三相方波第一种方法:modulepwmabc(inputsys_clk,output [2:0]abc);regtriga=0;regtrigb=1;regtrigc=0;reg[15:0] cnt1=0;reg[15:0] cnt2=20;reg[15:0] cnt3=40;always@(negedgesys_clk)beginif(cnt1>59)begintriga=~triga;cnt1<=1;endelsecnt1<=cnt1+1;if(cnt2>59)begintrigb=~trigb;cnt2<=1;endelsecnt2<=cnt2+1;if(cnt3>59)begintrigc=~trigc;cnt3<=1;endelsecnt3<=cnt3+1;endassignabc[0]=triga;assignabc[1]=trigb;assignabc[2]=trigc;endmodule第二种方法module fangbo0(inputsys_clk,output [2:0]sda);reg [31:0]halftemple_counter0=0;reg [31:0]halftemple_counter1=0;reg [31:0]halftemple_counter2=0;reg [1:0]temple_clk0=1;//第一相的初始值是高电平(初始的高低电平是根据我给你看的相位图来的)reg [1:0]temple_clk1=1;//第二相的初始值是高电平reg [1:0]temple_clk2=0;//第三相的初始值是底电平//我在设计三相方波的时候用的比较笨的方法,就是三相方波一项一项的来设置。
FPGA四位频率计设计Verilog语言实现

FPGA四位频率计设计Verilog语言实现设计任务:用混合设计的方法设计一个4位频率计,主要设计模块为测频控制器、计数器、锁存器、译码器,显示器为7段LED显示管。
并合理选择实验模式,进行下载测试。
//计数器模块modulejishu(clk,zamen,fuwei,jieguo1,jieguo2,jieguo3,jieguo4);inputclk;inputzamen;inputfuwei;output[3:0]jieguo1,jieguo2,jieguo3,jieguo4;reg[3:0]jieguo1,jieguo2,jieguo3,jieguo4;always @(posedgeclk)if(fuwei)beginjieguo1<=4'b0000;jieguo2<=4'b0000;jieguo3<=4'b0000;jieguo4<=4'b0000;endelse if(zamen) //4个if完成4位计数器的进位beginif(jieguo1==4'b1001)begin jieguo1<=4'b0000;jieguo2<=jieguo2+1;if(jieguo2==4'b1001)begin jieguo2<=4'b0000;jieguo3<=jieguo3+1;if(jieguo3==4'b1001)begin jieguo3<=4'b0000;jieguo4<=jieguo4+1;if(jieguo4==4'b1001)jieguo4<=4'b0000;endendendelsejieguo1<=jieguo1+1;endendmodulemodule DECL7S(A,LED7S);input[3:0]A;output[6:0]LED7S;reg[6:0]LED7S;always@(A)begincase(A)4'b0000: LED7S<=7'b0111111;4'b0001: LED7S<=7'b0000110;4'b0010: LED7S<=7'b1011011;4'b0011: LED7S<=7'b1001111;4'b0100: LED7S<=7'b1100110;4'b0101: LED7S<=7'b1101101;4'b0110: LED7S<=7'b1111101;4'b0111: LED7S<=7'b0000111;4'b1000: LED7S<=7'b1111111;4'b1001: LED7S<=7'b1101111;4'b1010: LED7S<=7'b1110111;4'b1011: LED7S<=7'b1111100;4'b1100: LED7S<=7'b0111001;4'b1101: LED7S<=7'b1011110;4'b1110: LED7S<=7'b1111001;4'b1111: LED7S<=7'b1110001; default:LED7S<=7'b0111111; endcaseendendmodulemodulecepin(CLKK,CNT_EN,RST_CNT,LOAD);input CLKK;output CNT_EN,RST_CNT,LOAD;wire CNT_EN,LOAD;reg RST_CNT,JICUN;always @(posedge CLKK)//两个always语句块实现测频功能JICUN<=~JICUN;always @(CLKK or JICUN)beginif(CLKK==1'b0 & JICUN==1'b0) RST_CNT<=1'b1;else RST_CNT<=1'b0;endassign LOAD=~JICUN;assign CNT_EN=JICUN;endmodule//锁存器module suocun(result1,result2,result3,result4,data1,data2,data3,data4,kaiguan);output[3:0]data1,data2,data3,data4;input[3:0]result1,result2,result3,result4;inputkaiguan;reg[3:0]data1,data2,data3,data4;always @(posedgekaiguan)if(kaiguan)begindata1<=result1;data2<=result2;data3<=result3;data4<=result4;endendmodule。
Verilog及Xilinx_FPGA入门(一)

Verilog及Xilinx_FPGA⼊门(⼀)⼀、流⽔灯实验;⼀、FPGA的⼯作是基于时钟的,语⾔中⼏乎每处都⽤到了always@(posedge clk),意思是clk上升沿触发⼯作,之后执⾏其下的语句。
⼆、<=⾮阻塞语⾔,并⾏⽅式三、FPGA基本⼯作原理基于LUT查表,查表这也是⼀种特别重要的编程思想,下⾯的流⽔灯实现(⼆)差不多就是这种思想。
(1)实现(⼀)module liushuideng(input clk,input rst,output reg[7:0] led=8'b00000001;);reg[31:0] cnt=0;always@(posedge clk or negedge rst)if(!rst) begin //rst按键按下为低电平led<=8'b00000001;cnt<=0;end else beginif(cnt==32'd100000000) //假如时钟为100MHz 那么32‘d100000000代表1秒钟beginled<={led[6:0],led[7]}; //⾼电平代表点亮灯,实现循环左移位cnt<=0;end else begincnt<=cnt+1;endend(2)实现(⼆)module liushuideng(input clk,input rst,output reg[7:0] led=8'b00000001;);reg[31:0] cnt=0;always@(posedge clk or negedge rst)if(!rst) begin //rst按键按下为低电平led<=8'b00000001;cnt<=0;end else beginif(cnt==32'd800000000)begincnt<=0; //cnt==32'd800000000时重新复位为0end else begincnt<=cnt+1;//每当时钟沿到来时 cnt⾃加1endcase(cnt)32'd800000000:led<=8'b10000000; //cnt为800000000时led==8‘d1*******(8代表位宽//缺省为最⼤位宽)32'd700000000:led<=8'b01000000;32'd600000000:led<=8'b00100000;32'd500000000:led<=8'b00010000; 32'd400000000:led<=8'b00001000; 32'd300000000:led<=8'b00000100; 32'd200000000:led<=8'b00000010; 32'd100000000:led<=8'b00000001;default:;endend。
(完整word版)用FPGA实现SRAM读写控制的Verilog代码

`define SRAM_SIZE 8`timescale 1ns/1ns//FOR SRAM INTERFACE CONTROLmodule SRAM_INTERFACE(in_data,//INPUT DATAout_data,//OUTPUT DATAfiford,//FIFO READ CONTROL LOW VOLTAGEfifowr,//FIFO WRITE CONTROL LOW VOLTAGEnfull,nempty,address,//SENT SRAM ADDRESS BUSsram_data,//SRAM DATA BUSrd,//SRAM READ SINGAL ENABLE LOW VOLTAGEwr,//SRAM WRITE ENABLE LOW VOLTAGEclk,//system clkrst);//global reset singal,low voltageinput fiford,fifowr,clk,rst;input[7:0] in_data;output[7:0] out_data;reg[7:0] in_data_buf,out_data_buf;//input and output buffer output reg nfull,nempty;output rd,wr;inout[7:0] sram_data;output reg [10:0]address;reg[10:0] fifo_wp,fifo_rp;reg[10:0]fifo_wp_next,fifo_rp_next;reg near_full,near_empty;reg[3:0] state;parameter idle=4'b0000,read_ready='b0100,read='b0101,read_over='b0111,write_ready='b1000,write='b1001,write_over='b1011;always@(posedge clk or negedge rst)beginif(!rst)state<=idle;else case(state)idle:beginif(fifowr==0&&nfull)state<=write_ready;else if(fiford==0&&nempty)state<=read_ready;elsestate<=idle;endread_ready:state<=read;read:beginif(fiford==1)state<=read_over;elsestate<=read;endread_over:state<=idle;write_ready:state<=write;write:beginif(fifowr==1)state<=write_over;elsestate<=write;endwrite_over:state<=idle;default:state<=idle;endcaseendassign rd=~state[2];assign wr=(state==write)?fifowr:1'b1;always@(posedge clk)beginif(~fifowr)in_data_buf<=in_data;end//=============================================== ==============always@(state or fiford or fifowr or fifo_wp or fifo_rp)beginif(state[2]||~fiford)address=fifo_rp;else if(state[3]||~fifowr)elseaddress='bz;end//=============================================== ==================assign out_data=(state[2])?sram_data:8'bz;always@(posedge clk)beginif(state==read)out_data_buf<=sram_data;end//=============================================== ===always@(posedge clk or negedge rst)beginif(!rst)fifo_rp<=0;else if(state==read_over)fifo_rp<=fifo_rp_next;end//=============================================== ====always@(fifo_rp)beginif(fifo_rp==`SRAM_SIZE-1)fifo_rp_next=0;elsefifo_rp_next=fifo_rp+1;end//=============================================== ======always@(posedge clk or negedge rst)beginif(!rst)fifo_wp<=0;else if(state==write_over)fifo_wp<=fifo_wp_next;end//=============================================== ===always@(fifo_wp)beginif(fifo_wp==`SRAM_SIZE-1)elsefifo_wp_next=fifo_wp+1;end//=============================================== ====always@(posedge clk or negedge rst)beginif(!rst)near_empty<=1'b0;else if(fifo_wp==fifo_rp_next)near_empty<=1'b1;elsenear_empty<=1'b0;end//=============================================== ========always@(posedge clk or negedge rst)beginif(!rst)nempty<=1'b0;else if(near_empty&&state==read)nempty<=1'b0;else if(state==write)nempty<=1'b1;end//=============================================== =======always@(posedge clk or negedge rst)beginif(!rst)near_full<=1'b0;else if(fifo_rp==fifo_wp_next)near_full<=1'b1;elsenear_full<=1'b0;end//=============================================== =====always@(posedge clk or negedge rst)beginif(!rst)nfull<=1'b1;else if(near_full&&state==write)nfull<=1'b0;else if(state==read)nfull<=1'b1;end//=============================================== ============endmodule。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、组合逻辑实验 (2)实验13X8译码器程序 (2)实验2二-十进制译码器 (2)实验3BCD码—七段数码管显示译码器 (3)实验48-3编码器 (4)实验58-3优先编码器 (4)实验6十—二进制编码器 (5)实验7三选一数据选择器 (5)实验8半加器 (6)实验9全加器 (7)实验10半减器 (8)实验11全减器 (8)实验12多位数值比较器 (9)实验13奇偶校验 (9)实验14补码生成 (10)实验158位硬件加法器的设计 (10)实验164位并行乘法器 (10)实验17七人表决器 (10)实验18格雷码变换 (11)二、时序逻辑实验 (11)实验1D触发器 (11)实验2JK触发器 (12)实验3四位移位寄存器 (12)实验4异步计数器 (13)实验5同步计数器 (14)实验6可逆计数器 (15)实验7步长可变的加减计数器 (16)实验8含异步清0和同步时钟使能的4位加法计数器 (17)实验9顺序脉冲发生器 (18)实验10序列信号发生器 (18)实验11用状态机实现串行数据检测器 (19)实验12分频器 (20)实验13Moore状态机 (21)实验14Mealy状态机 (23)实验15三层电梯 (24)实验16性线反馈移位寄存器(LFSR)设计 (32)实验17正负脉宽数控调制信号发生器 (32)三、存储器设计 (34)实验1只读存储器(ROM) (34)实验2SRAM (34)实验3FIFO (35)四、扩展接口实验 (39)实验1流水灯 (39)实验2VGA彩色信号显示控制器设计 (40)实验3PS/2键盘接口实验 (48)实验4PS/2鼠标接口实验 (49)五、综合实验 (58)实验1函数发生器 (58)实验2自动售货机 (61)实验3移位相加4位硬件乘法器电路设计 (63)一、组合逻辑实验实验13X8译码器程序//Decoder:3-to8decoder with an enable contmodule decoder(y,en,a);output[7:0]y;input en;input[2:0]a;reg[7:0]y;always@(en or a)//EN和A是敏感信号if(!en)//如果使能信号为低,无效y=8'b1111_1111;elsecase(a)3'b000:y=8'b1111_1110;//最低位为低3'b001:y=8'b1111_1101;3'b010:y=8'b1111_1011;3'b011:y=8'b1111_0111;3'b100:y=8'b1110_1111;3'b101:y=8'b1101_1111;3'b110:y=8'b1011_1111;3'b111:y=8'b0111_1111;default:y=8'bx;//否则为不确定信号endcaseendmodule实验2二-十进制译码器//Decoder:binary-to decimal decoder with an enable controlmodule b2d(y,en,a);output[7:0]y;input en;input[3:0]a;reg[7:0]y;always@(en or a)//EN和A是敏感信号if(!en)//如果使能信号为低,无效y=8'b1111_1111;elsebeginif(a>9)y<=a+6;//这里完成了二进制到十进制的译码,elsey<=a;end//为了方便在平台上进行观察验证///这里把数据的个位和十位分别用4个LED进行显示,均为二进制Endmodule实验3BCD码—七段数码管显示译码器module decode4_7(decodeout,a);output[6:0]decodeout;input[3:0]a;reg[6:0]decodeout;always@(a)begincase(a)//用case语句进行译码abcdefg4'h0:decodeout=7'b1111110;4'h1:decodeout=7'b0110000;4'h2:decodeout=7'b1101101;4'h3:decodeout=7'b1111001;4'h4:decodeout=7'b0110011;4'h5:decodeout=7'b1011011;4'h6:decodeout=7'b1011111;4'h7:decodeout=7'b1110000;4'h8:decodeout=7'b1111111;4'h9:decodeout=7'b1111011;4'ha:decodeout=7'b1110111;4'hb:decodeout=7'b0011111;4'hc:decodeout=7'b1001110;4'hd:decodeout=7'b0111101;4'he:decodeout=7'b1001111;4'hf:decodeout=7'b1000111;default:decodeout=7'bx;endcaseendendmodule实验48-3编码器//a8-3codermodule coder(dout,din);output[2:0]dout;input[7:0]din;reg[2:0]dout;always@(din)case(din)8'b1111_1110:dout<=3'b000;8'b1111_1101:dout<=3'b001;8'b1111_1011:dout<=3'b010;8'b1111_0111:dout<=3'b011;8'b1110_1111:dout<=3'b100;8'b1101_1111:dout<=3'b101;8'b1011_1111:dout<=3'b110;8'b0111_1111:dout<=3'b111;default:dout<=3'bx;endcaseendmodule实验58-3优先编码器module encoder(d0,d1,d2,d3,d4,d5,d6,d7,x,y,v); output x,y,v;input d0,d1,d2,d3,d4,d5,d6,d7;reg x,y,v;always@(d0or d1or d2or d3or d4or d5or d6or d7) if(d7==0){x,y,v}=3'b111;else if(d6==0){x,y,v}=3'b110;else if(d5==0){x,y,v}=3'b101;else if(d4==0){x,y,v}=3'b100;else if(d3==0){x,y,v}=3'b011;else if(d2==0){x,y,v}=3'b010;else if(d1==0){x,y,v}=3'b001;else if(d0==0){x,y,v}=3'b000;else{x,y,v}=3'bxxx;endmodule实验6十—二进制编码器//decimal to binary encodermodule encoder(y,a);output[4:0]y;input[4:0]a;//input[4]为十位,[3:0]为个位?reg[4:0]y;always@(a)//A是敏感信号beginif(a>9)y<=a-6;//这里完成了十进制到二进制的编码,elsey<=a;end//为了方便在平台上进行观察验证///这里把数据的个位用4个2进制数据表示,十位用1bit进行显示;endmodule实验7三选一数据选择器module mux3to1(dout,a,b,c,sel);output[1:0]dout;input[1:0]a,b,c;input[1:0]sel;reg[1:0]dout;//RTL modelingalways@(a or b or c or sel)case(sel)2'b00:dout<=a;2'b01:dout<=b;2'b10:dout<=c;default:dout<=2'bx;endcaseendmodule//数据流方式描述的1位半加器module halfadder(sum,cout,a,b); input a,b;output sum,cout;assign sum=a^b;assign cout=a&b;//carry out; endmodule附录:各种不同的描述方式:1,调用门元件实现的1位半加器module half_add1(a,b,sum,cout); input a,b;output sum,cout;and(cout,a,b);xor(sum,a,b);endmodule2,采用行为描述的1位半加器module half_add3(a,b,sum,cout); input a,b;output sum,cout;reg sum,cout;always@(a or b)begincase({a,b})//真值表描述2'b00:begin sum=0;cout=0;end2'b01:begin sum=1;cout=0;end2'b10:begin sum=1;cout=0;end2'b11:begin sum=0;cout=1;end endcaseendendmodule3,采用行为描述的1位半加器module half_add4(a,b,sum,cout); input a,b;output sum,cout;reg sum,cout;always@(a or b)beginsum=a^b;cout=a&b;endendmodule//1bit full adder1位全加器module full_add(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign{cout,sum}=a+b+cin;endmodule附录:各种不同的描述方式实现的1位全加器1,调用门元件实现的1位全加器module full_add1(a,b,cin,sum,cout);input a,b,cin;output sum,cout;wire s1,m1,m2,m3;and(m1,a,b),(m2,b,cin),(m3,a,cin);xor(s1,a,b),(sum,s1,cin);or(cout,m1,m2,m3);endmodule2数据流描述的1位全加器module full_add2(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign sum=a^b^cin;assign cout=(a&b)|(b&cin)|(cin&a);endmodule3行为描述的1位全加器module full_add4(a,b,cin,sum,cout);input a,b,cin;output sum,cout;reg sum,cout;//在always块中被赋值的变量应定义为reg型reg m1,m2,m3;always@(a or b or cin)beginsum=(a^b)^cin;m1=a&b;m2=b&cin;m3=a&cin;cout=(m1|m2)|m3;endendmodule4混合描述的1位全加器module full_add5(a,b,cin,sum,cout);input a,b,cin;output sum,cout;reg cout,m1,m2,m3;//在always块中被赋值的变量应定义为reg型wire s1;xor x1(s1,a,b);//调用门元件always@(a or b or cin)//always块语句beginm1=a&b;m2=b&cin;m3=a&cin;cout=(m1|m2)|m3;endassign sum=s1^cin;//assign持续赋值语句endmodule实验10半减器module half_sub(diff,sub_out,x,y);output diff,sub_out;input x,y;reg diff,sub_out;//行为描述always@(x or y)case({x,y})2'b00:begin diff=0;sub_out=0;end2'b01:begin diff=1;sub_out=1;end2'b10:begin diff=1;sub_out=0;end2'b11:begin diff=0;sub_out=0;enddefault:begin diff=x;sub_out=x;endendcaseendmodule实验11全减器module full_sub(diff,sub_out,x,y,sub_in);output diff,sub_out;input x,y,sub_in;reg diff,sub_out;//行为描述always@(x or y or sub_in)case({x,y,sub_in})3'b000:begin diff=0;sub_out=0;end3'b001:begin diff=1;sub_out=1;end3'b010:begin diff=1;sub_out=1;end3'b011:begin diff=0;sub_out=1;end3'b100:begin diff=1;sub_out=0;end3'b101:begin diff=0;sub_out=0;end3'b110:begin diff=0;sub_out=0;end3'b111:begin diff=1;sub_out=1;enddefault:begin diff=x;sub_out=x;endendcaseendmodule实验12多位数值比较器module comp(ABB,AEB,ASB,A,B,I1,I2,I3);output ABB,AEB,ASB;//ABB表示A>B AEB表示A=B,ASB表示A<B;input[1:0]A,B;input I1,I2,I3;//I1表示上一级的A>B I2表示上一级的A=B,I3表示上一级的A<B; reg ABB,AEB,ASB;//行为描述always@(A or B or I1or I2or I3)if(A>B){ABB,AEB,ASB}=3'b100;else if(A<B){ABB,AEB,ASB}=3'b001;else//A=B,但是考虑到前一级的情况begin if(I1)//I1表示上一级的A>B{ABB,AEB,ASB}=3'b100;else if(I3){ABB,AEB,ASB}=3'b001;//I3表示上一级的A<B;else{ABB,AEB,ASB}=3'b010;endendmodule实验13奇偶校验//奇偶校验位产生器module parity(even_bit,odd_bit,input_bus);output even_bit,odd_bit;input[7:0]input_bus;assign odd_bit=^input_bus;//产生奇校验位assign even_bit=~odd_bit;//产生偶校验位endmodule实验14补码生成module compo(d_out,d_in);output[7:0]d_out;input[7:0]d_in;reg[7:0]d_out;always@(d_in)if(d_in[7]==1'b0)//正数,最高位为符号位,0说明是正数,正数补码是其本身d_out=d_in;else//负数d_out={d_in[7],~d_in[6:0]+1'b1};//最高位符号位不变,数据位加一构成其补码endmodule实验158位硬件加法器的设计//8位硬件加法器module add8b(cout,sum,a,b,cin);output[7:0]sum;output cout;input[7:0]a,b;input cin;assign{cout,sum}=a+b+cin;endmodule实验164位并行乘法器//4位并行乘法器module mult(outcome,a,b);parameter size=4;input[size:1]a,b;//两个操作数output[2*size:1]outcome;//结果assign outcome=a*b;//乘法运算符endmodule实验17七人表决器//for语句描述的七人投票表决器module voter7(pass,vote);output pass;//通过为高电平,否则为低电平input[6:0]vote;//7个投票输入#通过为高,否定为低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实验18格雷码变换module BIN2GARY(EN,DATA_IN,DATA_OUT);input EN;input[3:0]DATA_IN;output[3:0]DATA_OUT;assign DATA_OUT[0]=(DATA_IN[0]^DATA_IN[1])&&EN; assign DATA_OUT[1]=(DATA_IN[1]^DATA_IN[2])&&EN; assign DATA_OUT[2]=(DATA_IN[2]^DATA_IN[3])&&EN; assign DATA_OUT[3]=DATA_IN[3]&&EN;endmodule二、时序逻辑实验实验1D触发器module myDFF(q,qn,d,clk,set,reset);input d,clk,set,reset;output q,qn;reg q,qn;always@(posedge clk)beginif(reset)beginq<=0;qn<=1;//同步清0,高电平有效endelse if(set)beginq<=1;qn<=0;//同步置1,高电平有效else beginq<=d;qn<=~d;endendendmodule实验2JK触发器//带异步清0、异步置1的JK触发器module JK_FF(CLK,J,K,Q,RS,SET);input CLK,J,K,SET,RS;output Q;reg Q;always@(posedge CLK or negedge RS or negedge SET) beginif(!RS)Q<=1'b0;else if(!SET)Q<=1'b1;else case({J,K})2'b00:Q<=Q;2'b01:Q<=1'b0;2'b10:Q<=1'b1;2'b11:Q<=~Q;default:Q<=1'bx;endcaseendendmodule实验3四位移位寄存器//4位移位寄存器module shifter(din,clk,clr,dout);input din,clk,clr;output[3:0]dout;reg[3:0]dout;always@(posedge clk)beginif(clr)dout<=4'b0;//同步清0,高电平有效elsebegindout<=dout<<1;//输出信号左移一位dout[0]<=din;//输入信号补充到输出信号的最低位endendmodule//分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080 always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验4异步计数器//行为描述方式实现的4位异步计数器module counter(clk,clr,q0,q1,q2,q3);input clk,clr;output q0,q1,q2,q3;reg q0,q1,q2,q3;//reg q0_t,q1_t,q2_t,q3_t;reg q0_r,q1_r,q2_r,q3_r;always@(posedge clk or negedge clr)if(!clr)q0_r<=0;elseq0_r<=!q0_r;always@(posedge q0_r or negedge clr)if(!clr)q1_r<=0;elseq1_r<=!q1_r;always@(posedge q1_r or negedge clr)if(!clr)q2_r<=0;elseq2_r<=!q2_r;always@(posedge q2_r or negedge clr)if(!clr)q3_r<=0;elseq3_r<=!q3_r;assign{q0,q1,q2,q3}={q0_r,q1_r,q2_r,q3_r};endmodule//分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080 always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验5同步计数器Verilog HDL程序//带异步清0的同步计数器module counter(Q,CR,CLK);input CLK,CR;output[3:0]Q;reg[3:0]Q;always@(posedge CLK or negedge CR)beginif(!CR)Q<=4'b0000;elsebeginif(Q==15)Q<=0;else Q<=Q+1;endendendmodule//分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080 always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验6可逆计数器//同步清零的可逆计数器module counter(Q,CLK,CR,UD);input CLK,CR,UD;output[3:0]Q;reg[3:0]cnt;initialbegincnt<=4'b0000;endassign Q=cnt;always@(posedge CLK)beginif(!CR)cnt<=4'b0000;//同步清0,低电平有效else beginif(UD)cnt=cnt+1;//加法计数else cnt=cnt-1;//减法计数endendendmodule//分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080 always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验7步长可变的加减计数器//同步清零的步长可变加减计数器module counter(Q,CLK,CR,UD,STEP);input CLK,CR,UD;input[1:0]STEP;output[3:0]Q;reg[3:0]cnt;initialbegincnt<=4'b0000;endassign Q=cnt;always@(posedge CLK)beginif(!CR)cnt<=4'b0000;//同步清0,低电平有效else beginif(UD)cnt=cnt+STEP;//加法计数else cnt=cnt-STEP;//减法计数endendendmodule//分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080 always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验8含异步清0和同步时钟使能的4位加法计数器//实验八含异步清0和同步时钟使能的4位加法计数器module counter(clk,clear,en,qd);input clk,clear,en;output[3:0]qd;reg[3:0]cnt;always@(posedge clk or negedge clear)beginif(!clear)cnt<=4'h0;//异步清0,低电平有效else if(en)//同步使能cnt<=cnt+1;//加法计数endassign qd=cnt;endmodule//分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080 always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验9顺序脉冲发生器module pulsegen(q0,q1,q2,clk,rd);input clk,rd;output q0,q1,q2;reg q0,q1,q2;reg[2:0]x,y;always@(posedge clk)if(rd)beginy<=0;x<=3'b001;//give a initial valueendelsebeginy<=x;x<={x[1:0],x[2]};endassign{q0,q1,q2}=y;endmodule//分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080 always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验10序列信号发生器module sequencer(y,clk,clr);input clk,clr;reg[7:0]yt;parameter s0=8'b1000_0000,//state0s1=8'b1100_0001,//state1s2=8'b1110_0000,//state2s3=8'b0001_0000,s4=8'b1111_1000,s5=8'b0000_0011,s6=8'b1111_0011,s7=8'b0000_0001;//state7always@(posedge clk)beginif(clr)yt<=s0;//clear to state0elsebegincase(yt)s0:yt<=s1;//change from state0to state1s1:yt<=s2;//s2:yt<=s3;//state2-->3s3:yt<=s4;s4:yt<=s5;s5:yt<=s6;s6:yt<=s7;s7:yt<=s0;//state7to state0default:yt<=s0;//default state7to s0endcaseendendassign y=yt;endmodule实验11用状态机实现串行数据检测器module detector(got,instr,clk);output got;input instr,clk;reg[2:0]cstate,nextstate;reg got;parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7;//8statesalways@(posedge clk)//定义起始状态begincstate<=nextstate;endalways@(cstate or instr)//定义状态转换begincase(cstate)s0:begin got<=0;if(instr)nextstate<=s1;//detected the1st bit of1110010,i.e.,1,to s1else nextstate<=s0;//if not,stay hereends1:begin got<=0;if(instr)nextstate<=s2;//detected the2nd bit of1110010,i.e.,1,to s2else nextstate<=s0;//notends2:begin got<=0;if(instr)nextstate<=s3;//detected the3rd bit of1110010,i.e.,1else nextstate<=s0;//notends3:begin got<=0;if(!instr)nextstate<=s4;//detected the4th bit of1110010,i.e.,0else nextstate<=s2;//not,stayends4:begin got<=0;if(!instr)nextstate<=s5;//detected the5th bit of1110010,i.e.,0else nextstate<=s1;//notends5:begin got<=0;f(instr)nextstate<=s6;//detected the6th bit of1110010,i.e.,1else nextstate<=s0;//notends6:begin got<=0;if(!instr)nextstate<=s7;//detected the7th bit of1110010,i.e.,0else nextstate<=s2;//notends7:begin got<=1;//got the sequenceif(instr)nextstate<=s1;//detected the1st bit of1110010,i.e.,1,chagne to s1 else nextstate<=s0;//not,change to s0endendcaseendendmodule实验12分频器//分频器部分,获得便于试验观察的时钟信号,在实验台上进行观察module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080 always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule//分频器部分用于设计仿真,10分频module clk_diver(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[4:0]counter;//parameter cnt=10;///10分频always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验13Moore状态机module moore(dataout,clk,datain,reset);output[3:0]dataout;input[1:0]datain;input clk,reset;parameter s0=2'b00,//采用格雷码编码s1=2'b01,s2=2'b11,s3=2'b10;reg[1:0]cstate,nstate;reg[3:0]dataout;always@(posedge clk or posedge reset)//时序逻辑进程if(reset)//异步复位cstate<=s0;else//--当检测到时钟上升沿时执行CASE语句begincstate<=nstate;endalways@(cstate or datain)begincase(cstate)s0:begin if(datain==0)nstate<=s1;else nstate<=s0;ends1:begin if(datain==1)nstate<=s2;else nstate<=s1;ends2:begin if(datain==2)nstate<=s3;else nstate<=s2;ends3:begin if(datain==3)nstate<=s0;else nstate<=s3;end//由信号state将当前状态值带出此进程,进入组合逻辑进程endcaseendalways@(cstate)//组合逻辑进程begincase(cstate)//--确定当前状态值s0:dataout<=4'b0001;//对应状态s0的数据输出为"0001"s1:dataout<=4'b0010;s2:dataout<=4'b0100;s3:dataout<=4'b1000;endcaseendendmodule//分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080 always@(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验14Mealy状态机module mealy(dataout,clk,datain,reset);output[3:0]dataout;input[1:0]datain;input clk,reset;parameter s0=2'b00,//采用格雷码编码s1=2'b01,s2=2'b11,s3=2'b10;reg[1:0]cstate,nstate;reg[3:0]dataout;always@(posedge clk or posedge reset)//时序逻辑进程if(reset)//异步复位cstate<=s0;else//--当检测到时钟上升沿时执行CASE语句begincstate<=nstate;endalways@(cstate or datain)begincase(cstate)s0:begin if(datain==0)nstate<=s1;else nstate<=s0;ends1:begin if(datain==1)nstate<=s2;else nstate<=s1;ends2:begin if(datain==2)nstate<=s3;else nstate<=s2;ends3:begin if(datain==3)nstate<=s0;else nstate<=s3;end//由信号state将当前状态值带出此进程,进入组合逻辑进程endcaseendalways@(cstate or datain)//组合逻辑进程begincase(cstate)//--确定当前状态值s0:begin if(datain==0)dataout<=4'b0001;else dataout<=4'b0000;end//对应状态s0,输入datain为0时,数据输出为"0001",即输出由当前状态和输入同时控制;s1:begin if(datain==1)dataout<=4'b0010;else dataout<=4'b0101;ends2:begin if(datain==2)dataout<=4'b0100;else dataout<=4'b0011;ends3:begin if(datain==3)dataout<=4'b1000;else dataout<=4'b0110;endendcaseendendmodule实验15三层电梯module lift_3(buttonclk,liftclk,reset,f1upbutton,f2upbutton,f2dnbutton, f3dnbutton,stop1button,stop2button,stop3button,position,doorlight,udsig,fdnlight,fuplight);input buttonclk;//input liftclk;//电梯运行时钟input reset;//resetinput f1upbutton;//from1st floor to upstairsinput f2upbutton;//from2nd floor to upstairsinput f2dnbutton;//from2nd floor to downstairsinput f3dnbutton;//from3rd floor to downstairsinput stop1button;//signal to stop the lift on floor1input stop2button;//stop on floor2input stop3button;//stop on floor3output[2:1]fuplight;reg[2:1]fuplight;//regoutput[3:2]fdnlight;reg[3:2]fdnlight;reg[3:1]stoplight;reg[1:0]position;output doorlight;//close or open开关指示灯reg doorlight;output udsig;//up or down signalreg udsig;parameter[3:0]stopon1=0;///state machineparameter[3:0]dooropen=1;parameter[3:0]doorclose=2;parameter[3:0]doorwait1=3;parameter[3:0]doorwait2=4;parameter[3:0]doorwait3=5;parameter[3:0]doorwait4=6;parameter[3:0]up=7;parameter[3:0]down=8;parameter[3:0]stop=9;reg[3:0]mylift;//reg clearup;reg cleardn;reg[1:0]pos;always@(posedge reset or posedge liftclk)beginif(reset==1'b1)///asyn resetbeginmylift=stopon1;//defalut positon:floor1clearup=1'b0;//clear upcleardn=1'b0;//clear downendelsebegincase(mylift)//FSMstopon1:///stop on floor1begindoorlight=1'b1;position=1;//the lift positon flagpos=1;//mylift=doorwait1;enddoorwait1:beginmylift=doorwait2;//2nd secondsenddoorwait2:beginclearup=1'b0;//cleardn=1'b0;mylift=doorwait3;//3rd sec.senddoorwait3:beginmylift=doorwait4;//4th secondenddoorwait4:beginmylift=doorclose;//enddoorclose://after4seconds,close the doorbegindoorlight=1'b0;if(udsig==1'b0)//going upbeginif(position==3)//on floor3beginif(stoplight==3'b000&fuplight==2'b00& fdnlight==2'b00)//no requestsbeginudsig=1'b1;///mylift=doorclose;endelsebeginudsig=1'b1;mylift=down;//if not,must be going downendendelse if(position==2)//on floor2beginif(stoplight==3'b000&fuplight==2'b00& fdnlight==2'b00)//no requestsbeginudsig=1'b0;//still going upmylift=doorclose;//closingendelse if((stoplight[3])==1'b1|((stoplight[3])==1'b0&(fdnlight[3])==1'b1))begin//inside req to stop onf.3,or req.to go down from f.3udsig=1'b0;//still going upmylift=up;endelsebegin//must be going down whatever happensudsig=1'b1;mylift=down;endendelse if(position==1)//on floor1beginif(stoplight==3'b000&fuplight==2'b00& fdnlight==2'b00)//no req.beginudsig=1'b0;mylift=doorclose;//waiting for the going up reqendelsebeginudsig=1'b0;//must be going upmylift=up;endendendelse if(udsig==1'b1)//if going downbeginif(position==1)//beginif(stoplight==3'b000&fuplight==2'b00& fdnlight==2'b00)beginudsig=1'b0;//no reqmylift=doorclose;//waiting for the req to go upendelsebeginudsig=1'b0;//going up at any casemylift=up;endendelse if(position==2)beginif(stoplight==3'b000&fuplight==2'b00& fdnlight==2'b00)beginudsig=1'b1;mylift=doorclose;endelse if((stoplight[1])==1'b1|((stoplight[1]) ==1'b0&(fuplight[1])==1'b1))beginudsig=1'b1;//downmylift=down;endelsebeginudsig=1'b0;//mylift=up;endendelse if(position==3)///beginif(stoplight==3'b000&fuplight==2'b00& fdnlight==2'b00)beginudsig=1'b1;mylift=doorclose;endelsebeginudsig=1'b1;mylift=down;endendendendup:///going up stairsbeginposition=position+1;//under the lift clockpos=pos+1;//if(pos<3&((stoplight[pos])==1'b1|(fuplight[pos]) ==1'b1))begin//destination isn't the top,to stop there or going up from theremylift=stop;//stop the liftendelse if(pos==3&((stoplight[pos])==1'b1| (fdnlight[pos])==1'b1))begin//has been on f.3,and stop here request or go dowm reqmylift=stop;//next state:stopendelsebeginmylift=doorclose;//endenddown://go downbeginposition=position-1;pos=pos-1;if(pos>1&((stoplight[pos])==1'b1|(fdnlight[pos]) ==1'b1))beginmylift=stop;//stop hereendelse if(pos==1&((stoplight[pos])==1'b1| (fuplight[pos])==1'b1))beginmylift=stop;endelsebeginmylift=doorclose;//no req to stop or go up,closedendendstop://beginmylift=dooropen;//next state to openenddooropen:begindoorlight=1'b1;if(udsig==1'b0)//going upbeginif(position<=2&((stoplight[position])==1'b1 |(fuplight[position])==1'b1))beginclearup=1'b1;endelsebeginclearup=1'b1;cleardn=1'b1;endendelse if(udsig==1'b1)beginif(position>=2&((stoplight[position])==1'b1 |(fdnlight[position])==1'b1))begincleardn=1'b1;endelsebeginclearup=1'b1;cleardn=1'b1;endendmylift=doorwait1;endendcaseendendalways@(posedge reset or posedge buttonclk)//控制按键信号灯beginif(reset==1'b1)//asyn resetbeginstoplight=3'b000;fuplight=2'b00;fdnlight=2'b00;endelse//posedge buttonclkbeginif(clearup==1'b1)//begin//内部停靠信号灯和外部上升请求信号灯灭stoplight[position]=1'b0;fuplight[position]=1'b0;endelse//beginif(f1upbutton==1'b1)beginfuplight[1]=1'b1;endelse if(f2upbutton==1'b1)beginfuplight[2]=1'b1;endendif(cleardn==1'b1)beginstoplight[position]=1'b0;fdnlight[position]=1'b0;endelsebeginif(f2dnbutton==1'b1)beginfdnlight[2]=1'b1;endelse if(f3dnbutton==1'b1)beginfdnlight[3]=1'b1;endendif(stop1button==1'b1)beginstoplight[1]=1'b1;endelse if(stop2button==1'b1)beginstoplight[2]=1'b1;endelse if(stop3button==1'b1)beginstoplight[3]=1'b1;endendendendmodule//分频器部分,获得电梯运行(慢)和扫描按键请求的时钟(快)module clk_div(clk_10hz,clk_1hz,clk_in);input clk_in;output clk_1hz,clk_10hz;reg clk_1hz,clk_10hz;reg[25:0]counter1;//50_000_000=1011_1110_1011_1100_0010_0000_00 reg[22:0]counter2;//5,000,000=1001_1000_1001_0110_1000_000parameter cnt1=50_000_000;///50MHz is the sys clk,50_000_000=2FAF080,1HZ parameter cnt2=5_000_000;//to10HZalways@(posedge clk_in)begincounter1<=counter1+1;if(counter1==cnt1/2-1)beginclk_1hz<=!clk_1hz;counter1<=0;endend///clk_10hz,10HZalways@(posedge clk_in)begincounter2<=counter2+1;if(counter2==cnt2/2-1)beginclk_10hz<=!clk_10hz;counter2<=0;endendendmodule。