利用按键,指示灯,数码管完成七人表决器实验,用七个按键表示七个人,(高电平表示同意,低电平表示反对,用一个指示灯表示表决结果,点亮表示通过,一位数码管表示票数,用verilog HDL写代码
时间: 2024-03-25 15:41:52 浏览: 158
以下是基于FPGA实现的七人表决器的Verilog HDL代码:
```verilog
module seven_person_voting_system(
input clk, //时钟
input rst, //复位
input [6:0] vote, //每个人的投票情况
output reg result, //表决结果
output reg [3:0] count //票数统计
);
reg [6:0] prev_vote; //上一轮投票情况
reg [3:0] prev_count; //上一轮票数统计
always @(posedge clk or negedge rst) begin
if(!rst) begin //复位
result <= 0;
count <= 0;
prev_vote <= 7'b0000000;
prev_count <= 0;
end else begin
prev_vote <= vote; //保存上一轮投票情况
prev_count <= count; //保存上一轮票数统计
count <= {4{1'b0}}; //票数清零
result <= 0; //表决结果初始化为未通过
for (integer i=0; i<7; i=i+1) begin
if (vote[i] == 1'b1) begin
count <= count + 1; //统计同意票数
end
end
if (count >= 4) begin
result <= 1; //通过表决
end
end
end
reg [6:0] vote_buffer; //按键缓存
reg [3:0] debounce_counter; //按键消抖计数器
always @(posedge clk or negedge rst) begin
if(!rst) begin //复位
vote_buffer <= 7'b0000000;
debounce_counter <= 0;
end else begin
if (debounce_counter == 4) begin //消抖完成
vote_buffer <= vote; //保存按键状态
debounce_counter <= 0; //计数器清零
end else begin
debounce_counter <= debounce_counter + 1; //消抖计数器加一
end
end
end
assign count = debounce_counter == 4 ? count : prev_count; //消抖期间票数暂停计数
assign result_led = result; //表决结果连接到指示灯
assign count_disp = debounce_counter == 4 ? count : prev_count; //消抖期间票数暂停显示
endmodule
```
本模块采用双时钟域设计,按键输入和消抖在时钟域1中实现,票数统计和表决结果在时钟域2中实现。在时钟域1中,我们使用一个按键缓存和一个按键消抖计数器来实现按键消抖。在时钟域2中,我们通过遍历投票情况,统计同意票数并判断是否通过表决,最终将表决结果连接到指示灯和票数显示到数码管上。
阅读全文