Ich weiß nicht, ob das hierher gehört oder Stackoverflow. Ich nehme hier an, dass Verilog zwar wie Software aussieht, aber tatsächlich Hardwareverbindungen beschreibt?
Ich habe ein Spartan-3AN-Evaluierungsboard und versuche, eine einfache RS232-Port-Schnittstelle darauf zu implementieren, die ich nicht zum Laufen bringen kann. Ich bin ein erfahrener Softwareentwickler, aber neu bei Verilog und digitalem Design. Ich möchte vom Blinken einer einzelnen LED zum nächsten Schritt übergehen.
Ich habe versucht, es so zu implementieren - 1) Generieren Sie einen Taktimpuls "serclock" mit der Baudrate, also zu Beginn jedes Bits. 2) Implementieren Sie eine Zustandsmaschine, die, sobald ihr gesagt wird, dass sie mit der richtigen Geschwindigkeit durch die Zustände gehen soll. 3) Implementieren Sie eine Suche, um das richtige Datenbit abhängig von dem Zustand auszugeben, in dem sich 2) befindet.
Wenn es einen besseren Weg gibt, wäre ich für jede Hilfe dankbar. Ich würde jedoch erwarten, dass dies funktioniert, aber ich bekomme überhaupt nichts. Kann jemand etwas Dummes erkennen, das ich getan habe? Ich würde mich über jeden Rat freuen.
// Serial port demo program
//
// Assumptions: 50Mhz clock rate
module SerDemo(input clk, output ser);
// Start signal tells it to start sending bits
reg start;
//The bits of data to send
reg [7:0] data;
/////////////////////////////////////////////////////////////////////////////
// Serial port clock generator
// Generate a 9600 baud clock signal for the serial port by dividing the
// 50Mhz clock by 5208
reg [14:0] clockdiv;
// Count from 0..5207 then reset back to zero
always @(posedge clk)
begin
if (clockdiv == 5207)
clockdiv <= 0;
else
clockdiv <= clockdiv + 1;
end
// The serclock is a short pulse each time we are reset
wire serclock = (clockdiv == 0);
/////////////////////////////////////////////////////////////////////////////
// Serial port state machine
// Only start the state machine when "start" is set. Only advance to the
// next state when serclock is set.
reg [3:0] state;
always @(posedge clk)
begin
case (state)
4'b0000: if (start) state <= 4'b0001;
4'b0001: if (serclock) state <= 4'b0010; // Start bit
4'b0010: if (serclock) state <= 4'b0011; // Bit 0
4'b0011: if (serclock) state <= 4'b0100; // Bit 1
4'b0100: if (serclock) state <= 4'b0101; // Bit 2
4'b0101: if (serclock) state <= 4'b0110; // Bit 3
4'b0110: if (serclock) state <= 4'b0111; // Bit 4
4'b0111: if (serclock) state <= 4'b1000; // Bit 5
4'b1000: if (serclock) state <= 4'b1001; // Bit 6
4'b1001: if (serclock) state <= 4'b1010; // Bit 7
4'b1010: if (serclock) state <= 4'b0000; // Stop bit
default: state <= 4'b0000; // Undefined, skip to stop
endcase
end
///////////////////////////////////////////////////////////////////////////////
// Serial port data
// Ensure that the serial port has the correct data on it in each state
reg outbit;
always @(posedge clk)
begin
case (state)
4'b0000: outbit <= 1; // idle
4'b0001: outbit <= 0; // Start bit
4'b0010: outbit <= data[0]; // Bit 0
4'b0011: outbit <= data[1]; // Bit 1
4'b0100: outbit <= data[2]; // Bit 2
4'b0101: outbit <= data[3]; // Bit 3
4'b0110: outbit <= data[4]; // Bit 4
4'b0111: outbit <= data[5]; // Bit 5
4'b1000: outbit <= data[6]; // Bit 6
4'b1001: outbit <= data[7]; // Bit 7
4'b1010: outbit <= 0; // Stop bit
default: outbit <= 1; // Bad state output idle
endcase
end
// Output register to pin
assign ser = outbit;
///////////////////////////////////////////////////////////////////////////////
// Test by outputting a letter 'd'
always @(posedge clk)
begin
data = 100;
start = 1;
end
endmodule
Ich spreche kein Verilog, aber mir ist aufgefallen, dass Ihr Stopbit null ist, was 1 sein sollte. Lesen Sie den Port auf einem Oszilloskop oder auf einem UART? Im letzteren Fall erhalten Sie möglicherweise kein Zeichen, wenn es das Stoppbit nicht sieht.
Sie haben das System nicht auf einen bekannten Zustand zurückgesetzt .
Das heißt, ich nehme an, dass Sie dies tun, um Verilog zu lernen? Ansonsten gibt es viele frei verfügbare Kerne, die Sie im Internet finden können, die dies tun. :)
Als Beispiel:
// Count from 0..5207 then reset back to zero
always @(posedge clk)
begin
if (rst) begin
clockdiv <= 0;
end else begin
if (clockdiv == 5207)
clockdiv <= 0;
else
clockdiv <= clockdiv + 1;
end
end
John Burton
John Burton
stevenvh
John Burton
Das Photon
outbit
ein Schieberegister anstelle eines Mux verwenden könnten, um die Ressourcennutzung zu reduzieren.Das Photon
state
, wenn Sie den Test fürserclock
außerhalb der case-Anweisung verschieben, generieren Sie eine ordnungsgemäße Gated Clock und halten auch Ihrestart
Erkennung mit serclock synchronisiert. So wie es ist, können Sie ein Runt-Startbit generieren.Das Photon
John Burton
Das Photon
Das Photon
John Burton