加了个计数器,仿真不好使了<br>
又找不到毛病<br>
高手进来帮帮忙<br>
module serial2pal(clk,reset,enable,data_in,data_head,odd_bits,even_bits,data_out);<br>
<br>
input clk;<br>
input reset;<br>
<br>
input enable;<br>
input data_in;<br>
input data_head;<br>
<br>
output odd_bits;<br>
output even_bits;<br>
output data_out;<br>
reg count;<br>
<br>
reg data_out;<br>
<br>
reg set; <br>
reg check_head; <br>
<br>
always@(posedge clk or negedge reset)<br>
begin<br>
if(!reset)<br>
begin<br>
count<=0; <br>
set<=0;<br>
check_head<=0;<br>
end<br>
else if(enable==1)<br>
begin<br>
check_head<={check_head,data_in};<br>
if(check_head==data_head)<br>
begin <br>
set<=1;<br>
count<=4'b0111;<br>
end<br>
else <br>
set<=0;<br>
end<br>
end<br>
<br>
always@(posedge clk or negedge reset)<br>
begin<br>
if(!reset)<br>
data_out<=0;<br>
else if(enable==0)<br>
begin<br>
if((set<=1)&&(count>=7))<br>
begin<br>
data_out<={data_out,data_in};<br>
count<=count+1;<br>
end<br>
else<br>
data_out<=8'bz;<br>
end<br>
end<br>
<br>
assign odd_bits=^data_out;<br>
assign even_bits=~odd_bits;<br>
<br>
endmodule<br>
<br>
[ 本帖最后由 zaochenyu 于 2006-9-6 12:38 编辑 ] 问题处在你的else if(enable==1)<br>
begin<br>
check_head<={check_head,data_in};<br>
if(check_head==data_head)<br>
begin <br>
set<=1;<br>
count<=4'b0111;<br>
end<br>
else <br>
set<=0;<br>
end<br>
中的else语句,由于check_head也是随输入变的,而你有没有积存set的值,也就是说<br>
在你的描述中set只是一个脉冲(宽度可能为1各clk周期),而不是你所希望的一直高电平,<br>
所以,应给去掉else set<=0;语句,对set的值进行锁存。 测试程序,不需要综合!测试程序,不需要综合!测试程序,不需要综合! 我觉得应该这样写:
`timescale 1ns / 1ps
module serial2pal(
//input
clk, //clock signal
reset, //reset signal
enable, //enable signal
data_in, //serial data in
data_head, //head of the useful data, used for head check
data_tail, //tail of the useful data, used for tail check
//output
odd_bits, //indicate the result of odd and even check
even_bits,
data_out,
check_head, //add
check_tail, //add
seta //add
);
//clock and reset signal description
input clk;
input reset;
//input signal description
input enable;
input data_in;
input data_head;
input data_tail;
//output description
output odd_bits;
output even_bits;
output data_out;
output check_head; //add
output check_tail; //add
output seta; //add
reg n;
reg data_out;
parameter temp_head=8'b11111111; //add
parameter temp_tail=8'b00000000; //add
//internal signal description
reg seta; //used to indicate whether we have got the data header.
reg check_head; //used to check the data_head
reg check_tail; //used to check the end of the useful data
always@(posedge clk or negedge reset)
begin
if(!reset)
begin
seta<=0;
check_head<=0;
check_tail<=0;
end
else
begin
check_head={check_head,data_in};
check_tail={check_tail,data_in};
if(check_head==temp_head)
seta<=1;
else if(check_tail==temp_tail)
seta<=0;
end
end
always@(posedge clk or negedge reset)
begin
if(!reset)
data_out<=0;
else
begin
if(n<=7)
begin //
if(seta==1)
begin
data_out<={data_out,data_in};
n=n+1;
end
else
n=0;
end
else
begin
n=0;
data_out=8'bx;
end
end
end
//assign odd_bits=^data_out;
//assign even_bits=~odd_bits;
endmodule 测试部分:
`timescale 1ns / 1ps
module test_v;
// Inputs
reg clk;
reg reset;
reg enable;
reg data_in;
reg data_head;
reg data_tail;
// Outputs
wire odd_bits;
wire even_bits;
wire data_out;
wire check_head;
wire check_tail;
wire seta;
parameter period =40 ;
// Instantiate the Unit Under Test (UUT)
serial2pal uut (
.clk(clk),
.reset(reset),
.enable(enable),
.data_in(data_in),
.data_head(data_head),
.data_tail(data_tail),
.odd_bits(odd_bits),
.even_bits(even_bits),
.data_out(data_out),
.check_head(check_head),
.check_tail(check_tail),
.seta(seta)
);
always #20 clk<=~clk;
initial
begin
reset=1;
data_in=0;
clk=0;
enable=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=1; //1
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0; //0
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=1; //1
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
#period data_in=0;
#period data_in=1;
end //后加的
endmodule
页:
1
[2]