FPGA设计8位十进制计数器异步/同步模块以及m序列码产生器模块

简介: 本文主要介绍了FPGA设计8位十进制计数器异步/同步模块以及m序列码产生器模块


【实验三】设计一个8位十进制计数器(异步/同步)模块

  1. 实验内容与原理说明

根据计数器的构成原理,必须由四个触发器的状态来表示一位十进制数的四位二进制编码。而四位编码总共有十六个状态。所以必须去掉其中的六个状态,至于去掉哪六个状态,可有不同的选择。这里考虑去掉1010~1111六个状态,即采用8421BCD 码的编码方式来表示一位十进制数。

在十进制运算时,当相加二数之和大于9时,便产生进位。可是用BCD码完成十进制数运算时,当和数大于9 时,必须对和数进行加6修正。这是因为,采用BCD码后,在二数相加的和数小于等于9时,十进制运算的结果是正确的;而当相加的和数大于9时,结果不正确,必须加6修正后才能得出正确的结果。因此,当第一次近似求值时,可将它看成每一级是一个4位二进制加法器来执行,就好像X,和Y,是普通4位二进制数一样。设Si代表这样得到的4位二进制数和,Ci+1为输出进位,而Si代表正确的BCD和,Ci+1代表正确的进位,那么

当Xi+Yi+Ci<10时,Si= Si`

当Xi+Yi+Ci≥10时,Si=Si`+6

显然,当Ci+1=1或S≥10时,输出进位Ci+1=1。因此,可利用C i+1的状态来产生所要求的校正因子。C i+1=1时,校正因子为6;C i+1=0时校正因子为0。

当时钟信号CLK、复位信号RST、时钟使能信号EN或加载信号LOAD中任一信号发生变化,都将启动进程语句PROCESS。此时如果RST为'0',将对计数器清0,即复位。这项操作是独立于CLK的异步(独立)行为;如果RST为'1',则看是否有时钟信号的上升沿;如果此时有CLK 信号,且又测得 EN='1',接下去是判断加载控制信号 LOAD的电平。如果LOAD为低电平,则允许将输人口的4位加载数据置入计数寄存器中,以便计数器在此数基础上累加计数。而若LOAD为高电平,则允许计数器计数;此时若满足计数值小于9,即Q<9,计数器将进行正常计数,即执行语句“Q:=Q+1”,否则对计数器清0。但如果测得EN=’0’,则跳出IF语句,使Q保持原值,并将技术值向端口输出:“DOUT<=Q;”。

第二个IF语句的功能是当计数器Q的计数值达到9时由端口COUT输出高电平,作为十进制计数溢出的进位信号,而当Q为其他值时,输出低电平’0’。

  1. 实验模块程序代码和激励代码

(1)设计模块代码
module bit1Dcount(clk,dout,num,rst);
input clk;
input rst;
output reg dout;
output reg [3:0] num;

always@(posedge clk or negedge rst) begin

if(~rst) begin  
    num<=0;  
end  
else begin  
    if(num==9) begin  
        num<=0;  
        dout<=1;  
    end  
    else begin  
        num<=num+1;  
        dout<=0;  
    end  
end  

end

endmodule

module bit8Dcount(clk,dout,data,rst);
input clk;
input rst;
output reg dout=0;
output reg [31:0] data;

wire dout_1,dout_2,dout_3,dout_4,dout_5,dout_6,dout_7;
wire[31:0] num;
wire out;

bit1Dcount U0(.clk(clk),.dout(dout_1),.num(num[3:0]),.rst(rst));
bit1Dcount U1(.clk(dout_1),.dout(dout_2),.num(num[7:4]),.rst(rst));
bit1Dcount U2(.clk(dout_2),.dout(dout_3),.num(num[11:8]),.rst(rst));
bit1Dcount U3(.clk(dout_3),.dout(dout_4),.num(num[15:12]),.rst(rst));
bit1Dcount U4(.clk(dout_4),.dout(dout_5),.num(num[19:16]),.rst(rst));
bit1Dcount U5(.clk(dout_5),.dout(dout_6),.num(num[23:20]),.rst(rst));
bit1Dcount U6(.clk(dout_6),.dout(dout_7),.num(num[27:24]),.rst(rst));
bit1Dcount U7(.clk(dout_7),.dout(out),.num(num[31:28]),.rst(rst));

always@(posedge clk or negedge rst) begin

if(~rst) begin  
    data<=0;  
    dout<=0;  
end  
else begin  
    data<=num;  
    dout<=out;         
end  

end

endmodule

(2)激励模块代码
// Verilog Test Bench template for design : bit8Dcount
//
// Simulation tool : ModelSim (Verilog)
//

`timescale 1 ps/ 1 ps
module bit8Dcount_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg clk;
reg rst;
// wirst
wire [31:0] data;
wire dout;

// assign statements (if any)
bit8Dcount i1 (
// port map - connection between master ports and signals/registers

.clk(clk),  
.data(data),  
.dout(dout),  
.rst(rst)  

);
initial
begin
clk<=0;rst<=0;

4 rst<=1;

130000000 $stop;

end

always #1 clk<=~clk;
endmodule

  1. 波形仿真图

image.png

4.门级电路图

image.png

【四】设计一个m序列码产生器模块(要求:码长为31,寄存器级数5,反馈系数为75(八进制)的m序列产生器)

  1. 实验内容与原理说明

m序列又叫做伪随机序列、伪噪声(Pseudo Noise,PN)码或伪随机码,是一种可以资先确定、可以重复产生和复制又具有随机统计特性的二进制码序列。在通信系统中有着泛的应用,如扩频通信,卫星通信的码分多址,数字数据中的加密、加扰、同步、误码率测量等领域。

伪随机序列一般用二进制表示,每个码元(即构成m序列的元素)只有“0”或“1”两种取值,分别与数字电路中的低电平或高电平相对应。

m序列是对最长线性反馈移位寄存器序列的简称,它是一种由带线性反馈的移位寄存器所产生的序列,并且具有最长周期。下图所示是一种3位m序列产生器,它将最后两级触发器的输出通过同或门反馈到第一级的输入端,其工作原理是:在清零后,3个触发器的输出均为0,于是同或门的输出为1,在时钟触发下,每次移位后各级寄存器状态都会发生变化。分析该电路的仿真波形图,其中任何一级触发器(通常为末级)的输出都是一个周期序列(或者称为m序列),但各个输出端的m序列的初始相位不同。m序列的周期不仅与移位寄存器的级数有关,而且与线性反馈逻辑和初始状态有关。此外,在相同级数的情况下,采用不同的线性反馈逻辑所得到的周期长度是不同的。
image.png

通常,将类似于上图所示电路结构的m序列产生器称为简单型码序列发生器(Simple Shift Register Generator,SSRG),它的一般结构如图4.7.4所示、其中各个触发器构成位移寄存器。M序列反馈系数表如下所示:

image.png

  1. 实验模块程序代码和激励代码

(1)设计模块代码
module PNGenerator(clk,rst,en,dout,y);
input clk;
input rst;
input en;
output dout;
output reg [4:0] y;

assign dout=y[0];

always@(posedge clk or negedge rst) begin

if(~rst) begin  
    y<=5'b00001;  
end  
else if(en) begin  
    y[0]<=y[1];  
    y[1]<=y[2];  
    y[2]<=y[3];  
    y[3]<=y[4];  
    y[4]<=y[0]^y[1]^y[2]^y[3];  
end  
else begin  
    y<=y;  
end  

end

endmodule

(2)激励模块代码
// Verilog Test Bench template for design : PNGenerator
//
// Simulation tool : ModelSim (Verilog)
//

`timescale 1 ps/ 1 ps
module PNGenerator_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg clk;
reg en;
reg rst;
// wirst
wire dout;
wire [4:0] y;

// assign statements (if any)
PNGenerator i1 (
// port map - connection between master ports and signals/registers

.clk(clk),  
.dout(dout),  
.en(en),  
.rst(rst),  
.y(y)  

);
initial
begin
clk<=0;rst<=0;en<=0;

17

rst<=1;  

17

en<=1;  

6000 $stop;

end

always #5 clk<=~clk;

endmodule

  1. 波形仿真图

image.png

4.门级电路图
image.png

【实验结果分析及思考】
这次实验是设计8位异步二进制计数器模块、8位同步二进制计数器模块、8位十进制计数器以及m序列码产生器模块的实验,我更加理解了在FPGA课本一开始所介绍的,行为描述是最常用的描述方法。在实际的建模中,我从看到题目要求的迷惑,逐渐转变为仔细分析题目要求,建模的自信,很大原因归功于行为描述的简洁与清晰。同样,实验中需要注意的地方是有关于异步、同步还有位数以及进制的问题。

此外,通过实验,也让我从实践的角度理解了异步和同步二进制加法计数器的构成区别:异步二进制加法计数器的构成方法是将触发器接成计数触发器;最低位触发器用计数脉冲 CP 触发,其他触发器用邻低位输出的下降沿触发。而同步二进制加法计数器的构成方法:将触发器接成 T 触发器;各触发器都用计数脉冲 CP 触发,最低位触发器 的T 输入为 1,其他触发器的 T 输入为其低位各触发器输出信号相与。

在程序设计和原理图设计的过程中,我通过对Quartus的练习和使用,锻炼了自己的编程能力,对于Quartus和Modelsim联合仿真也比以往熟练不少,也学会了如何在遇到错误的时候冷静分析原因,例如端口的定义错误,测试程序的逻辑报错等等,通过对程序不断调试和改进,我对于verilog语言的理解有了很大的提升。

目录
相关文章
|
10天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现了16QAM基带通信系统,包括调制、信道仿真、解调及误码率统计模块。通过Vivado2019.2仿真,设置不同SNR(如8dB、12dB),验证了软解调相较于传统16QAM系统的优越性,误码率显著降低。系统采用Verilog语言编写,详细介绍了16QAM软解调的原理及实现步骤,适用于高性能数据传输场景。
109 69
|
15天前
|
移动开发 算法 数据安全/隐私保护
基于FPGA的QPSK调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的QPSK调制解调系统,通过Vivado 2019.2进行仿真,展示了在不同信噪比(SNR=1dB, 5dB, 10dB)下的仿真效果。与普通QPSK系统相比,该系统的软解调技术显著降低了误码率。文章还详细阐述了QPSK调制的基本原理、信号采样、判决、解调及软解调的实现过程,并提供了Verilog核心程序代码。
52 26
|
21天前
|
算法 异构计算
基于FPGA的4ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4-ASK调制解调系统的算法仿真效果、理论基础及Verilog核心程序。仿真在Vivado2019.2环境下进行,分别测试了SNR为20dB、15dB、10dB时的性能。理论部分概述了4-ASK的工作原理,包括调制、解调过程及其数学模型。Verilog代码实现了4-ASK调制器、加性高斯白噪声(AWGN)信道模拟、解调器及误码率计算模块。
43 8
|
28天前
|
算法 物联网 异构计算
基于FPGA的4FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4FSK调制解调系统的Verilog实现,包括高斯信道模块和误码率统计模块,支持不同SNR设置。系统在Vivado 2019.2上开发,展示了在不同SNR条件下的仿真结果。4FSK调制通过将输入数据转换为四个不同频率的信号来提高频带利用率和抗干扰能力,适用于无线通信和数据传输领域。文中还提供了核心Verilog代码,详细描述了调制、加噪声、解调及误码率计算的过程。
49 11
|
1天前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2FSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的2FSK调制解调系统,包含高斯信道、误码率统计模块及testbench。系统增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同SNR下的硬件测试,并提供操作视频指导。理论部分涵盖频移键控(FSK)原理,包括相位连续与不连续FSK信号的特点及功率谱密度特性。Verilog代码实现了FSK调制解调的核心功能,支持在不同开发板上移植。硬件测试结果展示了不同SNR下的性能表现。
18 6
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的1024QAM调制解调系统的仿真与实现。通过Vivado 2019.2进行仿真,分别在SNR=40dB和35dB下验证了算法效果,并将数据导入Matlab生成星座图。1024QAM调制将10比特映射到复数平面上的1024个星座点之一,适用于高数据传输速率的应用。系统包含数据接口、串并转换、星座映射、调制器、解调器等模块。Verilog核心程序实现了调制、加噪声信道和解调过程,并统计误码率。
45 1
|
2月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的64QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的64QAM调制解调通信系统的设计与实现,包括信号生成、调制、解调和误码率测试。系统在Vivado 2019.2中进行了仿真,通过设置不同SNR值(15、20、25)验证了系统的性能,并展示了相应的星座图。核心程序使用Verilog语言编写,加入了信道噪声模块和误码率统计功能,提升了仿真效率。
53 4
|
2月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现16QAM调制解调通信系统,使用Verilog语言编写,包括信道模块、误码率统计模块。通过设置不同SNR值(如8dB、12dB、16dB),仿真测试系统的误码性能。项目提供了完整的RTL结构图及操作视频,便于理解和操作。核心程序实现了信号的生成、调制、信道传输、解调及误码统计等功能。
51 3
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的256QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了256QAM调制解调算法的仿真效果及理论基础。使用Vivado 2019.2进行仿真,分别在SNR为40dB、32dB和24dB下生成星座图,并导入Matlab进行分析。256QAM通过将8比特数据映射到复平面上的256个点,实现高效的数据传输。Verilog核心程序包括调制、信道噪声添加和解调模块,最终统计误码率。
37 0
|
2月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
### 简介 本项目采用VIVADO 2019.2进行了十六进制相位移键控(16PSK)算法仿真,结果显示,在SNR=30dB时效果为Tttttttttttttt12,在SNR=20dB时效果为Tttttttttttttt34。系统RTL结构如Tttttttttttttt555555所示。16PSK是一种高效的相位调制技术,能在每个符号时间内传输4比特信息,适用于高速数据传输。其工作原理包括将比特流映射到16个相位状态之一(Tttttttttttttt777777),并通过匹配滤波和决策进行解调。具体Verilog核心程序见完整代码。
41 1

热门文章

最新文章