Zedboard---实验七秒计数
2017-05-02 15:30
726 查看
Zedboard—实验七秒表
在上节实验中的计数器是一个16进制的计数器,只能从0计到15。这节做类似秒表的计数器从0计到59。硬件实现十进制计数
如果用软件来实现这个任务是很简单的:只需相除和取余运算就可以得到十进制数。实际上这些运算器相对实现起来成本较高。使用硬件实现,完成十进制计数。首先,创建一个模块代表十进制数。输出BCD(Bingary Coded Decimal)。代码:`timescale 1ns/1ns module bcd_digit #( parameter modulus = 10 ) ( input clk, input carry_in, output reg [$clog2(modulus)-1:0] digit, output carry_out ); initial digit = 0; assign carry_out = carry_in && digit == modulus-1; always @(posedge clk) if (carry_in) if (carry_out) digit <= 0; else digit <= digit+1; endmodule
参数modulus代表计数的最大值,carry_in为计数输入。carry_out可以作为进位信号输出。由于这里使用的是参数modulus,不能确定输出的位宽。所以使用内嵌函数$clog2以2为底取对数,来确定信号位宽。
由此修改上节实验中的top文件:
wire [7:0] sec_count; wire ones_carry_out; bcd_digit #(10) ones_digit ( .clk(clk), .carry_in(sec_pulse), .digit(sec_count[3:0]), .carry_out(ones_carry_out) ); bcd_digit #(6) tens_digit ( .clk(clk), .carry_in(ones_carry_out), .digit(sec_count[6:4]), .carry_out() ); assign sec_count[7] = 0;
由于计数最大值为59,即十位最大值为5。所以这里只用了3为来代表十位数值sec_count[6:4]。
修改测试文件
由于测试模块是软件实现,所以使用了整除和取余操作。`timescale 1ns/1ns module model #( parameter ms_limit = 100000 ) ( input clk, output [7:0] seconds ); integer counter = 0; always @(posedge clk) counter <= counter+1; reg [7:0] seconds_value; always @(posedge clk) seconds_value <= (counter / (ms_limit * 1000))%60; assign seconds[3:0] = seconds_value % 10; assign seconds[7:4] = seconds_value / 10; endmodule
原文连接
相关文章推荐
- Zedboard---实验六秒计数
- zedboard的裸机中断实验(一)
- Zedboard---实验二仿真
- 实验 使用 vivado zedboard GPIO 开关 开控制 LED
- Storm实验 -- 单词计数4
- 兰州大学数据结构课程设计实验七:文本文件单词的检索及计数
- Zedboard---实验五点亮另一个数码管
- zedboard的裸机中断实验(一)
- zedboard--单独PL实验(四)
- Zedboard---实验三阻塞非阻塞
- 实验 使用 vivado zedboard GPIO 开关 开控制 LED
- MOOC清华《面向对象程序设计》第8章:智能指针与引用计数实验
- Storm实验 -- 单词计数2
- Zedboard---实验四驱动7段数码管
- zedboard--拷贝到SD卡启动的fsbl引导裸跑程序实验(九)
- Zedboard---实验一点亮一盏LED
- 数字计数问题(算法实验)
- Zedboard学习(三):PL下流水灯实验 标签: fpgazynqPL 2017-07-05 11:09 21人阅读 评论(0)
- Storm实验 -- 单词计数3
- 单片机 计数/定时 中断实验