//这是参加国赛之前做的训练题,可能不完全符合题目要求,觉得有问题的朋友们欢迎评论区或者私信讨论
题目要求:
module elevator#(parameter floor = 40)( input clk, rst_n, input key, [7:0]H,[3:0]num, [9:0]weight, output reg [7:0]N, output alert ); endmoduletb:
module elevator_tb( ); reg clk, rst_n, key; reg [7:0]H; reg [3:0]num; reg [9:0]weight; wire [7:0]N; wire alert; elevator test( .clk(clk), .rst_n(rst_n), .key(key), .H(H), .num(num), .weight(weight), .N(N), .alert(alert) ); initial begin clk = 0; rst_n = 0; #15 rst_n = 1; forever #5 clk = ~clk; end initial begin key = 0; H = 0; num = 0; weight = 0; #20 H = 30; num = 1; weight = 50; #400 H = 8; #10 key = 1; @ (negedge clk) ;key = 0; #300 H = 12; num = 14; #20 num = 10; weight = 1001; #50 weight = 900; end endmodule(由于过了一个多月思路全忘了,等之后有空的时候再补上吧 //没人看就不补了)
总之最后代码是这样的
module elevator#(parameter floor = 40)( input clk, rst_n, input key, [7:0]H,[3:0]num, [9:0]weight, output reg [7:0]N, output reg alert ); reg key_in; reg [7:0]position; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin key_in=0; alert=0; end else if(num>4'd13||weight>10'd1000) begin alert=1; end else begin alert=0; end end always @(posedge key) begin key_in=1; end always @(posedge clk or negedge rst_n) begin if(!rst_n) begin N=8'b00000000; position=8'b00000000; end else if(key_in==0&&position!=H&&(H>9||H<2)) begin if(position<H) begin position=position+1; N=position; end else if(position>H) begin position=position-1; N=position; end end else if(key_in==1&&position!=H) begin if(position<H) begin position=position+1; N=position; end else if(position>H) begin position=position-1; N=position; end end end endmodule代码已经过仿真验证,应该是达到了题目要求的。