|
楼主 |
发表于 2013-5-22 23:02:06
|
显示全部楼层
本帖最后由 yong19891101 于 2013-5-22 23:08 编辑
回复 2# ivor_kandy
我是这样做的 ,先给一个启动脉冲pulse,启动en1信号从rMEM读出第一个数x后,先判断x是否大于1,如大于1,则把x-1送入k_down计数器,如等于1,则马上启动en1信号 读出rMEM下一个数
k_down计数器的输出k_out等于1时启动en1信号
en2信号基本就是en1的取反了。
以下是代码:
module sample1(clk,set,en1,en2,ena,pulse,r_up,d_down,r_out,k_out,addrb,wea,addra,dina
);
input clk,set,wea,pulse,ena;
input[6:0]addra,dina;
output [6:0]r_up,d_down,addrb,r_out(存储器输出),k_out;
output en1,en2,r_ready,down_en,up_en;
reg [6:0]r_up,d_down,addrb,k_out;
//counter_r_up
always@(posedge clk)
begin
if(set) begin
r_up<=0;
end
else if(en1==1)
begin
r_up<=r_up+1;
end
end
//counter_d_down
always@(posedge clk)
begin
if(set)
begin
d_down<=7'd127;
end
else if(en2==1)
begin
d_down<=d_down-1;
end
end
//选择器
always@(posedge clk)
begin
if(set)
begin
addrb<=0;
end
else if(en2==1)
begin
addrb<=d_down;
end
else
begin
addrb<=r_up;
end
end
//en1和en2信号赋值
assign en1=((r_out==1)||pulse||(k_out==1))?1:0;
assign en2=(r_out>1)&&(k_out!==1)&&(!pulse);
//counter_k_down #######感觉这部分有问题
always@(posedge clk)
begin
if(set)
begin
k_out<=0;
end
else if(en1==1)
begin
k_out<=r_out-1;
end
else if(en2==1)
begin
k_out<=k_out-1;
end
end
//rMEM 存储器例化
rMEM MYrMEM (
.clka(clk), // input clka
.ena(ena), // input ena
.wea(wea), // input [0 : 0] wea
.addra(addra), // input [6 : 0] addra
.dina(dina), // input [6 : 0] dina
.clkb(clk), // input c // input [6 : 0] addra
.rstb(set), // input rstb
.enb(en1), // input enb
.addrb(addrb), // input [6 : 0] addrb
.doutb(r_out) // output [6 : 0] doutb
);
endmodul
这里的en1、en2信号该用时序还是逻辑的??有些做成时序的可以延时 |
|