一、将一个串行执行的C语言算法转化为单拍完成的并行可综合verilog
unsigned char cal_table_high_first(unsigned char value)
{
unsigned char i ;
unsigned char checksum = value ;
for (i=8;i>0;--i)
{
if (check_sum & 0x80)
{
check_sum = (check_sum<<1) ^ 0x31;
}
else
{
check_sum = (check_sum << 1);
}
}
return check_sum;
}
Verilog如下
module c2verilog(
input rst_n,
input clk,
input [7:0] value,
output reg [7:0] check_sum
);
//c程序在verilog中用函数(组合逻辑)实现
function [7:0] check(input [7:0] value);
reg [3:0] i;
begin
check=value;
for(i=8;i>0;i=i-1)
check=(check<<1)^({8{check[7]}}& 8'h31); //化简后的组合逻辑,也可不化简
end
endfunction
//时序逻辑调用函数,一个节拍完成
always@(posedge clk)
if(!rst_n)
check_sum<=0;
else
check_sum<=check(value);
endmodule
tb(sv)如下
class valuerand;
rand bit [7:0] value;
endclass
module tb( );
logic rst_n, clk;
logic [7:0] value, check_sum;
c2verilog c2verilog(rst_n, clk, value, check_sum);
initial
begin clk=0; forever #5 clk=~clk; end
valuerand p;
initial
begin rst_n=0; #30 rst_n=1;
p=new();
for(int i=0; i<30; i=i+1)
begin #10 assert(p.randomize());
value=p.value;
end
end
endmodule
二、设计一个序列信号发生器电路,能在CLK信号作用下周期性输出“0010110111”的序列信号
(相当于使用移位寄存器串行输出,左移或者右移均可)
Verilog如下
module creatseq (
input clk,
input rst_n,
output data
);
reg [9:0] seq;
//寄存器复位值为序列
//循环左移
always@(posedge clk)
if(!rst_n) seq<=10'b00_1011_0111;
else seq<={seq[8:0],seq[9]};
assign data=seq[9];
endmodule
tb(sv)
module creatseq (
input clk,
input rst_n,
output data
);
reg [9:0] seq;
always@(posedge clk)
if(!rst_n) seq<=10'b00_1011_0111;
else seq<={seq[8:0],seq[9]};
assign data=seq[9];
endmodule
原文参考https://blog.csdn.net/buzhiquxiang/article/details/106642189