Verilog之Johnson计数器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
简介:本示例是带停止控制的双向4bit Johnson 计数器示例,可以通过LED灯直观的在开发板上进行演示。
sw2: 按键 sw2 控制向左移动
sw3: 按键 sw3 控制向右移动
sw1: 按键 sw1 第一次按下时将停止移动,再次按下时就会恢复移动
代码经过sp306板测试通过,且综合后0 error, 0warning。
代码如下:
module johnson(clk,rst_n,key1,key2,key3,led1,led2,led3,led4);
input clk;
input rst_n;
input key1,key2,key3;
output led1,led2,led3,led4;
//------------------------------------
reg[23:0] delay;
always @ (posedge clk or negedge rst_n)
if(!rst_n) delay <= 0;
else delay <= delay+1;
reg[2:0] key_value;
always @ (posedge clk or negedge rst_n)
if(!rst_n) key_value <= 3'b111;
else if(delay == 24'hffffff) key_value <= {key3,key2,key1}; //delay 20ms
//-------------------------------------
reg[2:0] key_value_r;
always @ (posedge clk or negedge rst_n)
if(!rst_n) key_value_r <= 3'b111;
else key_value_r <= key_value;
wire[2:0] key_change;
assign key_change = key_value_r & (~key_value); //check key_value negedge per clk
//------------------------------------
reg stop_start,left_right;
always @ (posedge clk or negedge rst_n)
if(!rst_n) begin
stop_start <= 1;
left_right <= 1;
end
else
if(key_change[2]) stop_start <= ~stop_start;
else if(key_change[1]) left_right <= 1;
else if(key_change[0]) left_right <= 0;
//-------------------------------------
reg[3:0] led_value_r;
always @ (posedge clk or negedge rst_n)
if(!rst_n) led_value_r <= 4'b1110;
else if(delay == 24'h3fffff && stop_start)
case (left_right)
1: led_value_r <= {led_value_r[2:0],led_value_r[3]};
0: led_value_r <= {led_value_r[0],led_value_r[3:1]};
default: ;
endcase
assign {led4,led2,led3,led1} = led_value_r;
endmodule
用户1805731 2015-8-25 14:47
用户428585 2012-12-14 19:05
用户425865 2012-9-13 22:15
用户1564910 2011-9-10 09:54
用户1623835 2011-9-3 11:08
zhanghaokm_428385128 2011-7-10 20:17
用户291975 2011-1-17 20:03
用户1643674 2010-12-25 14:12
用户1575790 2010-12-2 14:50
用户1397278 2010-11-3 21:26