EDA实验(4)

2019-02-15 19:11

实验四 8位十进制频率计

1、实验目的

设计 8位十进制频率计,学习较复杂的数字系统设计方法。学习VerilogHDL编程例化语句的使用。 2、实验内容

在实验平台上实现 8位十进制频率计的设计。被测信号从 CLOCK0(数字信号时钟源)输入,经过检测后测得的频率值用数码管 1~8 显示。 3、实验原理

根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1 秒的输入信号脉冲计数允许的信号;1 秒计数结束后,计数值锁入锁存器,并为下一测频计数周期作准备的计数器清零。计数器在这里是由 8 个十进制计数器级连组成,如下图所示是频率计的计数结构图,从图中可以看出十进制模块之间是由进位链级连而成的。

4、 电路连接 (1) 将EDA-MK-01模块跳线帽设置为SEG_a—SEG_dp和COM0—COM7端。 (2) 确保数字信号源的X12的短路帽处于ON位置。 (3) 引脚分配

PIN_23 -to clk

PIN_130 -to clock0 PIN_74 -to seg\\[0\\] PIN_72 -to seg\\[1\\] PIN_69 -to seg\\[2\\] PIN_68 -to seg\\[3\\] PIN_67 -to seg\\[4\\] PIN_64 -to seg\\[5\\] PIN_63 -to seg\\[6\\] PIN_61 -to seg\\[7\\] PIN_86 -to dig\\[0\\] PIN_84 -to dig\\[1\\] PIN_82 -to dig\\[2\\] PIN_81 -to dig\\[3\\] PIN_80 -to dig\\[4\\] PIN_77 -to dig\\[5\\] PIN_76 -to dig\\[6\\] PIN_75 -to dig\\[7\\]

5、 实验程序

(1) scan_led.v

module scan_led(clk_1k,d,dig,seg); //模块名scan_led input clk_1k; //输入时钟

input[31:0] d; output[7:0] dig; output[7:0] seg;

reg[7:0] seg_r; reg[7:0] dig_r; reg[3:0] disp_dat; reg[2:0]count;

assign dig = dig_r; assign seg = seg_r;

always @(posedge clk_1k) begin

count <= count + 1'b1; end

always @(posedge clk_1k) begin

case(count) 3'd0:disp_dat = d[31:28]; 3'd1:disp_dat = d[27:24]; 3'd2:disp_dat = d[23:20]; 3'd3:disp_dat = d[19:16]; 3'd4:disp_dat = d[15:12]; 3'd5:disp_dat = d[11:8]; 3'd6:disp_dat = d[7:4]; 3'd7:disp_dat = d[3:0]; endcase

case(count) 3'd0:dig_r = 8'b01111111; 3'd1:dig_r = 8'b10111111; 3'd2:dig_r = 8'b11011111; 3'd3:dig_r = 8'b11101111; 3'd4:dig_r = 8'b11110111; 3'd5:dig_r = 8'b11111011; 3'd6:dig_r = 8'b11111101; 3'd7:dig_r = 8'b11111110; endcase end

always @(disp_dat) begin

case(disp_dat)

//输入要显示的数据 //数码管选择输出引脚 //数码管段输出引脚 //定义数码管输出寄存器 //定义数码管选择输出寄存器 //定义显示数据寄存器 //定义计数寄存器 //输出数码管选择

//输出数码管译码结果

//定义上升沿触发进程

//选择扫描显示数据

//第一个数码管 //第二个数码管 //第三个数码管 //第四个数码管 //第五个数码管 //第六个数码管 //第七个数码管 //第八个数码管 //选择数码管显示位 //选择第一个数码管显示 //选择第二个数码管显示 //选择第三个数码管显示 //选择第四个数码管显示 //选择第五个数码管显示 //选择第六个数码管显示 //选择第七个数码管显示

//选择第八个数码管显示

//七段译码

4'h0:seg_r = 8'hc0; 4'h1:seg_r = 8'hf9; 4'h2:seg_r = 8'ha4; 4'h3:seg_r = 8'hb0; 4'h4:seg_r = 8'h99; 4'h5:seg_r = 8'h92; 4'h6:seg_r = 8'h82; 4'h7:seg_r = 8'hf8; 4'h8:seg_r = 8'h80; 4'h9:seg_r = 8'h90; 4'ha:seg_r = 8'h88; 4'hb:seg_r = 8'h83; 4'hc:seg_r = 8'hc6; 4'hd:seg_r = 8'ha1; 4'he:seg_r = 8'h86; 4'hf:seg_r = 8'h8e; endcase end

endmodule

(2) freqtest.v(设为顶层实体)

module freqtest(clk,clock0,dig,seg); input clk; input clock0;

output[7:0] dig; output[7:0] seg;

//显示0 //显示1 //显示2 //显示3 //显示4 //显示5 //显示6 //显示7 //显示8 //显示9 //显示a //显示b //显示c //显示d //显示e //显示f

//系统时钟 //被测信号输入

//数码管选择输出引脚 //数码管段输出引脚 //时钟分频计数器 //频率测量结果寄存器 //脉冲计数寄存器 //1Hz闸门信号 //数码管扫描显示时钟

reg[25:0] counter; reg[31:0] freq_result; wire[31:0] pre_freq; reg rst;

wire divide_clk; wire clk_scan; wire cout1,cout2,cout3,cout4,cout5,cout6,cout7;

assign clk_scan = counter[15];

//时钟分频进程:分出1Hz基准信号 always @(posedge clk) begin

if (divide_clk)

counter <= 26'd0; else

//动态扫描时钟

counter <= counter + 1'b1; end

assign divide_clk = (counter >= 26'd50000000);

//锁存测量值进程

always @(posedge clk) begin

if(divide_clk) freq_result <= pre_freq; end

//产生计数器复位信号

always @(posedge clk) begin

if(divide_clk) rst <= 1'b1; else rst <= 1'b0; end

//8位十进制计数模块:由8个十进制计数模块构成

cnt10 u1(.clock(clock0),.rst(rst),.cin(1'b1),.cout(cout1),.dout(pre_freq[3:0])); cnt10 u2(.clock(clock0),.rst(rst),.cin(cout1),.cout(cout2),.dout(pre_freq[7:4])); cnt10 u3(.clock(clock0),.rst(rst),.cin(cout2),.cout(cout3),.dout(pre_freq[11:8])); cnt10 u4(.clock(clock0),.rst(rst),.cin(cout3),.cout(cout4),.dout(pre_freq[15:12])); cnt10 u5(.clock(clock0),.rst(rst),.cin(cout4),.cout(cout5),.dout(pre_freq[19:16])); cnt10 u6(.clock(clock0),.rst(rst),.cin(cout5),.cout(cout6),.dout(pre_freq[23:20])); cnt10 u7(.clock(clock0),.rst(rst),.cin(cout6),.cout(cout7),.dout(pre_freq[27:24])); cnt10 u8(.clock(clock0),.rst(rst),.cin(cout7),.cout(),.dout(pre_freq[31:28]));

//数码管显示模块

scan_led u9(.clk_1k(clk_scan),.d(freq_result),.dig(dig),.seg(seg));

endmodule

(3)count10.v

module cnt10(clock,rst,cin,cout,dout); //10进制计数器 input clock; //计数时钟 input cin; //进位输入 input rst; //复位信号 output cout; //进位输出 output[3:0] dout; //计数输出 reg[3:0] counter; //寄存器

assign dout = counter;

assign cout = cin && (counter >= 4'd9); //进位输出

always @(posedge clock or posedge rst) begin if(rst) counter <= 4'd0; else if(cin) begin if(cout) counter <= 4'd0; else counter <= counter + 1'b1; end end

endmodule

//计数器复位 //进位输入


EDA实验(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:北京理工大学自动控制理论04-08真题及解析

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: