求助 verilog 分频程序 ,望高手指点,急急急啊·~~~~谢谢啦
module dddd(clk_in,clr,key,L1,L2);input clk_in,key,clr;
output L1,L2;
reg L1,L2;
reg q;
reg state;
always @(posedge clk_in )
if(!clr)
begin
q=0;
L1=1;
L2=1;
state=1;
end
else
case(state)
1'b0:
begin
L1=0;
L2=1;
if(q<8'd40)
begin
if(led_ctrl)
state=1'b1;
else
q=q+1;
end
else
begin
q=0;
L1=~L1;
L2=~L2;
end
end
1'b1:
begin
L1=1;
L2=1;
q=0;
if(led_ctrl)
state=1'b0;
else
state=1'b1;
end
endcase
//------------------------------------------------------
reg cnt; //计数寄存器
always @ (posedge clk_in)
if (!clr) //异步复位
cnt <= 4'd0;
else
cnt <= cnt + 1'b1;
reg low_sw;
always @(posedge clk_in)
if (!clr)
low_sw <= 1'b1;
else if (cnt == 4'd10)//满20ms,将按键值锁存到寄存器low_sw中
low_sw <= key;
// ---------------------------------------------------------------------------
reg low_sw_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中
always @ ( posedge clk_in)
if (!clr)
low_sw_r <= 1'b1;
else
low_sw_r <= low_sw;
//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期
wireled_ctrl = low_sw_r & ( ~low_sw);
//---------------------------------------------------------------------
endmodule
键盘扫描参照网上的,为了看仿真波形循环写小了点
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_598913HYWF2N.png
设计要求是这样 (原文件名:QQ截图未命名.png)
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_598914YGDTX6.png
我程序得到的波形,跟要求的为什么不一样 (原文件名:QQ截图未命名是.png) 问题是 你想问什么??给你改错? …… 看了半天 觉得很乱
case(state)
1'b0:
begin
L1=0;
L2=1;
if(q<8'd40)
begin
if(led_ctrl)
state=1'b1;
else
q=q+1;
end
else
begin
q=0;
L1=~L1;
L2=~L2;
end
这有问题
你把 L1=0;L2=1;放在always 内部state=0时每次都重置,L1 L2刚刚取反还没等q自增至8'd40 又被重置 这就是为什么你的脉宽那么窄的原因 时间只有一个脉冲的间隔!
在led_ctrl置1时对于state=0和stae=1分别对应两种不同结果state=1'b0;和state=1'b0; 什么意思?互换??
我有点糊涂,程序怎么会这么复杂…… 在led_ctrl置1时对于state=0和stae=1分别对应两种不同结果state=1'b1;和state=1'b0;
页:
[1]