当前位置:文档之家› 数字系统实践报告

数字系统实践报告

仿真代码主要部分: initial begin // Initialize Inputs clk = 0;
8
rst = 0; freq_sel = 0;
// Wait 100 ns for global reset to finish #100; // Add stimulus here //#100 rst=1; #100 rst=0; #125 freq_sel=3; end always#50 clk=~clk;
3. PicoBlaze 模块
Xilinx 公司的嵌入式解决方案以 3 类 RISC 结构的微处理器为核心,涵盖了系统硬件设计 和软件调试的各个方面。3 类嵌入式内核分别为:PicoBlaze、MicroBlaze 和 PowerPC,其中 PicoBlaze 和 MicroBlaze 是可裁剪的软核处理器,PowerPC 为硬核处理器。 PicoBlaze 是 8 位 微 处 理 器 , 在 Xilinx 公 司 的 Virtex 、 Spartan-II 系 列 以 上 FPGA 与 CoolRunner-II 系列以上的 CPLD 器件设计中以 IP 核的方式提供,使用是免费的。 PicoBlaze 起初命名为 KCPSM, 是 Constant(K) Coded Programmable State Machine 的简称, 意为常量编码可编程状态机。 KCPSM 还有个别称叫 Ken Chapman's PSM ,Ken Chapman 是 Xilinx 的微控制器设计者之一。 PicoBlaze 是由 VHDL 语言在早期开发的小型 8 位软处理器内核包,其汇编器是简单的 DOS 可执行文件 KCPSM2.exe 或 KCPSM3.exe,用汇编语言编写的程序经过编译后放入 FPGA 的块 RAM 存储器区。在 XC3S500E 的 FPGA 中,只用到了 96 个 Silice ,也就是只占用到 5% 的逻辑资源。 PicoBlaze 执行一条命令需要 2 个时钟周期, 在 Spartan3E Starter Kit 板上以 50MHz 时钟为例,PicoBlaze 也能达到 25MIPS 的性能。 具体程序运用的介绍我们放到最后的频率计设计中。
4
a=15; #100 b=15; #100 b=4; end endmodule
4 位全加器的源代码来自于组合逻辑的化简而得到的一系列逻辑关系,而这部分 Verilog HDL 的语法也相对简单, 所以不做过多的解释。 Xilinx 给我们提供了一个很好的仿真环境, 通过编写测试代码,我们很明显的看到进位标志位 cf 和溢出标志位 ovf 随着 a 和 b 的变 化,如下图所示:
二 实验内容
1. 2. 3. 4. 5. 组合逻辑电路练习:多路选择器、加法器、减法器的实现 时序逻辑电路练习:移位寄存器、计数器、状态机的实现 根据资料,完成 Kcpsm3 实现计算机与开发板的通信 自主设计频率计
三 实验过程记录及分析
1. 组合逻辑电路
这里以加法器来说明 Verilog HDL 语言在设计组合逻辑电路时的运用。 如下是 4 位加法器(全加器)的原理图:
这个电路实现了两个 4 位的数 a 和 b 的相加,结果为 s,同时进位标志位为 cf,溢出标志位 为 ovf。根据数字电路的知识,我们知道对于 4 位全加器,当无符号数的和超过 15 时,进 位标志位 cf 被设置,当有符号数的和在 -16~15 之外时,溢出标志位被设置。这是一个典型 的组合逻辑电路。 我们在 Xilinx 中创建 Project,通过一系列初始化设置之后,输入代码: module adder4a( input wire [3:0]a,
5
测试代码: module test; // Inputs reg clr; reg clk; // Outputs wire [3:0] q; // Instantiate the Unit Under Test (UUT) mod10cnt uut ( .clr(clr), .clk(clk), .q(q) ); initial begin // Initialize Inputs clr = 0; clk = 0; // Wait 100 ns for global reset to finish #100; // Add stimulus here #50 clr=1; #50 clr=0; #600 clr=1; #50 clr=0; end always#25 clk=~clk; endmodule 在这个电路中,在每个 clk 信号的上升沿检测 clr 信号和计数寄存器 q 的值,如果 clr 信 号为 1 则复位为 0,如果 q 达到 9 也需回归到 0。通过仿真得到如下的图,符合我们设计的 想法。
测试代码: module test; // Inputs reg [3:0] a; reg [3:0] b; // Outputs wire [3:0] s; wire cf; wire ovf; // Instantiate the Unit Under Test (UUT) adder4a uut ( .a(a), .b(b), .s(s), .cf(cf), .ovf(ovf) ); initial begin // Initialize Inputs a = 0; b = 0; // Wait 100 ns for global reset to finish #100; // Add stimulus here #100 a=5; #100 b=1; #100 b=8; #100
5. 频率计的设计
频率计(Cymometer) ,顾名思义就是测量一个信号频率的设备。这里的信号只是限于方 波信号,占空比可以任意设定。 根据模块化设计的原则,本次频率计设计的模块有信号产生模块、计数器和发送模块、 PicoBlaze 模块(来自于实验三) 、串口模块(来自于实验四) 。由于编程水平和时间限制, 我没能自主设计实现整个频率计, 最终使用了老师提供的代码完成了本次试验。 后来我对整 个代码进行了阅读和理解,并进行大量的仿真,最后也大体能够明白代码的含义。所以这个
always @( posedge clk ) begin if( rst ) cnt <= 0; else cnt <= cnt + 1;//4 位计数 end always @( posedge clk ) begin if( rst ) pre_signal <= 0; else case( freq_sel ) 2'b00 : pre_signal <= cnt[0];//2 分频 2'b01 : pre_signal <= cnt[1];//4 分频 2'b10 : pre_signal <= cnt[2];//8 分频 2'b11 : pre_signal <= cnt[3];//16 分频 endcase end endmodule
四 实验总结………………………………………………………………………………………………………………………18
五 参考文献………………………………………………………………………………………………………………………18
2
一 实验目的
1.完成频率计(和占空比测量仪)的设计、实现和验证,熟练掌握烧写和通过 UART 串口传 送数据并通过超级终端观察输出结果的操作 2.频率计设计,由频率计模块测量信号产生模块(此模块是给定的)的频率值,并通过串口 向 PC 发送;发送时间:1 秒;精度要求:测量误差小于 5Hz 3.学会对 Verilog 程序模块设计 TestBeach,进行仿真测试 4.理解状态机的概念,并能够根据程序画出状态机或者根据状态机设计程序 5.理解频率计设计中的汇编程序
4. 计算机与 PicoBlaze 的串行通信
在本次实验中我们使用了 Architecture Wizard 完成了一个时钟管理模块的设计,并第一 次接触到了硬件开发板。通过分配引脚,定义引脚功能,我们实现了一个“定时闹钟”的功 能。这个功能的实现还有赖于计算机和 PicoBlaze 的串行通信,我们通过计算机上的超级终 端设置时间实现了对开发板上的 LED 灯的定时控制。 串行通信也是最后频率计设计的主要模 块之一。
计数器模块是下面频率计中实现分频和脉冲计数的重要基础模块。 在这里需要注意的一点是, 我们在时序逻辑电路中需要。 所谓阻塞赋值, 就是指赋值表达式右边的值立即赋值给左 边的变量,这个过程是要先于后面的语句的,可以理解为在这个地方进行阻塞。而非阻塞赋 值,可以分为两个过程,一个是存取,一个是赋值,而这个赋值的时刻就是我们设置的条件 (在这里是 always@(posedge clk) ) 。所以对于非阻塞赋值,赋值表达式左边的变量得到的 是右边变量原来的值。
7
实验报告也是以理解老师的代码为主。 个人认为,本次实验的待测试信号是由程序设定控制 Clocking Wizard 产生的一个方波。 实验中的其他 clk 信号也是由 Clocking Wizard 产生的,在实验中为 my_DCM 模块。 1)待测信号产生模块 首先是信号产生模块,这里是 Wave_Gen 和 Second_Gen,第一个模块是产生待测信号, 第二个模块是产生 1s 的闸门信号。 Wave_Gen 中的 Freq_Div 模块是一个通过输入信号选择分频的模块,前面已经提到计数 器是分频模块的基础。这里使用了一个 4 位 16 进制计数器,对于从低位到高位的每一位信 号,相当于将初始时钟信号进行了 2 分频、4 分频、8 分频、16 分频。 下面是其代码: module Freq_Div( input clk, input rst, input [1:0] freq_sel, output reg pre_signal ); reg [3:0] cnt;
2. 时序逻辑电路
因为最后的频率计设计中会用到大量的计数器模块, 所以在这里以计数器来说明 Verilog HDL 语言在时序逻辑电路中的运用。 在这里我们设计的是一个模 10 计数器。 模 10 计数器就是从 0 到 9 重复计数, 它一共要 经历 10 个状态,从 0000 到 1001 再回到 0000。设计这个计数模块需要用到时钟模块 clk 来 控制,所以这是一个时序逻辑电路。 编写代码如下: module mod10cnt(input wire clr, input wire clk, output reg[3:0]q ); always@(posedge clk) begin if(clr==1) q<=0; else if(q==9) q<=0; else q<=q+1; end endmodule
相关主题