五、心得体会
虽然我以前上了Verilog HDL语言,但是这都实习中还是碰到了一些问题,通过向老师,向同学寻求帮助和在网上,在图书馆查找相关的资料来一点点解决遇到的问题,从中感觉自己对VHDL语言的理解又进了一步!对硬件描述语言和纯元件语言,如c语言之间的差别又有了更深一层次的理解,不过自我感觉想要对VHDL语言要很熟练的掌握的话,还需要多多的联系才行的。
六、思考题
1、本设计的测量结果在6个数码管上显示,若采用静态显示的方式,每位 显
示需4根输出线,共需24根据输出线;若用动态扫描方式,只需6+7=13根线。什么叫动态扫描显示方式?你能写出动态扫描输出显示的程序吗?
定顺序(从左至右或从右至左)进行点亮,当点亮的频率(即扫描频率)不大时,我们看到的是数码管一个个的点亮,然而,当点亮频率足够大时,我们看到的不再是一个一个的点亮,而是全部同时显示(点亮),与传统方
答: 动态数码扫描显示方式是利用了人眼的视觉暂留效应,把6个数码管按一
式得到的视觉效果完全一样。 动态扫描输出显示的程序如下:
module led_dong(seg,sl,clk); //静态模块显示 output [7:0] seg; //定义数码管段输出引脚 output[3:0] sl; //定义数码管位(选择)输出引脚 input clk; //定义输入时钟引脚
reg [7:0] seg_reg; //定义数码管段输出寄存器 reg [5:0] sl_reg; //定义数码管位输出寄存器 reg [5:0] disp_dat; //定义显示数据寄存器 reg [29:0] count; //定义计数器寄存器
always@(posedge clk) //定义clk信号下降延触发 begin
count=count+1; //计数器加1 end
always@(count[18:17]) //定义显示数据触发事件 begin
case(count[18:17]) //定义扫描显示数据 3'b000:disp_dat=6'b100000; //显示十万位数 3'b001:disp_dat=6'b010000; //显示万位数 3'b010:disp_dat=6'b001000; //显示千位数 3'b011:disp_dat=6'b000100; //显示百位数 3'b100:disp_dat=6'b000010; //显示十位数 3'b101:disp_dat=6'b000001; //显示个位数
endcase
case(count[19:17]) //选择数码管显示位 3'b000:sl_reg=6'b100000;; //选择个位数码管 3'b001:sl_reg=6'b010000;; //选择十位数码管 3'b010:sl_reg=6'b001000;; //选择百位数码管 3'b011:sl_reg=6'b000100;; //选择千位数码管 3'b100:sl_reg=6'b000010;; //选择万位数码管 3'b101:sl_reg=6'b000001;; //选择十万位数码管 endcase end
always@(disp_dat) //显示译码输出 begin
case(disp_dat) //选择输出数据 6'h0:seg_reg=8'hc0; //显示0 6'h1:seg_reg=8'hf9; //显示1 6'h2:seg_reg=8'ha4; //显示2 6'h3:seg_reg=8'hb0; //显示3 6'h4:seg_reg=8'h99; //显示4 6'h5:seg_reg=8'h92; //显示5 6'h6:seg_reg=8'h82; //显示6 6'h7:seg_reg=8'hf8; //显示7 6'h8:seg_reg=8'h80; //显示8 6'h9:seg_reg=8'h90; //显示9 6'ha:seg_reg=8'h88; //显示a 6'hb:seg_reg=8'h83; //显示b 6'hc:seg_reg=8'hc6; //显示c 6'hd:seg_reg=8'ha1; //显示d 6'he:seg_reg=8'h86; //显示e 6'hf:seg_reg=8'h8e; //显示f endcase end
assign seg=seg_reg; //输出数码管译码结果 assign sl=sl_reg; //输出数码管选择 endmodule
2、本设计与教材《数字系统设计与Verilog HDL语言》实验三的设计有何不同?
答:书上设计输入采用层次化设计,学习混合输入设计方法,即部分底层模块用Verilog HDL实现。而本设计全部采用Verilog HDL实现上述要求的频率计。