求verilog 8位串转并程序和测试程序,要求奇偶校验和数据头探测
刚开始学<br>有没有高手帮忙发个上来<br>
好学习学习~<a href='http://www.caijiqi.net/cms/taker/helpcenter/phpwind.jsp' target='_blank' title='网站数据采集'><img alt='网站数据采集' width='1' height='10' border='0' src='http://www.caijiqi.net/ad.gif'></a> 用一组移位寄存器每8位并行输出,如果串行数据流中已经包含校验位那就每9位并行输出一次. 我编的一个8位串并转换程序,可以奇偶校验,并且可以检测数据头和数据尾(都是3位的)。大伙看看,共同讨论一下优缺点!
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
);
//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;
reg data_out;
//internal signal description
reg set; //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
set<=0;
check_head<=0;
check_tail<=0;
end
else if(enable==1)
begin
check_head<={check_head,data_in};
check_tail<={check_tail,data_in};
if(check_head==data_head)
set<=1;
else if(check_tail==data_tail)
set<=0;
end
end
always@(posedge clk or negedge reset)
begin
if(!reset)
data_out<=0;
else if(enable==0)
begin
if(set<=1)
data_out<={data_out,data_in};
else
data_out<=0;
end
end
assign odd_bits=^data_out;
assign even_bits=~odd_bits;
endmodule 我是个新手,对楼上的程序发表下看法,不对之处还请指正。<br>
<br>
我认为程序在校验数据头和尾时(即下面的程序)有问题<br>
if(check_head==data_head)<br>
set<=1;<br>
else if(check_tail==data_tail)<br>
set<=0;<br>
<br>
数据为串行输入 ,data_head和data_tail应该是逐个接收到的数据,我建议这两个值从data_out中取出。<br>
然后与check_head和check_tail进行对比!<br> 原帖由 无尽星空 于 2006-9-4 19:13 发表<br>
if(check_head==data_head)<br>
set<=1;<br>
else if(check_tail==data_tai ... 在进行首尾检测时,使用了另外的寄存器,首检测和尾检测各3各(由于是三位),没有使用后来的data_out的积存器,这样可以在输出之前判断,有用数据就输出,否则并行输出为0。<br>
以上程序也只是我个人的设计,希望和大伙多多交流,互相学习。 不知这个测试程序怎么写<br>
刚开始学<br>
Harva朋友能否贴个上来<br>
万分感谢 不会吧,大哥自己写吧!<br>
论坛上又很多Verilog很好的资料,下来自己研究一下吧! 但是关于数据头检测的很少<br>
不知道测试代码怎么写...<br>
关于串并转换的代码我写了.. moduletes_czb;
reg tb_clk;
reg tb_reset;
reg tb_en;
wire tb_odd;
wire tb_even;
wire tb_out;
reg tb_in;
always #50 tb_clk<=~tb_clk;
initial
begin
tb_in<=1;
tb_clk<=0;
tb_reset<=1;
#90 tb_reset<=0;
tb_en<=1;
#90 tb_in<=1;
#90 tb_in<=0;
#90 tb_in<=0;
#90 tb_in<=1;
#90 tb_in<=0;
#90 tb_in<=1;
#90 tb_in<=0;
#90 tb_in<=1;
repeat(50)
begin
tb_reset<={$random}%2;
tb_en<={$random}%2;
#90tb_in<={$random}%2;
#90 tb_in<={$random}%2;
#90 tb_in<={$random}%2;
#90tb_in<={$random}%2;
#90 tb_in<={$random}%2;
#90 tb_in<={$random}%2;
#90 tb_in<={$random}%2;
#90 tb_in<={$random}%2;
end
end
serial_pal aa(.clk(tb_clk),.reset(tb_reset),.en(tb_en),.in(tb_in),.out(tb_out),.odd(tb_odd),.even(tb_even));
initial
begin
$monitor($time,,,"tb_en%b,tb_in%b,tb_out%b,tb_reset%b,tb_odd%b,tb_even%b",tb_en,tb_in,tb_out,tb_reset,tb_odd,tb_even);
end
endmodule
测试过了
不过初学这个,不知有无错误 zhaochenyu朋友的不能综合吧
页:
[1]
2