当前位置:文档之家› CRC16、扰码、解扰码器并行方案原理和Verilog HDL程序设计

CRC16、扰码、解扰码器并行方案原理和Verilog HDL程序设计

CRC16、扰码、解扰码器并行方案原理和Verilog HDL程序设计
CRC16、扰码、解扰码器并行方案原理和Verilog HDL程序设计

课程设计

课程名称现代通信原理与技术课程设计题目名称CRC16、扰码/解扰码器并行方

案原理和Verilog HDL程序设计2013年10月25日

目录

一、CRC16并行算法原理

二、CRC16并行算法的Verilog HDL程序设计

三、扰码/解扰码器并行算法原理

四、扰码/解扰码器并行算法的Verilog HDL程序设计

五、参考文献

一、CRC16并行算法原理

1、CRC编码原理

在数字通信中,可能会因为各种原因导致数据在传输过程中或接收时发生错误,为了保证数据传输的可靠性和数据校验的高效性,常常采用一些差错控制方法。冗余校验(CRC)就是一种被广泛采用的差错控制方法和数据编码方法。

它具有编码和解码方法简单,剪错和纠错能力强等特点,能有效地对数据进行编码,并可以显著的提高系统的剪错能力,从而保证数据的可靠性和正确性,因此在大多数的以太网协议中都采用了CRC的校验来进行差错控制。

CRC主要有两种,即非标准的由用户定义的CRC的生成多项式和国际标准化组织规定的标准的生成多项式。其中第二中应用广泛,国际标准化组织规定的几种主要常见的CRC如表所示。

CRC编码是根据CRC检验原理得出的一种编码方法,其基本思想是:利用线性编码理论,在发送方向根据要传输的K位二进制序列,以一定的规则产生r位校验用的监督吗(CRC码),并附在信息位之后,构成一个新的二进制代码序列共n=k+r位。在接收方,则根据信息码和CRC码之间的规则进行校验,以确定传输中是否出现错误。

对一个数据进行编码,就是原始数据通过某种算法,得到一个新的数据。而这个新的数据与原始数据有着固定的内在联系。通过把原始数据和新的数据组合在一起形成新的数据,因此这个数据具有自我校验的能力。将原始数据表示为P(x),它是一个n阶多项式表示为;

式子中,为数据位;x为伪变量,用指明各位间的排列位置。

在对这个数据进行编码的时,CRC生成多项式G(x),并在带编码的二进制多项式P(x)的末尾添加r个0,这样对应的二进制多项式升幂为。再用生成多项式G(x)去除

,求得余数为r-1阶的二进制多项式R(x)。R(x)即为所求的CRC校验码多项式。

最后用以模2的方法减去R(x),则对应的二进制序列就是包含了CRC校验码的待发送字符串,也就是编码后的数据。

式中:Q(x)是商多项式;R(x)是余数多项式;T(x)是编码后的数据。

2、CRC_16并行算法原理

在利用CRC_16串行编码电路对输入进行编码时,它的输入数据是串行输入的,因此数据传输效率低,它的运算速度的提高完全依赖于系统时钟频率的提高,不能满足现在的低功耗下的数据快速传输,如果将数据进行并行处理,就可以在较低的时钟频率下快速的处理数据,因此,本次设计采用并行的CRC_16。

最常见的CRC校验码电路采用的是线性反馈寄存器LFSR实现,对于CRC_16,其生成多项式为,所以对应的系数0—16为::1010000000000011,由此可以得到CRC_16编码电路结构图,如图所示。

从图中可以看出,各位移位寄存器当前存储的数据为CRC余数值,16个D触发器输出

从右至左依次为。输入的信息码元为I。令

表示编码以为寄存器当前所处的状态,I=[I0 I1...I7]表示第1

至第8个时钟的信息码元输入,向量表示编码器的下一个状态,D(8)表示第8个时钟周期后CRC编码器中移位寄存器所处的状态,则设计8bit并行的CRC 逻辑编码器就是找出函数关系。

第1个时钟周期后的编码寄存器状态为:

可以将以上表达式组成矩阵乘法,有:

其中,

第2个时钟周期后的编码寄存器状态为:

以此类推则有:

假设用crc_reg[15:0]表示移位寄存器初始状态,crc_in[8:0]表示并行输入的8bit数据,crc_reg8[15:0]表示8bit并行编码后的移位寄存器状态,则

3、CRC_16并行仿真输出波形

如图所示是CRC_16并行编码电路测试程序的仿真结果,输入信号时crc_in,没有完全输入编码器是,输入信号crc_in作为crc_out端口输出数据;当d_finish信号为高电平指示数据输入完成时,将线性移位寄存器crc_reg中的校验位并行8位输出到crc_out端口。由图可以看出输入信号与输出存在一个时钟周期的延时。

二、CRC16并行算法的Verilog HDL程序设计

1、CRC_16校验码的并行编码程序

module CRC_16(clk,rst,load,d_finish,crc_in,crc_out);

input clk,rst;

input load; //开始编码信号

input d_finish; //编码结束信号

input [7:0] crc_in; //编码器并行8bit数据输入

output [7:0] crc_out; //编码器并行8bit数据输出

reg [7:0] crc_out; //数据输出寄存器

reg [15:0] crc_reg; //编码器移位寄存器

reg [1:0] count;

reg [1:0] state;

wire [15:0] next_crc_reg; //移位寄存器输入变量

parameter idle = 2'b00;

parameter compute = 2'b01;

parameter finish = 2'b10;

//寄存器输出和寄存器初始状态以及输入码字组合逻辑关系

assign next_crc_reg[0] = (^crc_in[7:0]) ^ (^crc_reg[15:8]);

assign next_crc_reg[1] = (^crc_in[6:0]) ^ (^crc_reg[15:9]);

assign next_crc_reg[2] = crc_in[7] ^ crc_in[6] ^ crc_reg[9] ^ crc_reg[8];

assign next_crc_reg[3] = crc_in[6] ^ crc_in[5] ^ crc_reg[10] ^ crc_reg[9];

assign next_crc_reg[4] = crc_in[5] ^ crc_in[4] ^ crc_reg[11] ^ crc_reg[10];

assign next_crc_reg[5] = crc_in[4] ^ crc_in[3] ^ crc_reg[12] ^ crc_reg[11];

assign next_crc_reg[6] = crc_in[3] ^ crc_in[2] ^ crc_reg[13] ^ crc_reg[12];

assign next_crc_reg[7] = crc_in[2] ^ crc_in[1] ^ crc_reg[14] ^ crc_reg[13];

assign next_crc_reg[8] = crc_in[1] ^ crc_in[0] ^ crc_reg[15] ^ crc_reg[14] ^ crc_reg[0];

assign next_crc_reg[9] = crc_in[0] ^ crc_reg[15] ^ crc_reg[1];

assign next_crc_reg[14:10] = crc_reg[6:2];

assign next_crc_reg[15] = (^crc_in[7:0]) ^ (^crc_reg[15:7]);

always @ (posedge clk or negedge rst) begin

if(!rst) begin

state <= idle;

count <= 2'b00;

end

else begin

case(state)

idle : begin

if(load)

state <= compute;

else

state <= idle;

end

compute : begin

if(d_finish)

state <= finish;

else

state <= compute;

end

finish : begin

if(count == 2) begin

state <= idle;

end

else begin

count <= count + 1;

state <= finish;

end

end

endcase

end

end

always @ (posedge clk or negedge rst) begin

if(!rst) begin

crc_reg[15:0] <= 16'b0000_0000_0000_0000;

end

else begin

case(state)

idle : begin //寄存器装初值状态

crc_reg[15:0] <= 16'b0000_0000_0000_0000;

end

compute : begin //编码计算状态

crc_reg[15:0] <= next_crc_reg[15:0];

crc_out[7:0] <= crc_in[7:0];

end

finish : begin //编码结束状态

crc_reg[15:0] <= {crc_reg[7:0],8'b0000_0000};

crc_out[7:0] <= crc_reg[15:8];

end

endcase

end

end

Endmodule

2、CRC_16仿真测试文件程序

module CRC_16_test;

reg clk;

reg rst;

reg load;

reg d_finish;

reg [7:0] crc_in;

wire [7:0] crc_out;

parameter clk_period = 40;

initial begin

#clk_period clk = 1;

#clk_period rst = 0;

#clk_period rst = 1;

#clk_period crc_in[7:0] = 8'b1010_1010; //输入待编码数据

#clk_period load = 1;

#clk_period load = 0;

#clk_period d_finish = 0;

#(10*clk_period) d_finish = 1;

#clk_period d_finish = 0;

end

always #(clk_period/2) clk = ~clk;

always #(clk_period) crc_in[7:0] = ~crc_in[7:0]; //输入待编码数据

CRC_16 u1(.clk(clk),

.rst(rst),

.load(load),

.d_finish(d_finish),

.crc_in(crc_in),

.crc_out(crc_out));

Endmodule

三、扰码/解扰码器并行算法原理

1、扰码/解扰码器并行算法原理

在数字通信系统中,若经常出现长的“0”或“1”系列,将会影响位同步的建立和保持。为了解决这个问题以及限制电路中存在的不同程度的非线性特性对其他电路通信造成的串扰,要求数字信号的最小周期足够长。将数字信号变成具有近似于白噪声统计特性的数字序列即可满足要求,这通常用加扰来实现。而所谓加扰,就是不用增加冗余而扰乱信号,改变数字信号统计特性,使其具有近似白噪声统计特性的一种技术。这种扰乱是有规律可循的,因此也是可以解除的。

扰码的作用就是对输入的信号进行随机化处理,以减少数据的连0连1数目,确保接收端的位同步提取,并同时扩展基带信号频率,起到加密效果。这种加扰的基础建立在伪随机序列理论的基础上,其工作原理就是在发送端用加扰来改变原来数字的统计特性,而在接收端用解扰器恢复原始的数字信号。

扰码产生是通过循环移位寄存器来实现的,而扰码生成多项式决定循环移位寄存器的结构。这次设计以ITU-T推荐的SDH(同步数字体系)使用的扰码生成多项式:

X7 + X6 + 1

设扰码的输入数字序列为t

k ,输出为S

k

;解码器的输入为S

k

,输出为r

k 。

扰码器的输入和输出序列关系为:

解扰码器的输入和输出序列关系为:

2、并行加扰器设计

在高速的数据传输过程中,为了满足数据高速处理的需要,一般扰码器和解码器通常采用并行的方式来实现。并行扰码的原理基于特征多项式X7 + X6+ 1,加扰器电路结构如图所示。

假设每个触发器的输出端分别是假设为最低位触发器的输入,那么每个触发器的关系如下

令i=7以及i=6代入上式可得:

对于上述的几个关系式可以用矩阵乘法来表示。

对于8位并行扰码,需要知道(N+8)时刻输出相对于N时刻的关系,在上式中令

经过计算可得:

上述式子就是并行扰码的理论基础。

根据上述式子,假设并行8位输入数据为scram_in[7:0],扰码器的并行8位输出数据为scram_out[7:0],shift_reg[6:0],是加扰器的移位寄存器的初始状态加扰器复位后初始状态一般为shift_reg[6:0]=7b’111_1111,则可以得并行8位数据输入后加扰器输出数据和加扰器输入数据以及移位寄存器初始状态的关系式:

3、并行解扰器设计

并行加扰器电路设计原理和并行加电路设计原理一样,如图所示为解扰码器的电路图:

解扰器电路结构

假设解扰器电路输入时descram_in[7:0],解码电路输出是descram_out[7:0],移位寄存器是shift_ren[7:0],可以根据并行扰码的推导方法导出解扰器输出和解扰器输入以及移位寄存器初始状态的逻辑关系式:

4、仿真输出波形

如图所示是并行加扰/解扰器的仿真输出波形,从图中可以看出测试文件输入初始为00000001的8位数据,每来一个时钟该数据加1,该数据经过加扰器并行扰码后将数据送给并行解码器解扰,加扰器的输出作为解扰器的输入,由图中可以看出,连0和连1的个数最多8个,同时加扰器输入数据与解扰器输出数据相同,只差一个时钟周期的运算延时。

四、扰码/解扰码器并行算法的Verilog HDL程序设计

1、扰码器的程序

module parallel_scrambler(clk,

rst_n,

scram_in,

scram_out);

input clk,rst_n; //rst_n为复位信号,低电平有效

input [7:0] scram_in; //扰码数据输入

output [7:0] scram_out; //扰码数据输出

reg [7:0] shift_reg; //反馈移位寄存器

//输出的反馈异或关系

assign scram_out[7:0] = shift_reg [7:0];

always @ (posedge clk or negedge rst_n) begin

if(!rst_n) //已将rst改为!rst(考虑到可综合性问题)

shift_reg <= 8'b1111_1111;

else begin

//寄存器反馈异或关系

shift_reg[7:2] <= shift_reg[6:1] ^ shift_reg[5:0] ^ scram_in[7:2];

shift_reg[1] <= shift_reg[0] ^ shift_reg[6] ^ shift_reg[5] ^ scram_in[7] ^ scram_in[1];

shift_reg[0] <= shift_reg[6] ^ shift_reg[4] ^ scram_in[7] ^ scram_in[6] ^ scram_in[0];

end

end

Endmodule

2、解扰码器的程序

module parallel_decrambler(clk,rst_n,descram_in,descram_out);

input clk,rst_n; //rst_n为复位信号,低电平有效

input [7:0] descram_in; //扰码数据输入

output [7:0] descram_out; //扰码数据输出

reg [6:0] shift_reg; //反馈移位寄存器

assign descram_out[7:2] = shift_reg[6:1] ^ shift_reg[5:0] ^ descram_in[7:2];

assign descram_out[1] = shift_reg[0] ^ descram_in[7] ^ descram_in[1];

assign descram_out[0] = descram_in[7] ^ descram_in[6] ^ descram_in[0];

always@(posedge clk or negedge rst_n)begin

if(!rst_n) //已将rst改为!rst(考虑到可综合性问题)

shift_reg [6:0] <= 7'b111_1111;

else begin

shift_reg[6:0] <= descram_in[6:0];

end

end

Endmodule

3、测试文件的Verilog HDL程序

module parallel_scram_test;

reg clk;

reg rst_n;

reg [7:0] scram_in;//扰码器的输入端

wire [7:0] scram_out; //既是扰码器的输出端,也是解扰器的输入端wire [7:0] descram_out; //解扰器的输出端

parameter period = 20;

initial begin

clk = 1;

rst_n = 0; //已将rst_n = 1改为rst_n = 0

scram_in[7:0] = 8'b000_0001;

#period rst_n = 1; //已将rst_n = 0改为rst_n = 1 end

//根据第8章,伪随机序列产生的原理,产生一个伪随机的序列作为加扰器的输入数据,

//该伪随机序列的生成多项式为x^8 + x^4 + x^3 + x^2 + 1

always #(period/2) clk =~clk;

always @ (posedge clk) begin

scram_in [7:0] <= scram_in[7:0]+1;

end

//加扰、解扰器模块调用

parallel_scrambler u1 (.clk(clk),

.rst_n(rst_n),

.scram_in(scram_in),

.scram_out(scram_out));

parallel_decrambler u2 (.clk(clk),

.rst_n(rst_n),

.descram_in(scram_out),

.descram_out(descram_out));

endmodule

五、参考文献

《现代通信原理》,樊昌信,人民邮电出版社

《基于Verilog HDL的通信系统设计》,陈曦,中国水利水电出版社

Verilog各种倍分频器设计

module odd_division(clk,rst,count,clk_odd); /*count没必要放在端口中,这里只是为了仿真时观察*/ input clk,rst; output clk_odd; output[3:0] count; reg clk_odd; reg[3:0] count; parameter N = 6; /*6分频* / always @ (posedge clk) if(! rst) begin count <= 1'b0; clk_odd <= 1'b0; end else if ( count < N/2-1) begin count <= count + 1'b1; end else begin count <= 1'b0; clk_odd <= ~clk_odd; end endmodule 奇数倍分频:归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数从零开始,到N-1)/2进行输出时钟翻转,然后经过(N+1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。再者同时进行下降沿触发的模N计数,到和上升沿过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。 module even_division(clk,rst,count1,count2,clk_even); /*count1,count2没必要放在端口中,这

里只是为了仿真时观察*/ input clk,rst; output[3:0] count1,count2; output clk_even; reg[3:0] count1,count2; reg clkA,clkB; wire clk_even,clk_re; parameter N = 5; /*5分频*/ assign clk_re = ~clk; assign clk_even = clkA | clkB; always @(posedge clk) if(! rst) begin count1 <= 1'b0; clkA <= 1'b0; end else if(count1 < (N - 1)) begin count1 <= count1 + 1'b1; /*这里是非阻塞赋值是先执行了下面的IF判断,最后才赋的值。最初看这程序时没注意,想了好半天*/ if(count1 == (N - 1)/2) begin clkA <= ~clkA; end end else begin clkA <= ~clkA;

用Verilog语言实现任意整数分频器

用Verilog语言实现任意整数分频器 分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相环资源,如赛灵思(Xilinx)的DLL.来进行时钟的分频,倍频以及相移。但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相移仍然非常流行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单元就可以达到对时钟操作的目的。另一方面,通过语言设计进行时钟分频,可以看出设计者对设计语言的理解程度。因此很多招聘单位在招聘时往往要求应聘者写一个分频器(比如奇数分频)以考核应聘人员的设计水平和理解程度。下面讲讲对各种分频系数进行分频的方法:第一,偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。电路上只需一个D触发器和一个非门即可实现,Q(n+1)=D,D=~Q(n),clk_out=Q(n+1) . 第二,奇数倍分频:奇数倍分频常常在论坛上有人问起,实际上,奇数倍分频有两种实现方法: 占空比为非50%的三分频时钟,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。即是在计数值在邻近的1和2进行了两次翻转。这样实现的三分频占空比为1/3或者2/3。 module three(clk_in,rst,clk_out); // 三倍频 inputclk_in,rst; output clk_out; reg clk_out; reg [1:0] count; always @(negedgerst or posedgeclk_in) begin if(rst==0) begin count<=0; clk_out<=0; end else begin count<=count+1; if(count==1) clk_out<=~clk_out; else if(count==2) begin clk_out=~clk_out; count<=0; end end end endmodule 仿真图 另一种实现: module div3(CLKIN,CLKOUT,RESETn); //依然是三倍频 inputCLKIN,RESETn;

实验六--Verilog设计分频器计数器电路答案

实验六 Verilog设计分频器/计数器电路 一、实验目的 1、进一步掌握最基本时序电路的实现方法; 2、学习分频器/计数器时序电路程序的编写方法; 3、进一步学习同步和异步时序电路程序的编写方法。 二、实验内容 1、用Verilog设计一个10分频的分频器,要求输入为clock(上升沿有效),reset(低电平复位),输出clockout为4个clock周期的低电平,4个clock周期的高电平),文件命名为fenpinqi10.v。 2、用Verilog设计一异步清零的十进制加法计数器,要求输入为时钟端CLK(上升沿)和异步清除端CLR(高电平复位),输出为进位端C和4位计数输出端Q,文件命名为couter10.v。 3、用Verilog设计8位同步二进制加减法计数器,输入为时钟端CLK(上升沿有效)和异步清除端CLR(低电平有效),加减控制端UPDOWN,当UPDOWN为1时执行加法计数,为0时执行减法计数;输出为进位端C和8位计数输出端Q,文件命名为couter8.v。 4、用VERILOG设计一可变模数计数器,设计要求:令输入信号M1和M0控制计数模,当M1M0=00时为模18加法计数器;M1M0=01时为模4加法计数器;当M1M0=10时为模12加法计数器;M1M0=11时为模6加法计数器,输入clk上升沿有效,文件命名为mcout5.v。 5、VerilogHDL设计有时钟时能的两位十进制计数器,有时钟使能的两位十进制计数器的元件符号如图所示,CLK是时钟输入端,上升沿有效;ENA是时钟使能控制输入端,高电平有效,当ENA=1时,时钟CLK才能输入;CLR是复位输入端,高电平有效,异步清零;Q[3..0]是计数器低4位状态输出端,Q[7..0]是高4位状态输出端;COUT是进位输出端。 三、实验步骤 实验一:分频器 1、建立工程

verilogHDL分频器(奇数分频和偶数分频)

module clk_div( //-----------input----------- iCLK, div, //-----------output---------- oCLK ); //-----------input----------- parameter WIDE=14; input iCLK; input[WIDE-1:0]div; //-----------output----------- output oCLK; wire oCLK_odd; wire oCLK_even; assign oCLK=div[0]?oCLK_odd:oCLK_even; div_odd DUTo (.iCLK(iCLK),.oCLK(oCLK_odd),.div(div)); div_even DUTe (.iCLK(iCLK),.oCLK(oCLK_even),.div(div)); endmodule // odd module div_odd( //--------input-------- iCLK, div, //--------output-------- oCLK ); //--------input-------- parameter WIDE=14; input iCLK; input[WIDE-1:0]div; //--------output-------- output oCLK; reg outCLK;

/* =========================== solve 1 =========================== reg cout; reg[WIDE-1:0] cnt; initial cnt=0; wire inCLK; reg cc; initial cc=0; always @(posedge cout) cc<=~cc; assign inCLK = iCLK^cc; always @(posedge inCLK) begin if(cnt<(div[WIDE-1:1])) begin cnt<=cnt+1; cout<=1'b0; end else begin cnt<=0; cout<=1'b1; end end always @(negedge iCLK) outCLK <= cout; assign oCLK=cc; */ //======================== //solve 2 //======================== reg[WIDE-1:0] cnt_a; initial cnt_a=0; reg[WIDE-1:0] cnt_b; initial cnt_b=0; reg cout_a;

分频器的verilog hdl语言

分频器的verilog HDL描述(转) 分频器,在许多涉及时序的电路设计中都会用到,在这里,我转载某位高人的文章,关于分频器的设计 偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。 module odd_division(clk,rst,count,clk_odd); input clk,rst; output clk_odd; output[3:0] count; reg clk_odd; reg[3:0] count; parameter N = 6; always @ (posedge clk) if(! rst) begin count <= 1'b0; clk_odd <= 1'b0; end else if ( count < N/2-1) begin count <= count + 1'b1; end else begin

clk_odd <= ~clk_odd; end endmodule 奇数倍分频:归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数从零开始,到(N-1)/2进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。再者同时进行下降沿触发的模N 计数,到和上升沿过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。 module even_division(clk,rst,count1,count2,clk_even); input clk,rst; output[3:0] count1,count2; output clk_even; reg[3:0] count1,count2; reg clkA,clkB; wire clk_even; parameter N = 5; assign clk_re = ~clk; assign clk_even = clkA | clkB; always @(posedge clk) if(! rst) begin count1 <= 1'b0; clkA <= 1'b0; end else

任意分频Verilog实现

1. 偶数倍(2N)分频 使用一模N计数器模块即可实现,即每当模N计数器上升沿从0开始计数至N-1时,输出时钟进行翻转, 同时给计数器一复位信号使之从0开始重新计数,以此循环即可。偶数倍分频原理示意图见图1。 2. 奇数倍(2N+1)分频 (1)占空比为X/(2N+1)或(2N+1-X)/(2N+1)分频,用模(2N+1)计数器模块可以实现。取0至2N-1之间一数值X(0,当计数器时钟上升沿从0开始计数到X值时输出时钟翻转一次,在计数器继续计数达到2N 时,输出时钟再次翻转并对计数器置一复位信号,使之从0开始重新计数,即可实现。 (2)占空比为50%的分频,设计思想如下:基于(1)中占空比为非50%的输出时钟在输入时钟的上升沿 触发翻转;若在同一个输入时钟周期内,此计数器的两次输出时钟翻转分别在与(1)中对应的下降沿触发翻转,输出的时钟与(1)中输出的时钟进行逻辑或,即可得到占空比为50%的奇数倍分频时钟。当然其 输出端再与偶数倍分频器串接则可以实现偶数倍分频。奇数倍分频原理示意图见图2。(这也是许多公司常出的面试题,^_^,是不是很简单?) 3. N-0.5倍分频 采用模N计数器可以实现。具体如下:计数器从0开始上升沿计数,计数达到N-1上升沿时,输出时钟需翻转,由于分频值为N-0.5,所以在时钟翻转后经历0.5个周期时,计数器输出时钟必须进行再次翻转,即当 CLK为下降沿时计数器的输入端应为上升沿脉冲,使计数器计数达到N而复位为0重新开始计数同时输出时钟翻转。这个过程所要做的就是对CLK进行适当的变换,使之送给计数器的触发时钟每经历N-0.5个周期就翻转一次。N-0.5倍:取N=3,分频原理示意图见图3。 对于任意的N+A/B倍分频(N、A、B∈Z,A≦B) 分别设计一个分频值为N和分频值N+1的整数分频器,采用脉冲计数来控制单位时间内两个分频器出现 的次数,从而获得所需要的小数分频值。可以采取如下方法来计算个子出现的频率: 设N出现的频率为a,则N×a+(N+1)×(B-a)=N×B+A 求解a=B-A; 所以N+1出现的频率为 A.例如实现7+2/5分频,取a为3,即7×3+8×2就可以实现。但是由于这种小数分频输出的时钟脉冲抖动很大, 现实中很少使用。 通常实现偶数的分频比较容易,以十分频为例: always @( posedge clk or posedge reset) if(reset) begin k<=0; clk_10<=0; end else if(k==4) begin k<=0;

实验六Verilog设计分频器计数器电路答案

实验六V e r i l o g设计分频器/计数器电路 一、实验目的 1、进一步掌握最基本时序电路的实现方法; 2、学习分频器/计数器时序电路程序的编写方法; 3、进一步学习同步和异步时序电路程序的编写方法。 二、实验内容 1、用Verilog设计一个10分频的分频器,要求输入为clock(上升沿有效),reset(低电平复位),输出clockout为4个clock周期的低电平,4个clock 周期的高电平),文件命名为。 2、用Verilog设计一异步清零的十进制加法计数器,要求输入为时钟端CLK (上升沿)和异步清除端CLR(高电平复位),输出为进位端C和4位计数输出端Q,文件命名为。 3、用Verilog设计8位同步二进制加减法计数器,输入为时钟端CLK(上升沿有效)和异步清除端CLR(低电平有效),加减控制端UPDOWN,当UPDOWN 为1时执行加法计数,为0时执行减法计数;输出为进位端C和8位计数输出端Q,文件命名为。 4、用VERILOG设计一可变模数计数器,设计要求:令输入信号M1和M0控制计数模,当M1M0=00时为模18加法计数器;M1M0=01时为模4加法计数器;当M1M0=10时为模12加法计数器;M1M0=11时为模6加法计数器,输入clk 上升沿有效,文件命名为。 5、VerilogHDL设计有时钟时能的两位十进制计数器,有时钟使能的两位十进制计数器的元件符号如图所示,CLK是时钟输入端,上升沿有效;ENA是

时钟使能控制输入端,高电平有效,当ENA=1时,时钟CLK才能输入;CLR 是复位输入端,高电平有效,异步清零;Q[3..0]是计数器低4位状态输出端,Q[7..0]是高4位状态输出端;COUT是进位输出端。 三、实验步骤 实验一:分频器 1、建立工程 2、创建Verilog HDL文件 3、输入10分频器程序代码并保存 4、进行综合编译 5、新建波形文件 6、导入引脚 7、设置信号源并保存 8、生成网表 9、功能仿真 10、仿真结果分析 由仿真结果可以看出clockout输出5个clock周期的低电平和5个clock 的高电平达到10分频的效果,设计正确。 实验二:十进制加法计数器(异步清零) 1、建立工程 2、创建Verilog HDL文件 3、输入加法计数器代码并保存 4、进行综合编译 5、新建波形文件 6、导入引脚 7、设置信号源并保存 8、生成网表 9、功能仿真 10、仿真结果分析

Verilog分频器设计

Verilog分频器设计 module adder(clk,z); output z; reg q; reg z; always@(posedge clk) begin if(q%9==0) z<=q; else q=q+1; end endmodule module counter9(clk,datein,z); output z; input clk; input datein; reg z; reg[3:0] q; always@(posedge clk) begin q<=q+1; if (q==4'b1001) begin q<=4'b0000; z<=datein; end end endmodule

2008-11-04 19:58 分频器是FPGA设计中使用频率非常高的基本单元之一。尽管目前在大部分设计中还广泛使用集成锁相环(如altera的PLL,Xilinx的DLL)来进行时钟的分频、倍频以及相移设计,但是,对于时钟要求不太严格的设计,通过自主设计进行时钟分频的实现方法仍然非常流行。首先这种方法可以节省锁相环资源,再者,这种方式只消耗不多的逻辑单元就可以达到对时钟操作的目的。偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。 module odd_division(clk,rst,count,clk_odd); /*count没必要放在端口中,这里只是为了仿真时观察*/ input clk,rst; output clk_odd; output[3:0] count; reg clk_odd; reg[3:0] count; parameter N = 6; /*6分频* / always @ (posedge clk) if(! rst) begin count <= 1'b0; clk_odd <= 1'b0; end else if ( count < N/2-1) begin count <= count + 1'b1; end else begin count <= 1'b0; clk_odd <= ~clk_odd;

用verilog实现任意倍分频器的方法

用verilog语言写的任意整数的分频器 占空比:对于一串理想的脉冲序列中(如方波),正脉冲的持续时间与脉冲总周期的比值,叫做这个方波的占空比。 分频分为奇分频和偶分频 第一,偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。 第二:奇数倍分频:奇数倍分频常常在论坛上有人问起,实际上,奇数倍分频有两种实现方法:首先,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。即是在计数值在邻近的1和2进行了两次翻转。这样实现的三分频占空比为1/3或者2/3。如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。这种方法可以实现任意的奇数分频。归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。再者同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。另外一种方法:对进行奇数倍n分频时钟,首先进行n/2分频(带小数,即等于(n-1)/2+0.5),然后再进行二分频得到。得到占空比为50%的奇数倍分频。 下面讲讲进行小数分频的设计方法: 第三,小数分频:首先讲讲如何进行n+0.5分频,这种分频需要对输入时钟进行操作。基本的设计思想:对于进行n+0.5分频,首先进行模n的计数,在计数到n-1时,输出时钟赋为‘1’,回到计数0时,又赋为0,因此,可以知道,当计数值为n-1时,输出时钟才为1,因此,只要保持计数值n-1为半个输入时钟周期,即实现了n+0.5分频时钟,因此保持n-1为半个时钟周期即是一个难点。从中可以发现,因为计数器是通过时钟上升沿计数,因此可以在计数为n- 1时对计数触发时钟进行翻转,那么时钟的下降沿变成了上升沿。即在计数值为n-1期间的时钟下降沿变成了上升沿,则计数值n-1只保持了半个时钟周期,由于时钟翻转下降沿变成上升沿,因此计数值变为0。因此,每产生一个n+0.5分频时钟的周期,触发时钟都是要翻转一次。设计思路如下:

Verilog程序代码集

1.全加器 Sum=A⊕B⊕Cin Count=AB+Cin(A+B) ①数据流 module adder(a,b,Cin,Sum,Count); input [2:0]a,b; input Cin; output [2:0] Sum; output Count; assign {Count,Sum}=a+b+Cin; endmodule ②行为描述always语句 module adder(a,b,c,Cin,Sum,Count); input [4:0] a,b; input Cin; output reg [4:0] Sum; output reg Count; reg T1,T2,T3; always@(a or b or Cin) begin Sum=a^b^Cin; T1=A&B; T2=Cin&A; T3=Cin&B; Count=T1|T2|T3; end endmodule ③结构体 module adder (a,b,Cin,Sum,Count);input a,b,Cin; output Sum,Count; Xor a1(s1,a1,b); Xor a2(Sum,s1,Cin); and a3(T1,a,b); or a4(T2,a,b); and a5(T3,Cin,T2); or a6(Count,T1,T3); Endmodule 2.数值比较器 ①判断两值是否相等 module compare(a,b,equal); input [7:0] a,b; output equal; assign equal=(a==b)?|0; ②谁大谁输出 module compare(a,b,out); input [7:0] a,b; output reg[7:0] out; always@(a or b) begin if (a>b) out<=a; else if (a==b) out<=a; else out<=b; end endmodule ③输出参数 module compare(a.b.xgy,xsy,xey); input [7:0] x,y; output reg xgy,xsy,xey; always@(x or y) begin if (x==y) xey=1; else xey=0; if (x>y) begin xgy=1;xsy=0;end else if (x

Verilog HDL4 7 分频代码

四分频 module quarter_clk(reset,clk_in,clk_out); input clk_in,reset; output clk_out; reg clk_out; reg [4:0]count; always@(posedge clk_in) begin if(!reset) clk_out=0; else if (count<1) begin count<=count+1; end else begin count<=0; clk_out=~clk_out; end end endmodule 仿真 `define clk_cycle 50 module test_quarter_clk; reg clk,reset; wire clk_out; always #`clk_cycle clk=~clk; initial begin clk=0; reset=1; #100 reset=0; #100 reset=1; #10000 $stop; end quarter_clk quarter_clk1(reset,clk,clk_out); endmodule

7分频 module div7(rst,clk,cout1,cout2,cout); input clk,rst; output cout1,cout2,cout; reg [2:0] m,n; wire cout; reg cout1,cout2; assign cout=cout1|cout2; always @(posedge clk) begin if(rst) begin cout1<=0;m<=0;end else if(!rst) begin if(m==6) begin m<=0;end else m<=m+1; if(m==2) cout1=~cout1; else if(m==5) c out1=~cout1; end end always @(negedge clk) begin if(rst) begin cout2<=0;n<=0;end else if(!rst) begin if(n==6) begin n<=0;end else n<=n+1; if(n==2) cout2=~cout2; else if(n==5) cout2=~cout2; end end Endmodule 仿真 `timescale 1ns / 1ps `define clk_cycle 50 module qii; reg clk,rst; wire cout1,cout2,cout; always #`clk_cycle clk=~clk; initial begin clk=0; rst=1;

数控分频verilog

EDA实验报告 数控分频器 实验目的 1.掌握数控分频器的工作原理并能够用virlog语言编写代码,熟悉EDA6000实验箱的 使用方法。 2.进一步熟悉quartusII建立程序编译、仿真及下载的操作流程并学会数控分频器的 V erilog硬件设计 实验步骤 1.新建V erilog工程,编写代码并保存至与模块名对应的文件夹。注意:项目应存为系 统盘以外的盘内,路径中不含中文字符。 2.编译程序,编译无误后,在【tools】里面选择RTL视,观察电路结构。 3.新建波形文件进行仿真。保存时要和源程序存放在同一目录下。设置好输入波形参数 后,开始仿真。在仿真后输入输出波形中观察逻辑关系是否正确。 4.将实验箱和PC合理连接起来。打开EDA6000软件,设置好芯片类型为ACEX1K (EP1K30TC144-3),载入模式9. 5.根据EDA6000界面内管脚对应芯片的实际管脚在QUARTUSII里面设定 管脚号并检查无误。 6.将程序下载至FPGA内,并在EDA6000软件界面内进行验证测试。 程序代码1 /////偶数分频占空比50%,奇数分频没做要求////////// module divider(clk,data,fout); //数控分频器 input clk; //时钟输入 input[7:0]data; //预置数控分频数(对应的十进制数) output fout; //分频输出 reg [7:0]m; reg cout1; always @(posedge clk) begin if(m==data-1)begin m<=0;cout1=~cout1;end else m<=m+1; if(m==(data-1)/2)begin cout1=~cout1;end else begin cout1<=cout1;end end assign fout=cout1; endmodule

VERILOG 分频原理

VERILOG 分频原理 众所周知,分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相环资源,如altera 的PLL,Xilinx的DLL.来进行时钟的分频,倍频以及相移。但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相移仍然非常流行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单元就可以达到对时钟操作的目的。另一方面,通过语言设计进行时钟分频,可以看出设计者对设计语言的理解程度。因此很多招聘单位在招聘时往往要求应聘者写一个分频器(比如奇数分频)以考核应聘人员的设计水平和理解程度。下面讲讲对各种分频系数进行分频的方法: 第一,偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。 第二,奇数倍分频:奇数倍分频常常在论坛上有人问起,实际上,奇数倍分频有两种实现方法: 首先,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转。即是在计数值在邻近的1和2进行了两次翻转。这样实现的三分频占空比为1/3或者2/3。如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。这种方法可以实现任意的奇数分频。归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。再者同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。 另外一种方法:对进行奇数倍n分频时钟,首先进行n/2分频(带小数,即等于 (n-1)/2+0.5),然后再进行二分频得到。得到占空比为50%的奇数倍分频。下面讲讲进行小数分频的设计方法

verilog奇偶分频器的实现

任意分频的verilog语言实现 现来说说分频原理吧,原理通了,什么都好办了。 1. 偶数倍(2N)分频 使用一模N计数器模块即可实现,即每当模N计数器上升沿从0开始计数至N-1时,输出时钟进行翻转,同时给计数器一复位信号使之从0开始重新计数,以此循环即可。偶数倍分频原理示意图见图1。 2. 奇数倍(2N+1)分频 (1)占空比为X/(2N+1)或(2N+1-X)/(2N+1)分频,用模(2N+1)计数器模块可以实现。取0至2N-1之间一数值X(0,当计数器时钟上升沿从0开始计数到X值时输出时钟翻转一次,在计数器继续计数达到2N 时,输出时钟再次翻转并对计数器置一复位信号,使之从0开始重新计数,即可实现。 (2)占空比为50%的分频,设计思想如下:基于(1)中占空比为非50%的输出时钟在输入时钟的上升沿触发翻转;若在同一个输入时钟周期内,此计数器的两次输出时钟翻转分别在与(1)中对应的下降沿触发翻转,输出的时钟与(1)中输出的时钟进行逻辑或,即可得到占空比为50%的奇数倍分频时钟。当然其输出端再与偶数倍分频器串接则可以实现偶数倍分频。奇数倍分频原理示意图见图2。(这也是许多公司常出的面试题,^_^,是不是很简单?) 3. N-0.5倍分频 采用模N计数器可以实现。具体如下:计数器从0开始上升沿计数,计数达到 N-1上升沿时,输出时钟需翻转,由于分频值为N-0.5,所以在时钟翻转后经历0.5个周期时,计数器输出时钟必须进行再次翻转,即当CLK为下降沿时计数器的输入端应为上升沿脉冲,使计数器计数达到N而复位为0重新开始计数同时输出时钟翻转。这个过程所要做的就是对CLK进行适当的变换,使之送给计数器的触发时钟每经历N-0.5个周期就翻转一次。N-0.5倍:取N=3,分频原理示意图见图3。 对于任意的N+A/B倍分频(N、A、B∈Z,A≦B)

N倍奇数分频器.(Verilog)

标签:Verilog分频器 N倍奇数分频器.(V erilog) N_odd_divider.v / Verilog module N_odd_divider ( input i_clk, input rst_n, output o_clk ); parameter N = N_odd; // 设置奇数(除1外)倍分频parameter M = ?; // M="N/2" // bit_of_N: N_odd的二进制位宽 reg [(bit_of_N - 1):0] cnt_p; // 上升沿计数单位 reg [(bit_of_N - 1):0] cnt_n; // 下降沿计数单位 reg clk_p; // 上升沿时钟 reg clk_n; // 下降沿时钟 assign o_clk = clk_n & clk_p; // 按位与(作用:掩码) // 上升沿计数器: 0~(N-1) always @ (posedge i_clk or negedge rst_n)

begin if (!rst_n) cnt_p <= 0; else begin if (cnt_p == N-1) cnt_p <= 0; else cnt_p <= cnt_p + 1'b1; end end // 生成上升沿时钟 // 0~(N>>1) ↑ -> 1;((N/2)+1)~(N-1) ↑ -> 0 always @ (posedge i_clk or negedge rst_n) begin if (!rst_n) clk_p <= 0; else begin if (cnt_p <= M) // 0 ~ (N/2) clk_p <= 1; else

Verilog HDL分频器设计报告

2011-2012第二学期专业选修课HDL语言应用与设计课程设计报告 Veriog HDL 分 频 器 设 计 报 告 设计时间:2012.4 班级:信科09-2 姓名:程雷 学号:08093534 指导老师:王冠军

一、设计目的和要求: 目的: 1、学会使用Quantus软件(编译、仿真等),并利用它进行设计一些简单的数字电路; 2、利用实验室提供的FPGA/CPLD实验箱,结合Quantus II软件实现分频器 的功能。 要求:分频器可以简单实用的设置分频系数。 二、实验器件和环境 实验室提供的FPGA/CPLD实验箱,PC机和Quantus II软件。 三、设计方案和源程序代码 首先分析分频器要实现的功能,然后确定他的基本结构,因为分频器的基本功能要使其分频的的功能可以控制,所以要有控制使能端口;分频器的分频系数可以自由选择,所以应有分频系数设置使能端;分频之后可以输出分频之后的频率,所以应该有输出端口。本本设计只是任意整数分频器。 1、偶数倍分频:偶数倍分频,通过计数器计数是完全可以实现的。如进行N 倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。 原理:比如4分频,需要一个模4的计数器,占空比50%,计数为0~3循环,当计数到一半时,即计数输出cnt<2时翻转。 例题代码如下: //四分频 module div4(clk,rst_n,o_clk); input clk,rst_n; output o_clk; reg o_clk; reg [1:0]cnt; always @(posedge clk or negedge rst_n) begin if(!rst_n) cnt<=0; else if(cnt==3) cnt<=0; else cnt<=cnt+1; end always @(posedge clk or negedge rst_n) begin if(!rst_n)

Verilog分频器设计

实验5 分频器设计 【实验目的】 在平时的应用中,经常会遇到一些需要特殊时钟的要求,这时就需要用到标准时钟,并且将它分频为我们想要的时钟,在本次实验中,将设计不同分频的分频器以满足设计的时钟要求。 【实验思考】 总的来说,分频器可以大致分为两种分频器,一种是奇数分频,还有一种则是偶数分频。然后是设计其占空比。 一、偶数分频 若给定一个偶数2N,要用标准时钟生成2N分频,首先我们要建立一个计数器,其模可为2N,也可为N,若为2N,则可以设置输出小雨N+1作电平从0到1或者相反,这样可以控制其占空比;若计数器模为N,则计数器计完一个循环便使输出翻转即可,这样得到了占空比为50%的输出,但其速度要比前者快一倍。以下以六分频为例编写一个占空比为50%的分频器。 【实验代码】 module jishuqi(Q,clk); input clk; output[2:0]Q; reg[2:0]Q; initial Q=3'b000; always@(posedge clk) begin Q=Q+1'b1; if(Q[0]) if(Q[1]) if(!Q[2]) Q=0;//模为3的计数器 end endmodule module feng61(clk,clo); input clk; output clo; wire [2:0]E; reg clo; initial clo=0; jishuqi u(E,clk) ; always@(E) begin if(!E[2]) if(!E[1])

if(!E[0]) begin clo=clo+1'b1;end end //偶数分频时,只需要计数器计到N/2时将待分频翻转即可,其中N单单取上升沿或者下降沿 endmodule 从仿真结果中可以看到除了初始的时钟显示不完整,其余的均为六分频 其rtl网表如下:

verilog实验四分频器

Verilog HDL实验报告 Verilog 实验报告 题目:分频器 系部名称:通信工程 专业名称:通信工程 班级: 班内序号: 学生姓名: 时间:2010.12.12

一、实验要求: 设计一个将10MHz时钟分频为500KHz的时钟,有复位端; 二、实验内容: 源文件 module fenpin(clr,a,b); input a; input clr; output b; integer i=0; reg b; always @(negedge clr or posedge a) if(!clr) begin b=0; i=0; end else begin i=i+1; if(i==11) begin b=~b; i=1; end end endmodule 测试文件 `timescale 10ns/100ps module fenpin_test; reg a; reg clr; wire b; fenpin u1(clr,a,b); initial begin $monitor($time,"clr=%b,a=%b,b=%b",clr,a,b); clr=1'b0; a=1'b0;

#5 clr=1'b1; end always #5 a=~a; endmodule # 0clr=0,a=0,b=0 # 5clr=1,a=1,b=0 # 10clr=1,a=0,b=0 # 15clr=1,a=1,b=0 # 20clr=1,a=0,b=0 # 25clr=1,a=1,b=0 # 30clr=1,a=0,b=0 # 35clr=1,a=1,b=0 # 40clr=1,a=0,b=0 # 45clr=1,a=1,b=0 # 50clr=1,a=0,b=0 # 55clr=1,a=1,b=0 # 60clr=1,a=0,b=0 # 65clr=1,a=1,b=0 # 70clr=1,a=0,b=0 # 75clr=1,a=1,b=0 # 80clr=1,a=0,b=0 # 85clr=1,a=1,b=0 # 90clr=1,a=0,b=0 # 95clr=1,a=1,b=1 # 100clr=1,a=0,b=1 # 105clr=1,a=1,b=1 # 110clr=1,a=0,b=1 # 115clr=1,a=1,b=1 # 120clr=1,a=0,b=1 # 125clr=1,a=1,b=1 # 130clr=1,a=0,b=1 # 135clr=1,a=1,b=1

相关主题
文本预览
相关文档 最新文档