Quartus实验三,212卷积码和计数器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称通信系统集成电路设计
实验名称Quartus II实验三
专业班级
姓名
学号
日期 ______ 2012.1.2 __________
实验三: 212卷积码,十进制计数器
1. 实验目的
a) 掌握在FPGA 上实现212卷积码编码器的方法; b) 用原理图的方法实现十进制加法计数器。
2. 实验环境
a) Quartus II 9.1 (32-Bit)
b) ModelSim-Altera 6.5a (Quartus II 9.1) c) WinXP 操作系统
3. 实验要求
1) 212卷积码编码器
编写生成212卷积码编码器的程序,仿真后观察波形。 2) 十进制加法同步计数器
首先用VHDL 语言描述十进制加法计数器,然后画出它的原理图。 3) 思考题
16进制的计数器与PN4的电路图有什么区别。
4. 实验内容
1)212卷积码
卷积码编码器对输入的数据流每次1bit 或k bit 进行编码,输出n bit 编码符号。但是输出的分支码字的每个码元不仅与此时可输入的k 个bit 有关,也与前m 个连续式可输入的信息有关,因此编码器应包含m 级寄存器以记录这些信息。
通常卷积码表示为 (n,k,m). 编码率 k
r n
=
当k=1时,卷积码编码器的结构包括一个由m 个串接的寄存器构成的移位寄存器(成为m 级移位寄存器、n 个连接到指定寄存器的模二加法器以及把模二加法器的输出转化为穿行的转换开关。
本报告所讲的(2,1,2)卷积码是最简单的卷积码。就是2n =,1k =,m=2的卷积码。每次输入1 bit 输入信息,经过2级移位寄存器,2个连接到指定寄存器的模二加法器,并把加法器输出转化为串行输出。
212编码器原理图如图所示。
2)十进制加法计数器
综合数字逻辑电路的知识,设计出满足要求的电路图,然后用VHDL语言对所设计的电路进行描述。本计数器采用了四个D触发器和一些门级电路来完成。
通过D触发器的二分频功能,对时钟信号二分频后赋给Q(0),再对Q(0)二分频后赋给Q(1),再对Q(1)二分频后赋给Q(2),再对Q(2)二分频后赋给Q(3)。
但是,在设计时要注意,因为是10进制,当计数到达9后必须复位,所以设计一个带非门输入的与非门,输出连接到各D触发器的复位端口,当Q(3 to 0)=’1001’时,与非
门输出0并复位各D触发器。
5.实验步骤及结果
(一) 212编码器
1)建立名为juanji的新工程,编写212编码器的juanji.vdl和测试向量文件
tb_juanji.vdl,并添加到工程中;
2)用Modelsim仿真结果。
编译通过后仿真,结果如下:
图仿真波形图
clk是时钟信号,rst复位信号,d是输入序列,s是输出序列。
rst=1时复位,所有的寄存器置0;rst=0后,d输入序列先为1再为0最后又为1。观察可以看到,d为1的时候,s刚开始输出的序列是一样的。这是由于d为0的时间足够长,使两个寄存器里存的数都为0。而由于卷积码的输出不仅与当前的输入有关,还与前k bits个输入有关,所以当d持续为1时,输出s 也是有变化的。
(二)十进制加法计数器
1)counter10工程由两个模块构成。他们分别是:计数器模块counter10、测试向量模块tb_counter10。
编译成功后,仿真得到:
放大图后,在rst信号变0后,来的第一个时钟信号使data从零变成了
1,此后逐渐增加到9,然后归零又重新开始计数。可见设计图满足要
求。
点击Tools,然后点击Netlist Viewers,再选择RTL Viewer,就能根据程序生成寄存器传输级原理图。
6.需要注意的地方
(一)、卷积码编码器
a)s<=c1 when clk = '1' else c2; 这句话不能写在process里
源代码
architecture behave of juanji is
……
begin
……
s<=c1 when clk = '1' else c2;
process(rst,clk)
……
end process;
end behave;
一开始我在process里的elsif后面补充,
“elsif(clk=’1’) then
s<=c1;
else
s<=c2;
end if; ”
结果编译报错,Error (10818): Can't infer register for "s" at juanji.vhd(21) because it does not hold its value outside the clock edge.
应该把这个写在进程外,s<=c1 when clk = '1' else c2;
(二)、十进制加法计数器
a)、一开始以为D触发器能够像原来寄存器那样用std_logic_vector来声明就可以,后来写程序遇到麻烦才意识到D触发器要自己描述:
elsif(clock'event and clock='1') then
if(count='1')then
Q<="1010";
else
if(D(0)='1')then
Q(0)<= not Q(0);
end if;
if(D(1)='1')then
Q(1)<= not Q(1);
end if;
if(D(2)='1')then
Q(2)<= not Q(2);
end if;
if(D(3)='1')then
Q(3)<= not Q(3);
end if;
end if;
7.实验结论:
这次的实验包括卷积码生成器和十进制计数器。两个电路都少不了D触发器,前者是利用其存储的功能,后者是利用其二分频的功能。十进制计数器也比上次的16进制计数器要稍微复杂些;另外,这次也学习了如何根据VHDL描述语言生成寄存器传输级电路图。通过这次学习,我加深了对VHDL语言的理解。
思考题:16进制的计数器与PN4的电路图有什么区别。
1.周期不同:PN4的周期是2^4-1=15, 16进制的计数器的周期是16;
2. 都使用了D触发器,但PN4是利用其存储的功能,16进制的计数器是利用其二分频的功能。
8.附程序
1.卷积码生成器
(1)模块程序(juanji.vhd)