常用Verilog代码
Verilog编写的CIC代码

Verilog编写的CIC代码//internalclk >= 8*outputclkmodule cicmodule(inputclk, internalclk, outputclk, preset, datainput, dataoutput); parameter DataWidth=18;parameter OutputDiv=4; //OutputDiv=(order-1)*ln(outputclk/inputclk)/ln(2)input inputclk;input internalclk;input outputclk;input preset;input signed [(DataWidth-1):0] datainput;output signed [(DataWidth-1):0] dataoutput;//registersreg inputclkperiod;reg [2:0] statecount;reg signed [(DataWidth-1):0] inputreg;//--stage 1 (comb) signals,gain=2 -> + 1 bitreg signed [DataWidth:0] int0;//--stage 2 (comb) signals,gain=2 -> + 1 bitreg signed [DataWidth+1:0] int1;//--stage 3 (comb) signals,gain=2 -> + 1 bitreg signed [DataWidth+2:0] int2;reg signed [DataWidth+2:0] tempreg0;reg signed [DataWidth+2:0] tempreg1;//--stage 4 (integrator) signals,gain=2 -> + 1 bitreg signed [DataWidth+4:0] int3;//--stage 5 (integrator) signals,gain=0.5 -> - 1 bitreg signed [DataWidth+5:0] int4;//--stage 6 (integrator) signals,gain=4 -> + 2 bitreg signed [DataWidth+7:0] int5;reg signed [DataWidth+7:0] addInputA;reg signed [DataWidth+7:0] addInputB;reg signed [DataWidth+7:0] addInputBsig;reg addsubSelect;wire signed [DataWidth+7:0] addOutput;//Add/sunalways @ (addInputB or addsubSelect)beginif (addsubSelect)addInputBsig=-addInputB;elseaddInputBsig=addInputB;end//Addassign addOutput=addInputA+addInputBsig;//Output assignassign dataoutput=int5>>>OutputDiv;//Clk operationsalways @ (posedge inputclk or posedge outputclk or posedge preset) beginif (preset==1)inputclkperiod=1;else if(inputclk==1)inputclkperiod=1;elseinputclkperiod=0;endalways @ (posedge inputclk or posedge preset)beginif (preset==1'b1)inputreg=0;elseinputreg =datainput;endalways @ (posedge internalclk or posedge inputclk or posedge preset) beginif(preset==1)statecount=0;else if (inputclk==1)statecount=0;elsestatecount=statecount+1;endalways @ (negedge internalclk or posedge preset)beginif(preset==1) begintempreg0=0;tempreg1=0;int0=0;int1=0;int2=0;int3=0;int4=0;int5=0;endelse begincase (statecount)3'd0: beginif (inputclkperiod==1) begintempreg0=addOutput;int0=inputreg;endend3'd1: beginif (inputclkperiod==1) begintempreg1=addOutput;int1=inputreg;endend3'd2: beginif (inputclkperiod==1) beginint2=inputreg1;tempreg0=addOutput;endend3'd3: beginint3=addOutput;end3'd4: beignint4=addOutput;end3'd5: beginint5=addOutput;endendcaseendend//Combinatorial logicalways @ (statecount, inputreg,int0, int1, int2, int3, int4, int5, tempreg0,tempreg1, inputclkperiod)begincase (statecount)3'd0: beginaddInputA=inputreg;addInputB=int0;addsubSelect=1;end3'd1: beginaddInputA=tempreg0;addInputB=int1;addsubSelect=1;end3'd2: beginaddInputA=tempreg1;addInputB=int2;addsubSelect=1;end3'd3: beginaddInputA=int3;addInputB=(inputclkperiod == 1'b1) ? tempreg0 : 0; //UpsamplingaddsubSelect=0;end3'd4: beginaddInputA=int4;addInputB=int3;addsubSelect=0;end3'd5: beginaddInputA=int5;addInputB=int4;addsubSelect=0;endendcaseendendmodule。
verilog代码乘法除法编写

Verilog代码乘法除法1. 引言Verilog是一种硬件描述语言,用于设计和建模数字电路。
在数字电路中,乘法和除法是常见的运算操作。
本文将介绍如何使用Verilog编写乘法和除法的代码,并提供一些示例来帮助读者更好地理解。
2. 乘法2.1 基本原理乘法是一种基本的算术运算,用于计算两个数的积。
在数字电路中,我们可以使用逻辑门和触发器来实现乘法运算。
2.2 Verilog代码示例下面是一个简单的Verilog代码示例,用于实现两个8位无符号整数的乘法运算:module multiplier (input [7:0] a,input [7:0] b,output reg [15:0] result);always @(*) beginresult = a * b;endendmodule上述代码定义了一个名为multiplier的模块,该模块有两个输入端口a和b,以及一个输出端口result。
在always @(*)块中,我们使用乘法操作符将输入端口a和b相乘,并将结果存储在输出端口result中。
2.3 测试与验证为了测试上述的乘法模块,我们可以编写一个测试台,输入一些测试用例,并验证输出结果是否正确。
module multiplier_test;reg [7:0] a;reg [7:0] b;wire [15:0] result;multiplier dut(.a(a),.b(b),.result(result));initial begin// Test case 1: a = 5, b = 3a = 5;b = 3;#10; // Wait for 10 time unitsif (result !== 15)$display("Test case 1 failed");// Test case 2: a = 10, b = 0a = 10;b = 0;#10; // Wait for 10 time unitsif (result !== 0)$display("Test case 2 failed");// Add more test cases here...endendmodule上述代码定义了一个名为multiplier_test的测试台模块。
verilog hdl语言100例详解

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代码

2'b01: AN<=4'b1011;
2'b10: AN<=4'b1101;
2'b11: AN<=4'b1110;
default:AN<=4'b1111;
endcase
end
always @(*)
begin
case (Data[3:0])
0:seg[7:0]<=8'b00000011;
begin
case(BIT_SEL)
0: Data_4[3:0] <= Data[15:12];
1: Data_4[3:0] <= Data[11:8];
2: Data_4[3:0] <= Data[7:4];
3: Data_4[3:0] <= Data[3:0];
default:Data_4[3:0] <= Data[3:0];
output [7:0] SEG
);
reg[3:0] Data_4;
reg[1:0] BIT_SEL;
reg[15:0] cnt;
SMG_1 SMG_i(SEG,AN,BIT_SEL,Data_4);
always @(posedge CLK or posedge CLR)
if(CLR)
begin
cnt<=16'b0;
控制每个数码管显示对应位的数字begincase
数码管显示的Verilog代码
//用4个数码管显示一个16位二进制数据Data,每个数码管显示各自的数据0.2ms
module SMG_4(
verilog2的n次方用代码

Verilog2的n次方用代码1. 引言Verilog作为硬件描述语言,可以用于设计数字逻辑电路和系统。
在实际应用中,很多时候我们会遇到需要计算某个数的n次方的情况,可能是为了实现某些特定的功能或者算法。
那么如何用Verilog来实现一个数的n次方呢?本文将从简单到复杂,由浅入深地探讨这个问题。
2. Verilog实现2的n次方我们来看如何用Verilog实现一个数的2的n次方。
假设我们需要计算一个数x的2的n次方,我们可以使用位移操作来实现。
具体来说,我们可以将x左移n位,相当于x乘以2的n次方。
下面是一个简单的Verilog代码示例:```verilogmodule power_of_2(input [7:0] x,input [2:0] n,output [9:0] result);assign result = x << n;endmodule```在这个示例中,我们定义了一个名为power_of_2的模块,该模块接受一个8位的输入x和一个3位的输入n,然后输出一个10位的结果。
在assign语句中,我们使用了位移操作符<<来将x左移n位,从而得到结果。
3. Verilog实现任意数的n次方如果我们需要计算一个数x的任意n次方,我们可以使用循环和累乘的方法来实现。
下面是一个用Verilog实现任意数的n次方的示例代码:```verilogmodule power_of_n(input [7:0] x,input [2:0] n,output [15:0] result);reg [15:0] temp;reg [2:0] i;always @(*)begintemp = 1;for(i = 0; i < n; i = i + 1)begintemp = temp * x;endendassign result = temp;endmodule```在这个示例中,我们定义了一个名为power_of_n的模块,该模块接受一个8位的输入x和一个3位的输入n,然后输出一个16位的结果。
i2cverilog代码

4'd5: sda_r <= db_r[2]; 4'd6: sda_r <= db_r[1]; 4'd7: sda_r <= db_r[0]; default:endcase//sda_r <= db_r[4'd7-num]; //送EEPROM地址(高bit开始)cstate <= ADD2;endend//else if(`SCL_POS) db_r <= {db_r[6:0],1'b0}; //器件地址左移1bitelsecstate <= ADD2;endACK2:beginif(/*!sda*/`SCL_NEG) begin//从机响应信号if(!sw1_r) begincstate <= DATA;//写操作db_r <= `WRITE_DATA; //写入的数据endelse if(!sw2_r) begindb_r <= `DEVICE_READ; //送器件地址(读操作)地址读需要执行该步骤以下操作cstate <= START2;//读操作endendelse cstate <= ACK2;//等待从机响应START2: begin //读操作起始位if(`SCL_LOW) beginsda_link <= 1'b1; //sda作为outputsda_r <= 1'b1;//拉高数据线sdacstate <= START2;endelse if(`SCL_HIG) begin //scl为高电平中间sda_r <= 1'b0;//拉低数据线sda,产生起始位信号cstate <= ADD3;endelse cstate <= START2; endADD3:begin//送读操作地址if(`SCL_LOW) beginif(num==4'd8) beginnum <= 4'd0;//num计数清零sda_r <= 1'b1;sda_link <= 1'b0;//sda置为高阻态(input)cstate <= ACK3; endelse beginnum <= num+1'b1; case (num)4'd0: sda_r <= db_r[7];4'd1: sda_r <= db_r[6]; 4'd2: sda_r <= db_r[5]; 4'd3: sda_r <= db_r[4]; 4'd4: sda_r <= db_r[3];4'd5: sda_r <= db_r[2]; 4'd6: sda_r <= db_r[1]; 4'd7: sda_r <= db_r[0]; default:endcase//sda_r <= db_r[4'd7-num]; //送EEPROM地址(高bit开始)cstate <= ADD3;endend//else if(`SCL_POS) db_r <= {db_r[6:0],1'b0}; //器件地址左移1bitelse cstate <= ADD3;endACK3:beginif(/*!sda*/`SCL_NEG) begincstate <= DATA;//从机响应信号sda_link <= 1'b0;endelse cstate <= ACK3;//等待从机响应endDATA:beginif(!sw2_r) begin//读操作if(num<=4'd7) begin cstate <= DATA;if(`SCL_HIG) beginnum <= num+1'b1; case (num)4'd0: read_data[7] <= sda;4'd1: read_data[6] <= sda; 4'd2: read_data[5] <= sda; 4'd3: read_data[4] <= sda; 4'd4: read_data[3] <= sda;4'd5: read_data[2] <= sda; 4'd6: read_data[1] <= sda; 4'd7: read_data[0] <= sda;default:endcase//read_data[4'd7-num] <= sda; // 读数据(高开始)end//elseif(`SCL_NEG)read_data<={read_data[6:0],read_data[7]}; //数据循环右移endelse if((`SCL_LOW) && (num==4'd8)) beginnum <= 4'd0;//num计数清零cstate <= ACK4;endelse cstate <= DATA;endelse if(!sw1_r) begin //写操作sda_link <= 1'b1;if(num<=4'd7) begin cstate <= DATA;if(`SCL_LOW) beginsda_link <= 1'b1;//数据线sda作为outputnum <= num+1'b1; case (num)4'd0: sda_r <= db_r[7]; 4'd1: sda_r <= db_r[6]; 4'd2: sda_r <= db_r[5]; 4'd3: sda_r <= db_r[4];4'd4: sda_r <= db_r[3]; 4'd5: sda_r <= db_r[2]; 4'd6: sda_r <= db_r[1]; 4'd7: sda_r <= db_r[0];default:endcase//sda_r <= db_r[4'd7-num]; //写入数据(高bit开始)end//else if(`SCL_POS) db_r <= {db_r[6:0],1'b0}; //写入数据左移1bitendelse if((`SCL_LOW) && (num==4'd8)) beginnum <= 4'd0;sda_r <= 1'b1;sda_link <= 1'b0;//sda置为高阻态cstate <= ACK4;endelse cstate <= DATA;endendACK4: beginif(/*!sda*/`SCL_NEG) begin //sda_r <= 1'b1; cstate <= STOP1; endelse cstate <= ACK4; endSTOP1:beginif(`SCL_LOW) beginsda_link <= 1'b1;sda_r <= 1'b0;cstate <= STOP1;endelse if(`SCL_HIG) begin sda_r <= 1'b1; //scl为高时,sda产生上升沿(结束信号)cstate <= STOP2;endelse cstate <= STOP1;endSTOP2:beginif(`SCL_LOW) sda_r <= 1'b1;else if(cnt_20ms==20'hffff0) cstate <= IDLE;else cstate <= STOP2;enddefault: cstate <= IDLE;endcaseendassign sda = sda_link ? sda_r:1'bz;assign dis_data = read_data;//---------------------------------------------endmodule写寄存器的标准流程为:1. Master发起START2. Master发送I2C addr(7bit)和w操作0(1bit),等待ACK3. Slave发送ACK4. Master发送reg addr(8bit),等待ACK5. Slave发送ACK6. Master发送data(8bit),即要写入寄存器中的数据,等待ACK7. Slave发送ACK8. 第6步和第7步可以重复多次,即顺序写多个寄存器9. Master发起STOP读寄存器的标准流程为:1. Master发送I2C addr(7bit)和w操作1(1bit),等待ACK2. Slave发送ACK3. Master发送reg addr(8bit),等待ACK4. Slave发送ACK5. Master发起START6. Master发送I2C addr(7bit)和r操作1(1bit),等待ACK7. Slave发送ACK8. Slave发送data(8bit),即寄存器里的值9. Master发送ACK10. 第8步和第9步可以重复多次,即顺序读多个寄存器原理整理清楚编程思路就有了,首先要有开始工作的信号,分读和写来驱动I2C,本设计用M2408这款芯片进行工作,主要是了解到datasheet中时序的要求来进行编写。
Verilog实例代码

【例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)beginif (reset) out<=0; //同步复位else out<=out+1; //计数endendmodule【例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的取值initialbegina=0;b=0;cin=0;for(i=1;i<16;i=i+1)#10 a=i; //设定a的取值endinitialbeginfor(j=1;j<16;j=j+1)#10 b=j; //设定b的取值endinitial//定义结果显示格式begin$monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum);#160 $finish;endendmodule【例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; //产生时钟波形initialbegin//激励信号定义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,Doutput F; //模块的输出端口为Fwire A,B,C,D,F; //定义信号的数据类型assign F= ~((A&B)|(C&D)); //逻辑功能描述endmodule【例5.1】用case语句描述的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;endcaseendmodule【例5.2】同步置数、同步清零的计数器module count(out,data,load,reset,clk);output[7:0] out;input[7:0] data;input load,clk,reset;reg[7:0] out;always @(posedge clk) //clk上升沿触发beginif (!reset) out = 8'h00; //同步清0,低电平有效else if (load) out = data; //同步预置else out = out + 1; //计数endendmodule【例5.3】用always过程语句描述的简单算术逻辑单元`define add 3'd0`define minus 3'd1`define band 3'd2`define bor 3'd3`define bnot 3'd4module alu(out,opcode,a,b);output[7:0] out;reg[7:0] out;input[2:0] opcode; //操作码input[7:0] a,b; //操作数always@(opcode or a or b) //电平敏感的always块begincase(opcode)`add: out = a+b; //加操作`minus: out = a-b; //减操作`band: out = a&b; //求与`bor: out = a|b; //求或`bnot: out=~a; //求反default: out=8'hx; //未收到指令时,输出任意态endcaseendendmodule【例5.4】用initial过程语句对测试变量A、B、C赋值`timescale 1ns/1nsmodule test;reg A,B,C;initialbeginA = 0;B = 1;C = 0;#50 A = 1; B = 0;#50 A = 0; C = 1;#50 B = 1;#50 B = 0; C = 0;#50 $finish ;endendmodule【例5.5】用begin-end串行块产生信号波形`timescale 10ns/1nsmodule wave1;reg wave;parameter cycle=10;initialbeginwave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) $finish ;endinitial $monitor($time,,,"wave=%b",wave); endmodule【例5.6】用fork-join并行块产生信号波形`timescale 10ns/1nsmodule wave2;reg wave;parameter cycle=5;initialforkwave=0;#(cycle) wave=1;#(2*cycle) wave=0;#(3*cycle) wave=1;#(4*cycle) wave=0;#(5*cycle) wave=1;#(6*cycle) $finish;joininitial $monitor($time,,,"wave=%b",wave); endmodule【例5.7】持续赋值方式定义的2选1多路选择器module MUX21_1(out,a,b,sel);input a,b,sel;output out;assign out=(sel==0)?a:b;//持续赋值,如果sel为0,则out=a ;否则out=b endmodule【例5.8】阻塞赋值方式定义的2选1多路选择器module MUX21_2(out,a,b,sel);input a,b,sel;output out;reg out;always@(a or b or sel)beginif(sel==0) out=a; //阻塞赋值else out=b;endendmodule【例5.9】非阻塞赋值module non_block(c,b,a,clk);output c,b;input clk,a;reg c,b;always @(posedge clk)beginb<=a;c<=b;endendmodule【例5.10】阻塞赋值module block(c,b,a,clk);output c,b;input clk,a;reg c,b;always @(posedge clk)beginb=a;c=b;endendmodule【例5.11】模为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上升沿时刻计数if (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; //产生进位输出信号endmodule【例5.12】BCD码—七段数码管显示译码器module decode4_7(decodeout,indec);output[6:0] decodeout;input[3:0] indec;reg[6:0] decodeout;alwaysbegincase(indec) //用case语句进行译码4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011;default: decodeout=7'bx;endcaseend【例5.13】用casez描述的数据选择器module mux_casez(out,a,b,c,d,select); output out;input a,b,c,d;input[3:0] select;reg out;always @(select or a or b or c or d) begincasez(select)4'b???1: out = a;4'b??1?: out = b;4'b?1??: out = c;4'b1???: out = d;endcaseendendmodule【例5.14】隐含锁存器举例module buried_ff(c,b,a);output c;input b,a;reg c;always @(a or b)beginif((b==1)&&(a==1)) c=a&b;endendmodule【例5.15】用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【例5.16】用for语句实现2个8位数相乘module mult_for(outcome,a,b);parameter size=8;input[size:1] a,b; //两个操作数output[2*size:1] outcome; //结果reg[2*size:1] outcome;integer i;always @(a or b)beginoutcome=0;for(i=1; i<=size; i=i+1) //for语句if(b[i]) outcome=outcome +(a << (i-1));endendmodule【例5.17】用repeat实现8位二进制数的乘法module mult_repeat(outcome,a,b);parameter size=8;input[size:1] a,b;output[2*size:1] outcome;reg[2*size:1] temp_a,outcome;reg[size:1] temp_b;always @(a or b)beginoutcome=0;temp_a=a;temp_b=b;repeat(size) //repeat语句,size为循环次数beginif(temp_b[1]) //如果temp_b的最低位为1,就执行下面的加法outcome=outcome+temp_a;temp_a=temp_a<<1; //操作数a左移一位temp_b=temp_b>>1; //操作数b右移一位endendendmodule【例5.18】同一循环的不同实现方式module loop1; //方式1integer i;initialfor(i=0;i<4;i=i+1) //for语句begin$display(“i=%h”,i);endendmodulemodule loop2; //方式2integer i;initial begini=0;while(i<4) //while语句begin$display ("i=%h",i);i=i+1;endendendmodulemodule loop3; //方式3integer i;initial begini=0;repeat(4) //repeat语句begin$display ("i=%h",i);i=i+1;endendendmodule【例5.19】使用了`include语句的16位加法器`include "adder.v"module adder16(cout,sum,a,b,cin);output cout;parameter my_size=16;output[my_size-1:0] sum;input[my_size-1:0] a,b;input cin;adder my_adder(cout,sum,a,b,cin); //调用adder模块endmodule//下面是adder模块代码module adder(cout,sum,a,b,cin);parameter size=16;output cout;output[size-1:0] sum;input cin;input[size-1:0] a,b;assign {cout,sum}=a+b+cin;endmodule【例5.20】条件编译举例module compile(out,A,B);output out;input A,B;`ifdef add //宏名为add assign out=A+B;`elseassign out=A-B;`endifendmodule【例6.1】加法计数器中的进程module count(data,clk,reset,load,cout,qout);output cout;output[3:0] qout;reg[3:0] qout;input[3:0] data;input clk,reset,load;always @(posedge clk) //进程1,always过程块beginif (!reset) qout= 4'h00; //同步清0,低电平有效else if (load) qout= data; //同步预置else qout=qout + 1; //加法计数endassign cout=(qout==4'hf)?1:0; //进程2,用持续赋值产生进位信号endmodule【例6.2】任务举例module alutask(code,a,b,c);input[1:0] code;input[3:0] a,b;output[4:0] c;reg[4:0] c;task//任务定义,注意无端口列表input//a,b,out名称的作用域范围为task任务内部output[4:0] out;integer i;beginfor(i=3;i>=0;i=i-1)out[i]=a[i]&b[i]; //按位与endendtaskalways@(code or a or b)begincase(code)2'b00: my_and(a,b,c);/* 调用任务my_and,需注意端口列表的顺序应与任务定义中的一致,这里的a,b,c 分别对应任务定义中的a,b,out */2'b01: c=a|b; //或2'b10: c=a-b; //相减2'b11: c=a+b; //相加endcaseendendmodule【例6.3】测试程序`include "alutask.v"module alu_tp;reg[3:0] a,b;reg[1:0] code;wire[4:0] c;parameter DELY = 100;alutask ADD(code,a,b,c); //调用被测试模块initial begincode=4'd0; a= 4'b0000; b= 4'b1111;#DELY code=4'd0; a= 4'b0111; b= 4'b1101;#DELY code=4'd1; a= 4'b0001; b= 4'b0011;#DELY code=4'd2; a= 4'b1001; b= 4'b0011;#DELY code=4'd3; a= 4'b0011; b= 4'b0001;#DELY code=4'd3; a= 4'b0111; b= 4'b1001;#DELY $finish;endinitial $monitor($time,,,"code=%b a=%b b=%b c=%b", code,a,b,c); endmodule【例6.4】函数function[7:0] get0;input[7:0] x;reg[7:0] count;integer i;begincount=0;for (i=0;i<=7;i=i+1)if (x[i]=1'b0) count=count+1;get0=count;endendfunction【例6.5】用函数和case语句描述的编码器(不含优先顺序)module code_83(din,dout);input[7:0] din;output[2:0] dout;function[2:0] code; //函数定义input[7:0] din; //函数只有输入,输出为函数名本身casex (din)8'b1xxx_xxxx : code = 3'h7;8'b01xx_xxxx : code = 3'h6;8'b001x_xxxx : code = 3'h5;8'b0001_xxxx : code = 3'h4;8'b0000_1xxx : code = 3'h3;8'b0000_01xx : code = 3'h2;8'b0000_001x : code = 3'h1;8'b0000_000x : code = 3'h0;default: code = 3'hx;endcaseendfunctionassign dout = code(din) ; //函数调用endmodule【例6.6】阶乘运算函数module funct(clk,n,result,reset);output[31:0] result;input[3:0] n;input reset,clk;reg[31:0] result;always @(posedge clk) //在clk的上升沿时执行运算beginif(!reset) result<=0; //复位else beginresult <= 2 * factorial(n); //调用factorial函数endendfunction[31:0] factorial; //阶乘运算函数定义(注意无端口列表)input[3:0] opa; //函数只能定义输入端,输出端口为函数名本身reg[3:0] i;beginfactorial = opa ? 1 : 0;for(i= 2; i <= opa; i = i+1) //该句若要综合通过,opa应赋具体的数值factorial = i* factorial; //阶乘运算endfunctionendmodule【例6.7】测试程序`define clk_cycle 50`include "funct.v"module funct_tp;reg[3:0] n;reg reset,clk;wire[31:0] result;initial//定义激励向量beginn=0; reset=1; clk=0;for(n=0;n<=15;n=n+1)#100 n=n;endinitial $monitor($time,,,"n=%d result=%d",n,result);//定义输出显示格式always # `clk_cycle clk=~clk; //产生时钟信号funct funct_try(.clk(clk),.n(n),.result(result),.reset(reset));//调用被测试模块endmodule【例6.8】顺序执行模块1module serial1(q,a,clk);output q,a;input clk;reg q,a;always @(posedge clk)beginq=~q;a=~q;endendmodule【例6.9】顺序执行模块2module serial2(q,a,clk);input clk;reg q,a;always @(posedge clk)begina=~q;q=~q;endendmodule【例6.10】并行执行模块1 module paral1(q,a,clk); output q,a;input clk;reg q,a;always @(posedge clk)beginq=~q;endalways @(posedge clk)begina=~q;endendmodule【例6.11】并行执行模块2 module paral2(q,a,clk); output q,a;input clk;reg q,a;always @(posedge clk)begina=~q;endalways @(posedge clk)beginq=~q;endendmodulemodule mux4_1a(out,in1,in2,in3,in4,cntrl1,cntrl2); output out;input in1,in2,in3,in4,cntrl1,cntrl2;wire notcntrl1,notcntrl2,w,x,y,z;not(notcntrl1,cntrl2),(notcntrl2,cntrl2);and (w,in1,notcntrl1,notcntrl2),(x,in2,notcntrl1,cntrl2),(y,in3,cntrl1,notcntrl2),(z,in4,cntrl1,cntrl2);or (out,w,x,y,z);endmodule【例7.2】用case语句描述的4选1 MUXmodule mux4_1b(out,in1,in2,in3,in4,cntrl1,cntrl2); output out;input in1,in2,in3,in4,cntrl1,cntrl2;reg out;always@(in1 or in2 or in3 or in4 or cntrl1 or cntrl2) case({cntrl1,cntrl2})2'b00:out=in1;2'b01:out=in2;2'b10:out=in3;2'b11:out=in4;default:out=2'bx;endcaseendmodule【例7.3】行为描述方式实现的4位计数器module count4(clk,clr,out);input clk,clr;output[3:0] out;reg[3:0] out;always @(posedge clk or posedge clr)beginif (clr) out<=0;else out<=out+1;endendmodule【例7.4】数据流方式描述的4选1 MUXmodule mux4_1c(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assign out=(in1 & ~cntrl1 & ~cntrl2)|(in2 & ~cntrl1 & cntrl2)| (in3 & cntrl1 & ~cntrl2)|(in4 & cntrl1 & cntrl2); endmodule【例7.5】用条件运算符描述的4选1 MUXmodule mux4_1d(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assign out=cntrl1 ? (cntrl2 ? in4:in3):(cntrl2 ? in2:in1); endmodule【例7.6】门级结构描述的2选1MUXmodule mux2_1a(out,a,b,sel);output out;input a,b,sel;not (sel_,sel);and(a1,a,sel_),(a2,b,sel);or (out,a1,a2);endmodule【例7.7】行为描述的2选1MUXmodule mux2_1b(out,a,b,sel);output out;input a,b,sel;reg out;always @(a or b or sel)beginif(sel) out = b;else out = a;endendmodule【例7.8】数据流描述的2选1MUXmodule MUX2_1c(out,a,b,sel);input a,b,sel;assign out = sel ? b : a;endmodule【例7.9】调用门元件实现的1位半加器module half_add1(a,b,sum,cout);input a,b;output sum,cout;and(cout,a,b);xor(sum,a,b);endmodule【例7.10】数据流方式描述的1位半加器module half_add2(a,b,sum,cout);input a,b;output sum,cout;assign sum=a^b;assign cout=a&b;endmodule【例7.11】采用行为描述的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; endendcaseendendmodule【例7.12】采用行为描述的1位半加器module half_add4(a,b,sum,cout);input a,b;reg sum,cout;always @(a or b)beginsum= a^b;cout=a&b;endendmodule【例7.13】调用门元件实现的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);endmodule【例7.14】数据流描述的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); endmodule【例7.15】1位全加器module full_add3(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign {cout,sum}=a+b+cin;endmodule【例7.16】行为描述的1位全加器module full_add4(a,b,cin,sum,cout);input a,b,cin;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;endendmodule【例7.17】混合描述的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【例7.18】结构描述的4位级连全加器 `include "full_add1.v"module add4_1(sum,cout,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;full_add1 f0(a[0],b[0],cin,sum[0],cin1); //级连描述full_add1 f1(a[1],b[1],cin1,sum[1],cin2);full_add1 f2(a[2],b[2],cin2,sum[2],cin3);- 21 -full_add1 f3(a[3],b[3],cin3,sum[3],cout);endmodule【例7.19】数据流描述的4位全加器module add4_2(cout,sum,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;assign {cout,sum}=a+b+cin;endmodule【例7.20】行为描述的4位全加器module add4_3(cout,sum,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;reg[3:0] sum;reg cout;always @(a or b or cin)begin{cout,sum}=a+b+cin;endendmodule【例8.1】$time与$realtime的区别`timescale 10ns/1nsmodule time_dif;reg ts;parameter delay=2.6;initialbegin#delay ts=1;#delay ts=0;#delay ts=1;#delay ts=0;endinitial $monitor($time,,,"ts=%b",ts); //使用函数$time - 22 -endmodule【例8.2】$random函数的使用`timescale 10ns/1nsmodule random_tp;integer data;integer i;parameter delay=10;initial $monitor($time,,,"data=%b",data);initial beginfor(i=0; i<=100; i=i+1)#delay data=$random; //每次产生一个随机数endendmodule【例8.3】1位全加器进位输出UDP元件primitive carry_udp(cout,cin,a,b);input cin,a,b;output cout;table//cin a b : cout //真值表0 0 0 : 0;0 1 0 : 0;0 0 1 : 0;0 1 1 : 1;1 0 0 : 0;1 0 1 : 1;1 1 0 : 1;1 1 1 : 1;endtableendprimitive【例8.4】包含x态输入的1位全加器进位输出UDP元件primitive carry_udpx1(cout,cin,a,b);input cin,a,b;output cout;table// cin a b : cout //真值表0 0 0 : 0;- 23 -0 1 0 : 0;0 0 1 : 0;0 1 1 : 1;1 0 0 : 0;1 0 1 : 1;1 1 0 : 1;1 1 1 : 1;0 0 x : 0; //只要有两个输入为0,则进位输出肯定为00 x 0 : 0;x 0 0 : 0;1 1 x : 1; //只要有两个输入为1,则进位输出肯定为11 x 1 : 1;x 1 1 : 1;endtableendprimitive【例8.5】用简缩符“?”表述的1位全加器进位输出UDP元件primitive carry_udpx2(cout,cin,a,b);input cin,a,b;output cout;table// cin a b : cout //真值表? 0 0 : 0; //只要有两个输入为0,则进位输出肯定为00 ? 0 : 0;0 0 ? : 0;? 1 1 : 1; //只要有两个输入为1,则进位输出肯定为11 ? 1 : 1;1 1 ? : 1;endtableendprimitive【例8.6】3选1多路选择器UDP元件primitive mux31(Y,in0,in1,in2,s2,s1);input in0,in1,in2,s2,s1;output Y;table//in0 in1 in2 s2 s1 : Y0 ? ? 0 0 : 0; //当s2s1=00时,Y=in01 ? ? 0 0 : 1;? 0 ? 0 1 : 0; //当s2s1=01时,Y=in1- 24 -? 1 ? 0 1 : 1;? ? 0 1 ? : 0; //当s2s1=1?时,Y=in2? ? 1 1 ? : 1;0 0 ? 0 ? : 0;1 1 ? 0 ? : 1;0 ? 0 ? 0 : 0;1 ? 1 ? 0 : 1;? 0 0 ? 1 : 0;? 1 1 ? 1 : 1;endtableendprimitive【例8.7】电平敏感的1位数据锁存器UDP元件primitive latch(Q,clk,reset,D);input clk,reset,D;output Q;reg Q;initial Q = 1'b1; //初始化table// clk reset D : state : Q? 1 ? : ? : 0 ; //reset=1,则不管其他端口为什么值,输出都为00 0 0 : ? : 0 ; //clk=0,锁存器把D端的输入值输出0 0 1 : ? : 1 ;1 0 ? : ? : - ; //clk=1,锁存器的输出保持原值,用符号“-”表示endtableendprimitive【例8.8】上升沿触发的D触发器UDP元件primitive DFF(Q,D,clk);output Q;input D,clk;reg Q;table//clk D : state : Q(01) 0 : ? : 0; //上升沿到来,输出Q=D(01) 1 : ? : 1;(0x) 1 : 1 : 1;(0x) 0 : 0 : 0;(?0) ? : ? : -; //没有上升沿到来,输出Q保持原值? (??) : ? : - ; //时钟不变,输出也不变- 25 -endprimitive【例8.9】带异步置1和异步清零的上升沿触发的D触发器UDP元件primitive DFF_UDP(Q,D,clk,clr,set);output Q;input D,clk,clr,set;reg Q;table// clk D clr s et : state : Q(01) 1 0 0 : ? : 0;(01) 1 0 x : ? : 0;? ? 0 x : 0 : 0;(01) 0 0 0 : ? : 1;(01) 0 x 0 : ? : 1;? ? x 0 : 1 : 1;(x1) 1 0 0 : 0 : 0;(x1) 0 0 0 : 1 : 1;(0x) 1 0 0 : 0 : 0;(0x) 0 0 0 : 1 : 1;? ? 1 ? : ? : 1; //异步复位? ? 0 1 : ? : 0; //异步置1n ? 0 0 : ? : -;? * ? ? : ? : -;? ? (?0) ? : ? : -;? ? ? (?0): ? : -;? ? ? ? : ? : x;endtableendprimitive【例8.12】延迟定义块举例module delay(out,a,b,c);output out;input a,b,c;and a1(n1,a,b);or o1(out,c,n1);specify(a=>out)=2;(b=>out)=3;(c=>out)=1;- 26 -endmodule【例8.13】激励波形的描述'timescale 1ns/1nsmodule test1;reg A,B,C;initialbegin//激励波形描述A = 0;B = 1;C = 0;#100 C = 1;#100 A = 1; B = 0;#100 A = 0;#100 C = 0;#100 $finish;endinitial $monitor($time,,,"A=%d B=%d C=%d",A,B,C); //显示endmodule【例8.15】用always过程块产生两个时钟信号module test2;reg clk1,clk2;parameter CYCLE = 100;alwaysbegin{clk1,clk2} = 2'b10;#(CYCLE/4) {clk1,clk2} = 2'b01;#(CYCLE/4) {clk1,clk2} = 2'b11;#(CYCLE/4) {clk1,clk2} = 2'b00;#(CYCLE/4) {clk1,clk2} = 2'b10;endinitial $monitor($time,,,"clk1=%b clk2=%b",clk1,clk2);endmodule【例8.17】存储器在仿真程序中的应用module ROM(addr,data,oe);output[7:0] data; //数据信号input[14:0] addr; //地址信号input oe; //读使能信号,低电平有效- 27 -reg[7:0] mem[0:255]; //存储器定义parameter DELAY = 100;assign #DELAY data=(oe==0) ? mem[addr] : 8'hzz;initial $readmemh("rom.hex",mem); //从文件中读入数据endmodule【例8.18】8位乘法器的仿真程序`timescale 10ns/1nsmodule mult_tp; //测试模块的名字reg[7:0] a,b; //测试输入信号定义为reg型wire [15:0] out; //测试输出信号定义为wire型integer i,j;mult8 m1(out,a,b); //调用测试对象//激励波形设定initialbegina=0;b=0;for(i=1;i<255;i=i+1)#10 a=i;endinitialbeginfor(j=1;j<255;j=j+1)#10 b=j;endinitial//定义结果显示格式begin$monitor($time,,,"%d * %d= %d",a,b,out);#2560 $finish;endendmodulemodule mult8(out, a, b); //8位乘法器源代码parameter size=8;input[size:1] a,b; //两个操作数output[2*size:1] out; //结果assign out=a*b; //乘法运算符- 28 -endmodule【例8.19】8位加法器的仿真程序`timescale 1ns/1nsmodule add8_tp; //仿真模块无端口列表reg[7:0] A,B; //输入激励信号定义为reg型reg cin;wire[7:0] SUM; //输出信号定义为wire型wire cout;parameter DELY = 100;add8 AD1(SUM,cout,A,B,cin); //调用测试对象initial begin//激励波形设定A= 8'd0; B= 8'd0; cin=1'b0;#DELY A= 8'd100; B= 8'd200; cin=1'b1;#DELY A= 8'd200; B= 8'd88;#DELY A= 8'd210; B= 8'd18; cin=1'b0;#DELY A= 8'd12; B= 8'd12;#DELY A= 8'd100; B= 8'd154;#DELY A= 8'd255; B= 8'd255; cin=1'b1;#DELY $finish;end//输出格式定义initial $monitor($time,,,"%d + %d + %b = {%b, %d}",A,B,cin,cout,SUM); endmodulemodule add8(SUM,cout,A,B,cin); //待测试的8位加法器模块output[7:0] SUM;output cout;input[7:0] A,B;input cin;assign {cout,SUM}=A+B+cin;endmodule【例8.20】2选1多路选择器的仿真`timescale 1ns/1nsmodule mux_tp;reg a,b,sel;wire out;- 29 -MUX2_1 m1(out,a,b,sel); //调用待测试模块initialbegina=1'b0; b=1'b0; sel=1'b0;#5 sel=1'b1;#5 a=1'b1; s el=1'b0;#5 sel=1'b1;#5 a=1'b0; b=1'b1; sel=1'b0;#5 sel=1'b1;#5 a=1'b1; b=1'b1; sel=1'b0;#5 sel=1'b1;endinitial $monitor($time,,,"a=%b b=%b sel=%b out=%b",a,b,sel,out);endmodulemodule MUX2_1(out,a,b,sel); //待测试的2选1MUX模块input a,b,sel;output out;not #(0.4,0.3) (sel_,sel); //#(0.4,0.3)为门延时and #(0.7,0.6) (a1,a,sel_);and #(0.7,0.6) (a2,b,sel);or #(0.7,0.6) (out,a1,a2);endmodule【例8.21】8位计数器的仿真`timescale 10ns/1nsmodule count8_tp;reg clk,reset; //输入激励信号定义为reg型wire[7:0] qout; //输出信号定义为wire型parameter DELY=100;counter C1(qout,reset,clk); //调用测试对象always #(DELY/2) clk = ~clk; //产生时钟波形initialbegin//激励波形定义clk =0; reset=0;- 30 -#DELY reset=1;#DELY reset=0;#(DELY*300) $finish;end//结果显示initial $monitor($time,,,"clk=%d reset=%d qout=%d",clk,reset,qout); endmodulemodule counter(qout,reset,clk); //待测试的8位计数器模块output[7:0] qout;input clk,reset;reg[7:0] qout;always @(posedge clk)begin if (reset) qout<=0;else qout<=qout+1;endendmodule【例9.1】基本门电路的几种描述方法(1)门级结构描述module gate1(F,A,B,C,D);input A,B,C,D;output F;nand(F1,A,B); //调用门元件and(F2,B,C,D);or(F,F1,F2);endmodule(2)数据流描述module gate2(F,A,B,C,D);input A,B,C,D;output F;assign F=(A&B)|(B&C&D); //assign持续赋值endmodule(3)行为描述module gate3(F,A,B,C,D);input A,B,C,D;output F;- 31 -reg F;always @(A or B or C or D) //过程赋值beginF=(A&B)|(B&C&D);endendmodule【例9.2】用bufif1关键字描述的三态门module tri_1(in,en,out);input in,en;output out;tri out;bufif1 b1(out,in,en); //注意三态门端口的排列顺序endmodule【例9.3】用assign语句描述的三态门module tri_2(out,in,en);output out;input in,en;assign out = en ? in : 'bz;//若en=1,则out=in;若en=0,则out为高阻态endmodule【例9.4】三态双向驱动器module bidir(tri_inout,out,in,en,b);inout tri_inout;output out;input in,en,b;assign tri_inout = en ? in : 'bz;assign out = tri_inout ^ b;endmodule【例9.5】三态双向驱动器module bidir2(bidir,en,clk);inout[7:0] bidir;input en,clk;reg[7:0] temp;assign bidir= en ? temp : 8'bz;always @(posedge clk)begin- 32 -if(en) temp=bidir;else temp=temp+1;endendmodule【例9.6】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;endcaseendendmodule【例9.7】8-3优先编码器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;- 33 -else if(b) outtemp=4'b0001;else if(a) outtemp=4'b0000;else outtemp=4'b1000;endendmodule【例9.8】用函数定义的8-3优先编码器module code_83(din, dout);input[7:0] din;output[2:0] dout;function[2:0] code; //函数定义input[7:0] din; //函数只有输入端口,输出为函数名本身if (din[7]) code = 3'd7;else if (din[6]) code = 3'd6;else if (din[5]) code = 3'd5;else if (din[4]) code = 3'd4;else if (din[3]) code = 3'd3;else if (din[2]) code = 3'd2;else if (din[1]) code = 3'd1;else code = 3'd0;endfunctionassign dout = code(din); //函数调用endmodule【例9.9】七段数码管译码器module decode47(a,b,c,d,e,f,g,D3,D2,D1,D0);output a,b,c,d,e,f,g;input D3,D2,D1,D0; //输入的4位BCD码reg a,b,c,d,e,f,g;always @(D3 or D2 or D1 or D0)begincase({D3,D2,D1,D0}) //用case语句进行译码4'd0: {a,b,c,d,e,f,g}=7'b1111110;4'd1: {a,b,c,d,e,f,g}=7'b0110000;4'd2: {a,b,c,d,e,f,g}=7'b1101101;4'd3: {a,b,c,d,e,f,g}=7'b1111001;4'd4: {a,b,c,d,e,f,g}=7'b0110011;4'd5: {a,b,c,d,e,f,g}=7'b1011011;- 34 -4'd6: {a,b,c,d,e,f,g}=7'b1011111;4'd7: {a,b,c,d,e,f,g}=7'b1110000;4'd8: {a,b,c,d,e,f,g}=7'b1111111;4'd9: {a,b,c,d,e,f,g}=7'b1111011;default: {a,b,c,d,e,f,g}=7'bx;endcaseendendmodule【例9.10】奇偶校验位产生器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【例9.11】用if-else语句描述的4选1 MUXmodule mux_if(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)beginif(sel==2'b00) out=in0;else if(sel==2'b01) out=in1;else if(sel==2'b10) out=in2;else out=in3;endendmodule【例9.12】用case语句描述的4选1 MUXmodule mux_case(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)begin- 35 -。
经典Verilog代码标准

一、工程建立规范:1、工程的组成:(1)一个顶层文件夹(2)顶层文件夹下,至少包括以下四个子文件夹a)project文件夹:存放ISE工程文件,包括ise、bit、mac等文件b)source文件夹:存放verilog源文件c)explain文件件:存放注释说明文档d)test文件夹:存放测试程序代码,可进一步分为软件调试程序、硬件调试程序2、工程的命令:(3)定层文件夹命令为top_xxx,xxx为工程的识别名称(4)顶层文件夹的子文件夹分别命名为:project、source、explain、test二、RTL CODE 规范1.标准的文件头在每一个版块的开头一定要使用统一的文件头,其中包括作者名,模块名,创建日期,概要,更改记录,版权等必要信息。
统一使用以下的文件头:// **************************************************************// COPYRIGHT(c)2005, Hislicon Technologies Co, Ltd// All rights reserved.//// IP LIB INDEX : IP lib index just sa UTOPIA_B// IP Name : the top module_name of this ip, usually, is same// as the small ip classified name just as UTOPIA// File name : file_name of the file just as “tx_fifo.v”// Module name : module_name of this file just as “TX_FIFO”// Full name : complete Emglish nme of this abbreviated//// Author : Athor/ID// Email : Author‟s email// Data :// Version : V 1.0////Abstract :// Called by : Father Module//// Modification history// ------------------------------------------------------------------------------------------------------// //// $Log$//// *********************************************************************2. 标准的module 格式(module 整体结构)对于模块的书写采用统一的格式便于项目内部成员的理解和维护,我们用批处理建立了一个MODULE模块,其内容解释如下:●端口定义按照输入,输出,双向的顺序:●模块名、模块例化名统一,例化名前加大写U_以区分(多次例化另加标识),三者关系:文件名:xxx .v (小写)模块名:Xxx (首字母大写)例化名:U1_xxx (首字母大写)IP 内部所有的模块名都要加IP名或者IP名简称作前缀,如USB_CTRL、USB_TX_FIFO。
Verilog HDL中I2C代码

if (GO==0)
SD_COUNTER=0;
else
if (SD_COUNTER < 6'b111111) SD_COUNTER=SD_COUNTER+1;
end
end
//----
always @(negedge RESET or posedge CLOCK ) begin
if (!RESET) begin SCLK=1;SDO=1; ACK1=0;ACK2=0;ACK3=0; END=1; end
verilog hdl中i2c代码 modulei2c clock,i2c_sclk, //i2c clock i2c_sdat, //i2c data i2c_data, //data:[slave_addr,sub_addr,data] go, //go transfor end, //end transfor w_r, //w_r ack, //ack reset, //test sd_counter, sdo inputclock; input [23:0]i2c_data; input go; input reset; input w_r; inout i2c_sdat; output i2c_sclk; output end; output ack; //test output [5:0] sd_counter; output sdo; reg sdo; reg sclk; reg end; reg [23:0]sd; reg [5:0]sd_counter; wire i2c_sclk=sclk (sd_counter<=30))? ~clock wirei2c_sdat=sdo?1?bz:0 regack1, ack2, ack3; wire ack=ack1 ack3;//--i2c counter always @(negedge reset posedgeclock (!reset)sd_counter=6?b111111; else begin (go==0)sd_counter=0; else 6?b111111)sd_counter=sd_counter+1; end end always@(negedge reset posedgeclock (!reset)begin sclk=1;sdo=1; ack1=0;ack2=0;ack3=0; end=1; end else case (sd_counter) 6?d0 beginack1=0 ;ack2=0 ;ack3=0 end=0;sdo=1; sclk=1;end //start 6?d1 beginsd=i2c_data;sdo=0;end 6?d2 sclk=0;//slave addr 6?d3 sdo=sd[23];6?d4 sdo=sd[22];6?d5 sdo=sd[21];6?d6 sdo=sd[20];6?d7
FPGA的verilog一些程序代码

设计一台电动机提速控制器。
当按钮S1按下1次后,电动机以速度1启动;再按下一次提高到转速2;再按下一次,提高到转速3,随后经过5s,自动提高到,转速4;当按钮s2按下时,从转速4退到转速3,再按下一次按钮s2,从转速3退到转速2,随后经过8s,退到转速1,再经过12s,停止电动机运转。
状态机源程序:module state ( v1,v2,v3,v4,d,m, t, td, k1, k2,clk); //output t,m, d,v1,v2,v3,v4;input clk, k1,k2,td;reg[7:0] d;reg t,v1,v2,v3,v4,m;reg [3:0] state, next;parameter s0=0, s1=1, s2=2, s3=3, s4=4, s5=5,s6=6,s7=7,s8=8; //采用十进制数字描述状态编码always @(posedge clk) //状态寄存器描述beginstate<=next;endalways @(state or s1 or td or s2)begincase (state )s0: begin t <= 1'b0; d<=5;m<=0; v1<=0;v2<=0;v3<=0;v4<=0;if (!k1) next <= s1; else next <= s0;ends1: begin t <= 1'b0; d<=5;m<=1; v1<=1;v2<=0;v3<=0;v4<=0;if (!k1) next <= s2; else next <= s1;ends2: begin t <= 1'b0; d<=5;m<=1; v1<=0;v2<=1;v3<=0;v4<=0;if (!k1) next <= s3; else next <= s2;ends3: begin t <= 1'b1; d<=5;m<=1; v1<=0;v2<=0;v3<=1;v4<=0;if(td) next <= s4; else next <= s3;ends4: begin t <= 1'b0; d<=8;m<=1; v1<=0;v2<=0;v3<=0;v4<=1;if(!k2) next <= s5; else next <= s4;ends5: begin t <= 1'b0; d<=8;m<=1; v1<=0;v2<=0;v3<=1;v4<=0;if(!k2) next <= s6; else next <= s5;ends6: begin t <= 1'b1; d<=8;m<=1; v1<=0;v2<=1;v3<=0;v4<=0;if(td) next <= s7; else next <= s6;ends7: begin t <= 1'b0; d<=12;m<=1; v1<=1;v2<=0;v3<=0;v4<=0;next <= s8;s8: begin t <= 1'b1; d<=12;m<=1; v1<=1;v2<=0;v3<=0;v4<=0;if(td) next <= s0; else next <= s8;enddefault : next <= s0;endcaseendendmodule计数器源程序:module jishu(clk,t,td,qq1,qq2,data); //clk时钟,t控制置数与计数,td是输出信号,data是计数初值input t,clk,data; //qq1是低4位,qq2是高4位output td;output [3:0] qq1,qq2;wire [3:0] qq1,qq2;wire[7:0] data;reg td;reg [7:0] qq;assign{qq2,qq1}=qq; //将两个4位数连接成8位数always @ (posedge clk or negedge t) //t可以异步控制置数或是计数beginif (t==0) begin qq<=data; td<=0; end //如果t=0,则定时器预置初值qq=dataelse if ((t==1) && (qq >=1)) begin qq <=qq-1; td<=0; end//如果t=1,且计数器数值大于等于1,则减法计数else td <=1; //否则td=0endendmodule译码器源程序:module yima(s,bcd); //s是译码器输出,bcd是译码器输出output[6:0] s;input[3:0] bcd; //输入BCD码reg [6:0] s;always @(bcd)begincase(bcd)4'd0: s=7'b0000001; //显示数字04'd1: s=7'b1001111; //显示数字14'd2: s=7'b0010010; //显示数字24'd3: s=7'b0000110; //显示数字34'd4: s=7'b1001100; //显示数字44'd5: s=7'b0100100;4'd6: s=7'b0100000;4'd7: s=7'b0001111;4'd8: s=7'b0000000;4'd9: s=7'b0000100; //显示数字94'd10: s=7'b0001000; //显示数字A4'd11: s=7'b1100000;4'd12: s=7'b0110001;4'd13: s=7'b1000010;4'd14: s=7'b0110000;4'd15: s=7'b0111000; //显示数字Fendcaseendendmodule顶层模块电路图:。
verilog 小数 分频 代码

verilog 小数分频代码Verilog是一种硬件描述语言,用于设计和模拟数字电路。
在数字电路中,频率分频器是一种常见的电路,用于将输入时钟信号的频率降低到较低的频率。
本文将介绍使用Verilog设计小数分频器的代码。
小数分频器是一种可以将输入时钟信号的频率降低到一个非整数倍的频率的电路。
在Verilog中,我们可以使用计数器和比较器来实现小数分频器。
首先,我们需要定义输入和输出信号的位宽。
假设输入时钟信号的频率为f_in,输出时钟信号的频率为f_out。
我们可以将f_in和f_out的小数部分表示为两个整数:f_in_fraction 和f_out_fraction。
接下来,我们可以使用一个计数器来计数输入时钟信号的上升沿的个数。
当计数器的值达到f_in_fraction时,我们可以将输出时钟信号的电平翻转,并将计数器重置为0。
这样,我们就可以实现一个简单的小数分频器。
下面是使用Verilog实现小数分频器的代码:```verilogmodule Fractional_Divider (input wire clk_in,output wire clk_out);parameter f_in_fraction = 1; // 输入时钟信号的小数部分 parameter f_out_fraction = 2; // 输出时钟信号的小数部分 reg [31:0] count;reg output_state;reg clk_out_temp;always @(posedge clk_in) beginif (count == f_in_fraction-1) begincount <= 0;output_state <= ~output_state;end else begincount <= count + 1;endendalways @(posedge clk_in) beginif (count == f_in_fraction-1) beginclk_out_temp <= output_state;endendalways @(posedge clk_in) beginif (count == f_in_fraction-1) beginclk_out <= clk_out_temp;endendendmodule```在上述代码中,我们定义了一个名为Fractional_Divider的模块,它有一个输入信号clk_in和一个输出信号clk_out。
verilog实例代码

//与门module zxhand2(c,a,b);input a,b;output c;assign c= a & b;endmodule//或门module zxhor2(c,a,b);input a,b;output c;assign c= a | b;endmodule//非门module zxhnot2(c,b);input b;output c;assign c=~ b;endmodule////异或门module zxhxro2(c,a,b);input b;output c;assign c=a ^ b;endmodule两选一电路module data_scan(d0,d1,sel,q); output q;input d0,d1,sel;wire t1,t2,t3;n1 zxhand2(t1,d0,sel);n2 zxhnot2 (t4,sel);n3 zxhand2(t2,d1,t4);n4 zxhor2(t3,t1,t2);assign q=t1;endmoduleverilog HDL实例(一)练习一.简单的组合逻辑设计目的: 掌握基本组合逻辑电路的实现方法。
这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
在Verilog HDL中,描述组合逻辑时常使用assign结构。
注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。
rCRYt。
模块源代码://--------------- 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设计代码

else if (pin_ctrl==3'b011) begin
state <= DDOUB_RIGHT ;
if (pin_ctrl==3'b000) begin
state <= LEFT ;
end
else if (pin_ctrl==3'b001) begin
else if (pin_ctrl==3'b001) begin
state <= RIGHT ;
end
else if (pin_ctrl==3'b010) begin
end
RIGHT : begin
if (pin_ctrl==3'b000) begin
state <= LEFT ;
end
ERROR : begin
if (pin_ctrl==3'b000) begin
counter32 <= 32'b0;
end
else begin
counter32 <= counter32+1'b1;
end
end
assign clk = counter32[3] ; //16 fen pin
else if (pin_ctrl==3'b011) begin
state <= DDOUB_RIGHT ;
end
end
else begin
state <= ERROR ;
end
else if (pin_ctrl==3'b011) begin
state <= DDOUB_RIGHT ;
锁相环verilog代码

module dpll(reset,clk,signal_in,signal_out,syn);parameter para_K=4;parameter para_N=16;input reset;input clk;input signal_in;output signal_out;output syn;reg signal_out;reg dpout;reg delclk;reg addclk;reg add_del_clkout;reg [7:0]up_down_cnt;reg [2:0]cnt8;reg [8:0]cnt_N;reg syn;reg dpout_delay;reg [8:0]cnt_dpout_high;reg [8:0]cnt_dpout_low;initialbeginsignal_out=0;#500 signal_out=1;#500 signal_out=0;#500 signal_out=1;#500 signal_out=0;end/******phase detector*****/[email=always@(signal_in]always@(signal_in[/email] or signal_out)begindpout<=signal_in^signal_out;end/******synchronization establish detector*****/[email=always@(posedge]always@(posedge[/email] clk or negedge reset) beginif(!reset) dpout_delay<='b0;else dpout_delay<=dpout;end[email=always@(posedge]always@(posedge[/email] clk or negedge reset) beginif(!reset)begincnt_dpout_high<='b0; cnt_dpout_low<='b0;endelse if(dpout)if(dpout_delay==0) cnt_dpout_high<='b0;elseif(cnt_dpout_high==8'b11111111) cnt_dpout_high<='b0;else cnt_dpout_high<=cnt_dpout_high+1;else if(!dpout)if(dpout_delay==1) cnt_dpout_low<='b0;elseif(cnt_dpout_low==8'b11111111) cnt_dpout_low<='b0;else cnt_dpout_low<=cnt_dpout_low+1;end[email=always@(posedge]always@(posedge[/email] clk or negedge reset)beginif(!reset) syn<='b0;else if((dpout&&!dpout_delay)||(!dpout&&dpout_delay))if(cnt_dpout_high[8:0]-cnt_dpout_low[8:0]<=4||cnt_dpout_low[8:0 ]-cnt_dpout_high[8:0]<=4) syn<='b1;else syn<='b0;end/****up down couter with mod=K****/[email=always@(posedge]always@(posedge[/email] clk or negedge reset) beginif(!reset)begindelclk<='b0;addclk<='b0;up_down_cnt<='b00000000;endelsebeginif(!dpout)begindelclk<='b0;if(up_down_cnt==para_K-1)beginup_down_cnt<='b00000000;addclk<='b0;endelsebeginup_down_cnt<=up_down_cnt+1;addclk<='b0;endendelsebeginaddclk<='b0;if(up_down_cnt=='b0)beginup_down_cnt<=para_K-1;delclk<='b0;endelseif(up_down_cnt==1)begindelclk<='b1;up_down_cnt<=up_down_cnt-1;endelseup_down_cnt<=up_down_cnt-1;endendend/******add and delete clk*****/[email=always@(posedge]always@(posedge[/email] clk or negedge reset) beginif(!reset)begincnt8<='b000;endelsebeginif(cnt8=='b111)begincnt8<='b000;endelseif(addclk&&!syn)begincnt8<=cnt8+2;endelseif(delclk&&!syn)cnt8<=cnt8;elsecnt8<=cnt8+1;endend[email=always@(cnt8]always@(cnt8[/email] or reset)beginif(!reset)add_del_clkout<='b0;elseadd_del_clkout<=cnt8[2];end/******counter with mod=N******/[email=always@(posedge]always@(posedge[/email] add_del_clkout or negedge reset)beginif(!reset)begincnt_N<='b0000;signal_out<='b0;endelsebeginif(cnt_N==para_N-1)begincnt_N<='b0000;signal_out<='b0;endelseif(cnt_N==(para_N-1)/2)beginsignal_out<='b1;cnt_N<=cnt_N+1;endelsecnt_N<=cnt_N+1;endendendmodule/* DPLL由鉴相器模K加减计数器脉冲加减电路同步建立侦察电路模N分频器构成.。
sar 逻辑verilog代码

在 Verilog 中,SAR(Successive Approximation Register)逻辑通常用于实现逐次逼近型 A/D 转换器(ADC)。
以下是一个简单的 4 位 SAR ADC 的 Verilog 实现示例:module sar_adc (input wire clk,input wire rst,input wire [3:0] vin, // 4-bit analog inputoutput reg [3:0] dout, // 4-bit digital outputoutput reg done);reg [3:0] sar_reg;reg [3:0] cmp;integer i;always @(posedge clk or posedge rst) beginif (rst) beginsar_reg <= 4'b1000; // Initialize SAR with mid-valuecmp <= 4'b0000;done <= 1'b0;i <= 0;end else beginif (i < 4) begincmp[i] <= vin[i] >= sar_reg[i];if (i < 3) beginsar_reg[i+1] <= cmp[i] ? 1'b1 : 1'b0;endi <= i + 1;end else begindone <= 1'b1;dout <= sar_reg;endendendendmodule这个 SAR ADC 实现接受一个 4 位模拟输入 'vin',在每次转换完成时生成一个 4 位数字输出 'dout'。
时钟信号 'clk' 控制转换过程的速度。
复位信号 'rst' 初始化模块的内部状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
新建文本文档 begin if(en) begin a=b; end else begin a='bz; end end end endmodule //使用always过程语句描述的简单算术逻辑单元 `define add 3'd0; `define minus 3'd1; `define band 3'd2; `define bor 3'd3; `define bnot 3'd; module alu(out,opcode,a,b); output reg [7:0] out; input [2:0] opcode; input [7:0] a,b; always@(opcode or a or b) begin case(opcode) `add:out=a+b; `minus:out=a-b; `band:out=a&b; `bor:out=a|b; `bnot:out=~a; default:out=8'hx; endcase end endmodule //8线-3线编码器 module encode8_3(i,y); input [7:0] i; output reg [2:0] y; always@(i) begin case(i[7:0]) 8'b00000001:y[2:0]=3'b000; 8'b00000010:y[2:0]=3'b001; 8'b00000100:y[2:0]=3'b010; 8'b00001000:y[2:0]=3'b011; 8'b00010000:y[2:0]=3'b100; 8'b00100000:y[2:0]=3'b101; 8'b01000000:y[2:0]=3'b110; 8'b10000000:y[2:0]=3'b111; default:y[2:0]=3'b000; endcase end endmodule //3_8译码器 module decoder3_8(a,y); 第 3 页
新建文本文档 //与非门第一种写法 module nand_2(y,a,b); output y; input a,b; nand(y,a,b); endmodule //与非门第二种写法 module nand_2(y,a,b); output y; input a,b; reg y; always@(a,b) begin case({a,b}) 2'b00:y=1; 2'b01:y=1; 2'b10:y=1; 2'b11:y=0; default:y='bx; endcase end endmodule //或非门第一种写法 module nor_2(y,a,b); output y; input a,b; nor(y,a,b); endmodule //或非门第二种写法 module nor_2(y,a,b); output y; input a,b; reg y; always@(a,b) begin case({a,b}) 2'b00:y<=1; 2'b01:y<=0; 2'b10:y<=0; 2'b11:y<=0; default:y<='bx; endcase end endmodule //异非门第一种写法 module xor_2(a,b,y); output y; input a,b; xor(y,a,b); endmodule //异非门第二种写法 第 1 页
新建文本文档 3:SEG<=~SEG3; 4:SEG<=~SEG4; 5:SEG<=~SEG5; 6:SEG<=~SEG6; 7:SEG<=~SEG7; 8:SEG<=~SEG8; 9:SEG<=~SEG9; default:SEG<=~SEG0; endcase LED U1(.clk(CLK), .oLED(RUNLED)); endmodule //用case语句描述的4选1MUX module mux4(y,d0,d1,d2,d3,g,a); output reg y; //选择输出端 input d0,d1,d2,d3; //4个数据源 input g; //便能端 input [1:0] a; //两位地址码 always@(d0 or d1 or d2 or d3 or a or g) begin if(g==0) y=0; else case(a[1:0]) 2'b00:y=d0; 2'b01:y=d1; 2'b10:y=d2; 2'b11:y=d3; default:y=0; endcase end endmodule
新建文本文档 module xor_2(a,b,y); output reg y; input a,b; always@(a,b) begin case({a,b}) 2'b00:y<=0; 2'b01:y<=1; 2'b10:y<=1; 2'b11:y<=0; default:y<='bx; endcase end endmodule //三态门第一种写法 module tri_gate(datain,dataout,en); output dataout; input datain,en; assign dataout=en?datain:'bz; endmodule //三态门第二种写法 module tri_gate(datain,dataout,en); output reg dataout; input datain,en; always if(en) dataout<=datain; else dataout<='bz; endmodule //单向总线缓冲器 module tri_buffer(dout,din,en); output reg [7:0] dout; input [7:0] din; input en; always if(en) dout<=din; else dout<='bz; endmodule //双向总线缓冲器 module tri_bibuffer(en,dr,a,b); inout [7:0] a,b; //双向数据端口 input en,dr; //使能端,数据方向控制端 reg[7:0] a,b; always@(*) begin if(dr) begin if(en)begin b=a; end else begin b='bz; end end else 第 2 页
新建文本文档 parameter SEG0=7'h3f, SEG3=7'h4f, SEG4=7'h66, SEG7=7'h07, SEG8=7'h7f, SEGB=7'h7c, SEGC=7'h39, SEGF=7'h71; always@(posedge CLK or negedge RSTn) if(!RSTn) begin cnt='b0; i<=0; shiwei<=0; gewei<=0; end else if(cnt==T200MS) begin i<=i+1; if(i==100) i<=1'b0; cnt<='b0; shiwei<=i/10; gewei<=i%10; end else if(cnt<=T200MS) cnt<=cnt+1'b1; always@(RSTn or shiwei) if(!RSTn) SEG_2nd<=SEG8; //~SEG8 Means 8,and SEG means turn off LED else case(shiwei) 0:SEG_2nd<=SEG8; 1:SEG_2nd<=~SEG1; 2:SEG_2nd<=~SEG2; 3:SEG_2nd<=~SEG3; 4:SEG_2nd<=~SEG4; 5:SEG_2nd<=~SEG5; 6:SEG_2nd<=~SEG6; 7:SEG_2nd<=~SEG7; 8:SEG_2nd<=~SEG8; 9:SEG_2nd<=~SEG9; default:SEG_2nd<=SEG8; endcase always@(RSTn or gewei) if(!RSTn) SEG<=~SEG0; else case(gewei) 0:SEG<=~SEG0; 1:SEG<=~SEG1; 2:SEG<=~SEG2; 第 6 页 SEGD=7'h5e, SEGE=7'h79, SEG9=7'h6f, SEGA=7'h77, SEG5=7'h6d, SEG6=7'h7d, SEG1=7'h06, SEG2=7'h5b,
SEGC=7'h39, SEGF=7'h71;
新建文本文档 SEGD=7'h5e,
SEGE=7'h79,
always@(posedge CLK or negedge RSTn) if(!RSTn) begin cnt='b0; i<=0; end else if(cnt==T200MS) begin i<=i+1; cnt<='b0; end else if(cnt<=T200MS) cnt<=cnt+1'b1; always@(i) if(!RSTn) SEG<=~SEG0; else case(i) 0:SEG<=~SEG0; 1:SEG<=~SEG1; 2:SEG<=~SEG2; 3:SEG<=~SEG3; 4:SEG<=~SEG4; 5:SEG<=~SEG5; 6:SEG<=~SEG6; 7:SEG<=~SEG7; 8:SEG<=~SEG8; 9:SEG<=~SEG9; 4'hA:SEG<=~SEGA; 4'hB:SEG<=~SEGB; 4'hC:SEG<=~SEGC; 4'hD:SEG<=~SEGD; 4'hE:SEG<=~SEGE; 4'hF:SEG<=~SEGF; default:SEG<=SEG0; endcase endmodule //两位数码管+流水灯(在一位数码管的基础上加多一位数码管和流水灯) module LED_SEG7(CLK,RSTn,SEG,SEG_2nd,RUNLED); input CLK; input RSTn; output reg [6:0] SEG; output reg [6:0] SEG_2nd; output [7:0] RUNLED; reg [31:0] cnt; reg [6:0] i; reg [3:0] shiwei; reg [3:0] gewei; parameter T200MS = 32'd10_000_000; 第 5 页