2017春FPGA阶段二作业

xiaoxiao2021-02-28  88

题目2-1:多周期-恒最大值计数-显示电路

设计思路:电路应由3部分构成 第一部分,秒脉冲生成器,输出秒脉冲信号,每秒输出1个CLK周期的高电平,用于后级电路的工作使能。 第二部分,0-9多周期计数器,每个工作使能有效的CLK周期,进行一次计数动作。 第三部分,4-7译码器,把0-9计数器的计数值,译码成HEX LED 的显示逻辑值

设计原理图

秒脉冲生成器RTL图

Verilog HDL代码

module clk_sec( CLK , CNTVAL, OV ); input CLK; output [32-1:0] CNTVAL; output OV; parameter MAX_VAL = 50_00_0000; reg [32-1:0] CNTVAL; reg OV; always @ (posedge CLK) begin if(CNTVAL >= MAX_VAL) CNTVAL <= 0; else CNTVAL <= CNTVAL + 1'b1; end always @ (CNTVAL) begin if(CNTVAL == MAX_VAL) OV = 1'b1; else OV = 1'b0; end endmodule

0-9计数器RTL图

Verilog HDL代码

module cnt0to9( CLK , // clock CNTVAL, // counter value EN , OV ); // overflow input CLK; input EN; output [4-1:0] CNTVAL; output OV; reg [4-1:0] CNTVAL; reg OV; always @ (posedge CLK ) begin if(EN) begin // work enable if(CNTVAL >= 9) CNTVAL <= 0; else CNTVAL <= CNTVAL + 1'b1; end else CNTVAL <= CNTVAL ; end always @ (CNTVAL) begin if(CNTVAL == 9) OV = 1'b1; else OV = 1'b0; end endmodule

4-7译码器RTL图

Verilog HDL代码

module dec47 (data_in ,data_out ); input [3:0] data_in ; output [6:0] data_out ; reg [6:0] data_out ; always @(data_in ) begin data_out = 7'b1111111; case (data_in ) 4'b0000: data_out = 7'b1000000; // 0 4'b0001: data_out = 7'b1111001; // 1 4'b0010: data_out = 7'b0100100; // 2 4'b0011: data_out = 7'b0110000; // 3 4'b0100: data_out = 7'b0011001; // 4 4'b0101: data_out = 7'b0010010; // 5 4'b0110: data_out = 7'b0000011; // 6 4'b0111: data_out = 7'b1111000; // 7 4'b1000: data_out = 7'b0000000; // 8 4'b1001: data_out = 7'b0011000; // 9 4'b1010: data_out = 7'b0001000; // A 4'b1011: data_out = 7'b0000011; // b 4'b1100: data_out = 7'b0100111; // c 4'b1101: data_out = 7'b0100001; // d 4'b1110: data_out = 7'b0000110; // E 4'b1111: data_out = 7'b0001110; // F default: data_out = 7'b1111111; endcase end endmodule

Signaltap的分段触发捕获

题目2-2 :LED 亮度调节

设计思路:电路应由两部分构成 第一部分,1600Hz的脉冲发生器,10ms内有16个高电平脉冲,便于调节方波占空比 第二部分,四个不同占空比的方波发生器,根据对输入脉冲的计数,调节输出的正负,控制占空比

设计原理图

1600Hz的脉冲发生器RTL图

Verilog HDL代码

module clk_f1600( CLK , // clock CNTVAL, // counter value OV ); // overflow input CLK; output [32-1:0] CNTVAL; output OV; parameter MAX_VAL = 31250; reg [32-1:0] CNTVAL; reg OV; always @ (posedge CLK) begin if(CNTVAL >= MAX_VAL) CNTVAL <= 0; else CNTVAL <= CNTVAL + 1'b1; end always @ (CNTVAL) begin if(CNTVAL == MAX_VAL) OV = 1'b1; else OV = 1'b0; end endmodule

方波发生器RTL图

Verilog HDL代码

module squWave4( input clk, output reg wave); reg [3:0] count; always @ (posedge clk) begin if(count == 15) begin count <= 0; end else if(count <= 3) begin count <=count + 1'b1; wave <= 1'b1; end else if(count < 15) begin count <=count + 1'b1; wave <= 0; end end endmodule

Signaltap的分段触发捕获

Sample depth选256,选32 8 Sample segments

题目2-3 :PWM的创意发挥

一个计数器从0-9循环计数,不同的数值的亮度不同,0最暗,9最亮

设计思路:电路应由4部分构成 第一部分,秒脉冲生成器,输出秒脉冲信号,每秒输出1个CLK周期的高电平,用于后级电路的工作使能。 第二部分,0-9多周期计数器,每个工作使能有效的CLK周期,进行一次计数动作。 第三部分,可控制占空比的方波发生器,根据计数值,调节输出波形的占空比 第四部分,带使能的4-7译码器,不同占空比的方波作为使能信号,把0-9计数器的计数值,译码成HEX LED 的显示逻辑值

设计原理图

秒脉冲生成器和0-9多周期计数器与题目2-1原理相同。

可控制占空比的方波发生器RTL图

Verilog HDL代码

module squWave( input clk, input [3:0] max, output reg wave); reg [3:0] count; always @ (posedge clk) begin if(count == 9) begin count <= 0; end else if(count <= max) begin count <=count + 1'b1; wave <= 1'b1; end else if(count < 9) begin count <=count + 1'b1; wave <= 0; end end endmodule

带使能的4-7译码器RTL图

Verilog HDL代码

module dec47 (data_in ,data_out ,en); input [3:0] data_in ; input en; output [6:0] data_out ; reg [6:0] data_out ; always @(data_in or en) begin data_out = 7'b1111111; if(en)begin case (data_in ) 4'b0000: data_out = 7'b1000000; // 0 4'b0001: data_out = 7'b1111001; // 1 4'b0010: data_out = 7'b0100100; // 2 4'b0011: data_out = 7'b0110000; // 3 4'b0100: data_out = 7'b0011001; // 4 4'b0101: data_out = 7'b0010010; // 5 4'b0110: data_out = 7'b0000011; // 6 4'b0111: data_out = 7'b1111000; // 7 4'b1000: data_out = 7'b0000000; // 8 4'b1001: data_out = 7'b0011000; // 9 4'b1010: data_out = 7'b0001000; // A 4'b1011: data_out = 7'b0000011; // b 4'b1100: data_out = 7'b0100111; // c 4'b1101: data_out = 7'b0100001; // d 4'b1110: data_out = 7'b0000110; // E 4'b1111: data_out = 7'b0001110; // F default: data_out = 7'b1111111; endcase end else data_out = 7'b1111111; end endmodule
转载请注明原文地址: https://www.6miu.com/read-59830.html

最新回复(0)