目录
实验内容一
使用Veriog - HDL语言,DE0 FPGA开发板在 DE0 开发板的最右侧的 HEX LED 数码管上,进行计数并用十进制数进行显示。计数器特征如下:
该计数器在电路复位后会循环的从0值递增计数到最大值,计数最大值是一个循环变化的过程,计数器复位之后,第一次计数最大值是6,然后是7、8、9,然后计数最大值又变成6,如此往复循环, 计数数值变化的时间间隔是1秒 ,计数过程如下所示:
| 0 1 … 6 | 0 1 … 7 | 0 1 … 8 | 0 1 …9 | 0 1 … 6 |
|---|
Visio绘制的RTL
其中,max表示计数最大值;CNTVAL表示计数值,计数最大值要依次加一,加到9时再变为6。max[3..0]和CNTVAL[3..0]构成D触发器。CLK为1s周期。
Quartus扫描生成的RTL
顶层RTL:
cnt_sync为第一级计数器,其OV输出端用于产生1s的时钟信号;
cnt_0to9为第二级计数器,用于产生显示的计数值;
tubedec_4to16为数码管译码电路。
cnt_0to9底层RTL:
计数值的SignalTap截图
代码
Verilog HDL代码:
module cnt_sync(
RESET ,
CLK , // clock
CNTVAL, // counter value
OV ); // overflow
input CLK,RESET;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 50_000_000; //50MHz下为1s
reg [32-1:0] CNTVAL;
reg OV;
always @ (posedge CLK)
begin
if (!RESET)
begin
CNTVAL <= 0;
end
else
begin
if(CNTVAL >= MAX_VAL)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
end
always @ (CNTVAL) begin
if(CNTVAL == MAX_VAL)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule // module cnt_sync
////////////////////////////////////////////////////////
module cnt_en_0to9(
EN ,
RESET ,
CLK , // clock
CNTVAL); // counter value
// OV ); // overflow
input CLK,RESET,EN;
output [4-1:0] CNTVAL;
//output OV;
reg [4-1:0] CNTVAL;
//reg OV;
reg [4-1:0] max=6;
always @ (posedge CLK or negedge RESET)
begin
if(!RESET) //when rst, set max=6
begin
max <= 6;
CNTVAL <= 0;
end
else if(EN)
begin
if(CNTVAL >= max) //when OV, max++, if max=9,then max=6
begin
CNTVAL <= 0;
max <= max +

本文介绍了使用Verilog HDL在DE0 FPGA开发板上实现循环计数器的设计,计数器在复位后从0递增到9,然后循环回6,每秒变化一次。实验内容包括Visio绘制的RTL图,Quartus生成的RTL视图,SignalTap截图以及详细的代码展示。此外,还展示了如何在四个HEX LED数码管上实现不同计数范围的显示,并通过数码管选择器和译码器控制显示。
最低0.47元/天 解锁文章
3604

被折叠的 条评论
为什么被折叠?



