3'd0:disp_dat = hour[3:0]; 3'd1:disp_dat = hour[7:4]; 3'd2:disp_dat = 4'ha; 3'd3:disp_dat = hour[11:8]; 3'd4:disp_dat = hour[15:12]; 3'd5:disp_dat = 4'ha; 3'd6:disp_dat = hour[19:16]; 3'd7:disp_dat = hour[23:20]; endcase
case(count[17:15])
//秒个位 //秒十位 //显示\ //分个位 //分十位 //显示\//时个位 //时十位
//选择第一个数码管显示 //选择第二个数码管显示 //选择第三个数码管显示 //选择第四个数码管显示 //选择第五个数码管显示 //选择第六个数码管显示 //选择第七个数码管显示 //选择第八个数码管显示
3'd0:dig_r = 8'b11111110; 3'd1:dig_r = 8'b11111101; 3'd2:dig_r = 8'b11111011; 3'd3:dig_r = 8'b11110111; 3'd4:dig_r = 8'b11101111; 3'd5:dig_r = 8'b11011111; 3'd6:dig_r = 8'b10111111; 3'd7:dig_r = 8'b01111111; endcase end
always @(posedge clk) begin case(disp_dat)
4'h0:seg_r = 8'hc0; //显示0 4'h1:seg_r = 8'hf9; //显示1 4'h2:seg_r = 8'ha4; //显示2 4'h3:seg_r = 8'hb0; //显示3 4'h4:seg_r = 8'h99; //显示4 4'h5:seg_r = 8'h92; //显示5 4'h6:seg_r = 8'h82; //显示6 4'h7:seg_r = 8'hf8; //显示7 4'h8:seg_r = 8'h80; //显示8 4'h9:seg_r = 8'h90; //显示9 4'ha:seg_r = 8'hbf; //显示- default:seg_r = 8'hff; //不显示 endcase if((count[17:15]== 3'd2)&sec) seg_r = 8'hff; end
//计时处理部分
always @(negedge sec or negedge key_done[1])//计时处理 begin
if(!key_done[1]) begin hour = 24'h0; end
else if(!keyen) begin hour[3:0] = hour[3:0] + 1'b1; if(hour[3:0] == 4'ha) begin hour[3:0] = 4'h0;
//是清零键吗? //是,则清零
//秒加1
hour[7:4] = hour[7:4] + 1'b1; //秒的十位加一 if(hour[7:4] == 4'h6) begin hour[7:4] = 4'h0;
hour[11:8] = hour[11:8] + 1'b1;//分个位加一 if(hour[11:8] == 4'ha) begin hour[11:8] = 4'h0; hour[15:12] = hour[15:12] + 1'b1;//分十位加一 if(hour[15:12] == 4'h6) begin hour[15:12] = 4'h0;
hour[19:16] = hour[19:16] + 1'b1;//时个位加一
if(hour[19:16] == 4'ha) begin hour[19:16] = 4'h0; hour[23:20] = hour[23:20] + 1'b1;//时十位加一 end if(hour[23:16] == 8'h24) hour[23:16] = 8'h0; end end end end end end
endmodule
实验九 利用PWM实现DAC 转换
1、实验目的
学习使用 PWM 进行 DAC 转换,了解 PWM-DAC 电压转换的原理。 2、实验内容
本实验的内容是设计一个PWM信号产生模块,并通过外部低通滤波电路将PWM信号转换为直流信号,硬件原理图如图所示,PWM占空比对应的值由数码管 LED5~LED8显示,并由 K3、K2、RESET控制。
3、电路连接
(1)将EDA-MK-01模块跳线帽设置为SEG_a—SEG_dp和COM0—COM7端。 (2)引脚分配
#key0,key1,KEY2分别为2C5核心板的K1,K2,K3 PIN_23 -to clk
PIN_4 -to key\\[2\\] PIN_120 -to key\\[1\\] PIN_119 -to key\\[0\\] PIN_96 -to pwm_out 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)pwm_logic.v
module pwm_logic(clock,pwm_enable,reset_n,clock_divide,duty_cycle,pwm_out);
input clock; input [31:0] clock_divide; input [31:0] duty_cycle; input pwm_enable; input reset_n; output pwm_out; reg [31:0] counter; reg pwm_out; //输入时钟,用于PWM分频
//时钟分频值 //占空比周期值 //使能信号 //信号信号 //PWM输出 //PWM内部计数器
//PWM计数进程
always @(posedge clock or negedge reset_n) begin
if (~reset_n) begin counter <= 32'd0; end
else if(pwm_enable) begin if (counter >= clock_divide) counter <= 32'd0; else counter <= counter + 1'b1; end end
//PWM比较进程
always @(posedge clock or negedge reset_n) begin
if (~reset_n) begin pwm_out <= 0; end else begin if (pwm_enable & (counter <= duty_cycle)) pwm_out <= 1'b1; else pwm_out <= 1'b0; end end
endmodule
(2)pwm_dac.v(顶层实体)
module pwm_dac(clk,reset_n,seg,dig,key,pwm_out); input clk; input reset_n;
output [7:0] seg;
output [7:0] dig; input [2:0] key;
output pwm_out;
wire [15:0] duty_cycle;
pwm_logic U1( .clock(clk),
.pwm_enable(1'b1), .reset_n(reset_n), .clock_divide(32'hfff),
.duty_cycle({16'd0,duty_cycle}), .pwm_out(pwm_out) );
key_led U2( .clock(clk),
.key({4'b1111,key,1'b1}), .led(),
.hex(duty_cycle), .bin(), .seg(seg), .dig(dig), .ledin(4'd0), .data(16'd0) );
endmodule (3)key_led.v
module key_led(clock,key,led,hex,bin,seg,dig,ledin,data); input clock; //系统时钟(50MHz) input [7:0] key; //按键输入(KEY1~KEY8) output [7:0] led; //LED输出(LED1~LED8) output [15:0] hex; //4位16进制数输出(在数码管1~4显示) output [3:0] bin; //4位2进制数输出(在LED1~LED4显示) output [7:0] seg; //数码管段码输出 output [7:0] dig; //数码管位码输出 input [3:0] ledin; //LED显示输入(在LED5~LED8显示) input [15:0] data; //数码管显示输出(在数码管5~8显示)
reg [15:0] hex_r; reg [3:0] bin_r; reg [7:0] seg_r; reg [7:0] dig_r;