always @(a) //转化过程 begin case (a[3:0]) 3'b0000 : code_data [7:1] = 7'b0000000; 3'b0001 : code_data [7:1] = 7'b0000001; 3'b0010 : code_data [7:1] = 7'b0000010; 3'b0011 : code_data [7:1] = 7'b0000011; 3'b0100 : code_data [7:1] = 7'b0000100; 3'b0101 : code_data [7:1] = 7'b0001000; 3'b0110 : code_data [7:1] = 7'b0001001; 3'b0111 : code_data [7:1] = 7'b0001010; default : code_data [7:1] = 7'b0000000; endcase code_data[0] = a[0]; end
always@(c_tmp) begin case(c_tmp) 4'b0000: c=8'b1100_0000; 4'b0001: c=8'b1111_1001; 4'b0010: c=8'b1010_0100; 4'b0011: c=8'b1011_0000; 4'b0100: c=8'b1001_1001; 4'b0101: c=8'b1001_0010; 4'b0110: c=8'b1000_0010; 4'b0111: c=8'b1111_1000; 4'b1000: c=8'b1000_0000; 4'b1001: c=8'b1001_1000; 4'b1010: c=8'b1000_1000; 4'b1011: c=8'b1000_0011; 4'b1100: c=8'b1100_0110;
4'b1101: c=8'b1010_0001; 4'b1110: c=8'b1000_0110; 4'b1111: c=8'b1000_1110; endcase end
endmodule
分频1秒和0.5秒 //利用计数器分频
//利用分频计数器得到显示一秒和0.5的闪烁效果 //视频教程适合我们21EDA电子的所有学习板
module ledwater (clk_50M,led_out,f_led_out);
input clk_50M; //系统时钟输入50M output led_out; output f_led_out;
reg [24:0] count; //分频计数器,25000000分频 一秒 reg [24:0] f_count;//分频计数器,12500000分频 0.5秒 reg div_clk, f_div_clk; reg led_out, f_led_out;
//分频计数器。得到一秒的频率 always @ ( posedge clk_50M ) begin
if ( count==25000000 ) begin
div_clk<=~div_clk; count<=0; end else
count<=count+1; led_out<=~div_clk; end
//分频计数器。得到0.5秒的频率 always @ ( posedge clk_50M ) begin
if ( f_count==12500000 ) begin
f_div_clk<=~f_div_clk; f_count<=0; end else
f_count<=f_count+1;
f_led_out<=~f_div_clk; end
endmodule
简单状态机控制步进电机
//简单的状态机,利用状态机控制步进电机
//state0--state1--state2--state3--state4--state5--state6-state7--state0 //视频教程适合我们21EDA电子的所有学习板 module state_machine(clk,rst,c);
input clk,rst; //系统时钟50M输入 从12脚输入。 output [3:0] c; //输出控制步进电机 reg [3:0] c;
parameter state0=3'b000, state1=3'b001, state2=3'b010, state3=3'b011, state4=3'b100, state5=3'b101, state6=3'b110, state7=3'b111; reg[2:0] state; reg[23:0] cnt;
always@(posedge clk or negedge rst) begin if(!rst) begin state<=state0; cnt<=0; end else begin cnt<=cnt+1; if(cnt==24'hffffff) begin case(state) state0: state<=state1; state1: state<=state2; state2: state<=state3; state3: state<=state4; state4: state<=state5; state5: state<=state6; state6:
state<=state7; state7: state<=state0; endcase end end end
always@(state) begin case(state) state0: c=8'b0001; state1: c=8'b0100; state2: c=8'b0010; state3: c=8'b1000; state4: c=8'b0001; state5: c=8'b0100; state6: c=8'b0010; state7: c=8'b1000; endcase end
endmodule 矩阵键盘
矩阵键盘实验1:向用户介绍矩阵键盘扫描实现的方法,没有考虑去抖和判断键弹起的问题;把相应的键值显示在数码管上
module key1(clk,rst,row,column,dataout,en) input clk,rst;
input[3:0] column;//列线 output[3:0] row;//行线
output[7:0] dataout;//数码管显示数据 reg[7:0] dataout;
output[7:0] en;//数码管显示使能 reg[3:0] row;
reg[3:0] scan_key; //扫描码寄存器 reg[15:0] cnt_scan;//扫描频率计数器 assign en=0;
always@(posedge clk or negedge rst) begin if(!rst) begin row<=4'b1110; cnt_scan<=0; end else begin cnt_scan<=cnt_scan+1; if(cnt_scan==16'hffff) begin row[3:1]<=row[2:0];//没弄明白 row[0]<=row[3]; //4根行线循环送出低电平 end end end
always@(posedge clk or negedge rst) begin if(!rst) begin scan_key<=0; end else begin case(row) //该case结果检测何处有键按下 4'b1110: case(column) 4'b1110: begin scan_key<=0; end 4'b1101: begin scan_key<=1; end 4'b1011: begin scan_key<=2; end 4'b0111: begin scan_key<=3; end endcase 4'b1101: case(column) 4'b1110: begin scan_key<=4; end 4'b1101: begin scan_key<=5; end